c语言字符画火箭,用C语言实现火箭的升空
/计算机程序设计
----课程设计(C语言)
题目:用C语言实现火箭的升空
学院:
专业:
班级:
姓名:
指导教师:
设计日期:
一. 选题背景:
问题的提出:在科学技术高度发达的世界的今天,人类向太空的探索已经进入
了热门化阶段,伴随着我国航天事业的飞速发展,选择了此次程序的设计。
在此,用C语言编制的程序,实现了对火箭“升空”的“键盘”控制。
二.设计思路.
本程序是从画火箭架、星星、火箭以及发射火箭进行的完整过程。画火箭架是用了调
用函数DrawGun()函数,这其中是用了两个ellipse()函数画上面的完整椭圆以及下面的半
椭圆,然后分别用moveto()函数和lineto()函数进行移动画线点和执行画线过程。其中定
义的rightx ,righty ,leftx ,lefty以及centry1 ,rx ,ry ,变量对实现每个交叉点建的
连线提供了条件,然后用circle()函数对三条线的端点分别用函数画圆,就是用以上的方
法实现了画火箭发射架的过程;
画星星调用了Drawstar()函数,主要就是用srand()函数对每个象素进行随机分布以
及用random()函数和setcolor()函数对每一个象素进行颜色处理,再用circle()函数对
每一个象素进行了放大处理(在每一个象素上画一个小圆);
画火箭调用了DrawPlan()函数,主要是用ellipse()函数对火箭的顶部画椭圆,并再
次用moveto()函数和lineto()函数对火箭的外观轮廓进行画线处理,定义的
width1 ,width2 ,y0 ,y1 ,y2 ,y3 ,y4等变量对火箭的绘制的精确有了保障。其中用的
setcolor()函数设置了此画线的颜色,并用了setfillstyle()函数设置了岁火箭的闭合轮
廓天填充的模式和颜色,再用了floodfill()函数对火箭轮廓不同颜色的填充,当然这其
中也用了setfillstyle()函数的两次不同的应用。为使火箭的图象处于稳定的状态,当完
成画火箭后,又用了imagesize()函数返回了保存此图象所需要的字节数目,这对此次程
序是直关重要的了;
发射火箭是用了循环语句do-while结构,并用了putimage()函数用与移动火箭的图
象,方法是方法是用异或方式在屏幕上连续画出火箭的图像,每画一次,新图像和原来的
位置相差两个像素点。这个值越大,飞行速度越快。运行的退出是用了free()函数释放分
配的块,并用了closegraph()函数关闭了图形系统,除了以上主要的介绍外,此程序还用
了如outtextxy()函数(在指定的位置输出指定的内容,如“继续”,“返回”等所需要
的条件等),setbkco()lor函数(设置屏幕的颜色),InstallGraph()函1数(图形初始
化函数),getch()函数(从键盘无回显的接收一个字符,用于控制火箭的进程的“端口”),
等一系列的函数来设计此次程序。
三、主要解决问题的方法及技术关键
1.主要问题及解决方法
★ 火箭及火箭发射架的画法问题。因为火箭和火箭架都不是简单的如正方、长方
形等图形,而是由一些椭圆和圆形组织而成的复杂图形。这就对火箭以及火箭架的
画法提出了问题:如何画?解决的方法是用moveto()和lineto()函数来连接火箭
或火箭架的每一个交叉点(接点)。
★ 屏幕的美观问题,即程序中对星星的显示大小问题。此次程序如何用C语言来
更加现实化的显示星星?在这里有一个很巧妙的方法就是用circle()函数以每个
像素为圆心画一个小圆,这样做不仅美观,而且增加了现实性。
★ 火箭艰苦的移动问题。火箭虽然是比较圆满的画出,但移动火箭却遇到了困难,
如何移动?再这里,是用了do-while 结构以及putimage()函数,设置了每接收一
个字符前后的位图就相差几个像素点(本程序中相差2个像素点)。
★ 满天繁星的美丽天空如何制作?此程序中的解决方法是用一个for 循环结构
和random()函数对“天空”中的星星进行随机分布显示,这也是一种很巧妙的方法,
这样即成了满天繁星的美观场景。
2.技术关键
◆ 对火箭的移动技术。(do-while 以及 putimage()的应用)
◆
◆ 对火箭的位图的字节保存过程。 四:程序流程图
五.
#include /*下面是对程序中的某些函数做预定义*/
#include
#include
#include
#include
#define ESC 0x1b /*ESC的ASCII码,十六进制数*/
void InstallGraph(void); /*图形初始化函数的声明*/
void DrawGun(void); /*画发射架函数的声明*/
void DrawPlan(void); /*画火箭函数的声明*/
void DrawStar(void); /*画星函数的声明*/
void *buf; /*全局变量,用于存储火箭的图像*/
int x0=300; /*以下是火箭的位置初始化参数*/
int y0=340;
int width1=5; /*对火箭上部的宽度定义*/
int width2=20; /*对火箭下部的宽度定义*/
int height=25; /*对火箭的高度定义*/
int y1=8;
int y2=15;
int y3=23;
int y4=38;
main()
{
int size; /*以下是定义几个变量*/
int i=0;
int key;
int station;
InstallGraph(); /*图形初始化函数*/
setbkcolor(WHITE); /*设置背景颜色*/
cleardevice(); /*清除屏幕的图形*/
setcolor(RED); /*设置字的颜色*/
outtextxy(80,100,"Ready!!!...Now,any key to SET OFF !!!");
/*在屏幕上输出字符*/
DrawGun(); /*调用画火箭架函数*/
getch(); /*从键盘上无回显的接收一个字符*/
cleardevice(); /*再一次清除屏幕图形*/
setbkcolor(BLUE); /*再次设置屏幕颜色*/
DrawGun(); /*再一次调用画火箭架函数*/
DrawPlan(); /*调用画火箭函数*/
DrawStar(); /*调用画星星函数*/
setcolor(LIGHTRED); /*设置画线的颜色*/
do
{
putimage(x0-width2,y0-height-3*width1-i,buf,XOR_PUT);
/*主循环开始,用于移动火箭,方法是用异或方式在屏幕上连续画出火箭的图像,每画一次,新图像和原来的位置相差两个像素点。这个值越大,飞行速度越快*/
i+=2;
putimage(x0-width2,y0-height-3*width1-i,buf,XOR_PUT);
key=getch(); /*从键盘上无回显的接收一个字符,并赋值*/
if(y0-height-3*width1-i==0) /*如果火箭发射成功*/
outtextxy(60,100,"Successfully!!! Press ESC to quit"); /*在屏幕上输出字符*/
if (key==ESC)
{
if (y0-height-3*width1-i>0) /*如果在发射过程中*/
{
cleardevice(); /*再一次清除屏幕图形*/
outtextxy(100,100,"Failue. What did you do?"); /*在屏幕上输出字符*/
outtextxy(130,300,"Press any key to quit."); /*在屏幕上输出字符*/
getch(); /*再从键盘上无回显的接收一个字符*/
}
}
}
while(key!=ESC);
free(buf); /*释放已分配的块*/
closegraph(); /*操作已经完成,关闭图形系统*/
return 0; /*返回编辑界面*/
}
void InstallGraph(void) /*图形初始化函数*/
{
int grdriver=DETECT; /*以下是定义几个变量*/
int grmode;
int errorcode;
char *errormsg; /*定义一个字符型指针,因为后面的语句所返回的是一个指针*/
initgraph(&grdriver,&grmode," "); /*初始化图形系统*/
errorcode=graphresult(); /*返回最
后一次不成功的图形操作的错误代码,并赋值*/ errormsg=grapherrormsg(errorcode); /*返回一个错误信息串的指针,并赋值*/
if(errorcode!=grOk)
{
printf("Graphics error: %s\n",errormsg); /*输出错误的信息串*/
printf("Press any key to exit.\n"); /*输出退出返回编辑界面的条件*/
getch(); /*从键盘上接收一个字符以返回*/
exit(1); /*返回退出*/
}
}
void DrawStar(void) /*画星函数*/
{
int seed=2000; /*以下是定义几个变量*/
int i;
int dotx;
int doty,height;
int width;
int color;
int maxcolor;
maxcolor=getmaxcolor(); /*返回可以传给函数setcolor的最大颜色值,并赋值*/ width=getmaxx(); /*返回屏幕的最大X坐标,并赋值*/
height=getmaxy(); /*返回屏幕的最大Y 坐标并赋值*/
srand(seed);/*初始化随机数发生器*/
i=0;
for(;i
{
dotx=i+random(width-1); /*以下是生成随机的点*/
doty=i+random(height-1);
color=random(maxcolor);
setcolor(color); /*设置当前画线颜色*/
putpixel(dotx,doty,color); /*在指定的位置化一像素*/
circle(dotx+1,doty+1,1); /*在给定的点画圆*/
}
srand(seed); /*初始化随机数发生器*/
}
void DrawGun() /*画发射架函数*/
{
int x0=300; /*以下是定义几个变量并赋值*/
int y0=430;
int height=45;
int rx=20;
int ry=5;
int rightx,righty;
int leftx;
int lefty;
int centery1=30;
rightx=righty=leftx=lefty=12;
setcolor(WHITE); /*设置当前画线颜色*/
ellipse(x0,y0,180,360,rx,ry); /*在指定位置画一个半椭圆*/
ellipse(x0,y0-height,0,360,rx,ry); /*在指定位置画一椭圆*/
line(x0+rx,y0,x0+rx,y0-height); /*以下是画发射架每条线的过程,画火箭架右侧竖线*/
line(x0-rx,y0,x0-rx,y0-height); /*画火箭架左侧竖线*/
moveto(x0+rx,y0); /*移动初始点到右侧竖线下端点*/
lineto(x0+rx+rightx,y0+righty); /*画右侧斜线上部分*/
moveto(x0+rx+rightx,y0+righty); /*移动初始点到右侧斜线上部分下端点*/ lineto(x0+rx+rightx+10,y0+righty+10); /*画右侧斜线的下部分*/
circle(x0+rx+rightx+10,y0+righty+10,4); /*在右侧斜线下部分下端点画圆*/ moveto(x0,y0+ry); /*移动初始点到下半椭圆线的中点*/
lineto(x0,y0+centery1); /*画从下半椭圆线中点开始向下的线的上部分*/ moveto(x0,y0+centery1); /*移动初始点到以上画线的下端点*/
lineto(x0,y0+centery1+10); /*画以上点向下的下部分的线段*/
circle(x0,y0+centery1+10,4); /*在以上画线段的下端点画圆*/
moveto(x0-rx,y0); /*移动初始点到下半椭圆最左侧点*/
lineto(x0-rx-leftx,y0+lefty); /*画左斜线的上部分线段*/
moveto(x0-rx-leftx,y0+lefty); /*移动初始点到以上画线段的下端点*/
lineto(x0-rx-leftx-10,y0+lefty+10); /*画左斜线的下部分*/
circle(x0-rx-leftx-10,y0+lefty+10,4); /*在左斜线下端点画一个圆*/
line(x0-rx-leftx,y0+lefty,x0,y0+centery1); /*画连接左斜线与居中线的两个内端点间的线段*/
line(x0,y0+centery1,x0+rx+rightx,y0+righty); /* 画连接右斜线与居中线的两个内端点间的线段*/
}
void DrawPlan(void) /*画火箭函数*/
{
int size; /*定义一个变量*/
setcolor(LIGHTRED); /*设置当前画线颜色*/
setfillstyle(1,BLUE); /*设置填充模式和颜色*/
ellipse(x0,y0-height,0,180,width1,3*width1); /*在指定位置画一椭圆*/ moveto(x0+width1,y0); /*移动初始点到火箭张部右侧竖线的下端点*/
lineto(x0+width1,y0-height) ; /*画右侧连接半椭圆与以上点间的线段*/ moveto(x0+width1,y0); /*移动初始点到火箭上部右侧竖线的下端点*/ lineto(x0+width2,y0+y2) ; /*画火箭尾部右侧的上层斜线*/
moveto(x0-width1,y0); /*移动初始点到火箭上部左侧竖线的下端点*/ lineto(x0-width1,y0-height); /*画左侧连接半椭圆与以上点间的线段*/ moveto(x0-width1,y0); /*移动初始点到火箭上部左侧竖线的下端点*/ lineto(x0-width2,y0+y2); /*画火箭尾部左侧的上层斜线*/
moveto(x0+width2,y0+y3); /*移动初始点到火箭尾部最右侧线段下端点*/ lineto(x0+width2,y0+y1); /*画由以上端点竖直向上的线段*/
moveto(x0+width2,y0+y3); /*移动初始点到火箭尾部最右侧线段下端点*/ lineto(x0+width1,y0+y2); /*画火箭尾部右侧的下层斜线*/
moveto(x0-width2,y0+y3); /*移动初始点到火箭尾部最左侧线段下端点*/ lineto(x0-width2,y0+y1); /*画由以上线段竖直向上的线段*/
moveto(x0-width2,y0+y3); /*移动初始点到火箭尾部最左侧线段下端点*/ lineto(x0-width1,y0+y2); /*画火箭尾部左侧的下层斜线*/
moveto(x0,y0+y4); /*移动初始点到火箭的最下端点*/
lineto(x0+width1,y0+y2); /*画由以上端点到右侧下层斜线上端点间的线段*/ moveto(x0,y0+y4); /*移动初始点到火箭的最下端点*/
lineto(x0-width1,y0+y2); /* 画由以上端点到左侧下层斜线上端点间的线段*/ setfillstyle(2,WHITE); /*设置填充模式和颜色*/
floodfill(x0,y0,LIGHTRED); /*填充一个有界区域*/
size=imagesize(x0-width2-1,y0-height-3*width1,x0+width2+1,y0+y4); /*返回保存位图像所需的字节数*/
buf=malloc(size); /*从堆中分配大小为size字节的块*/
if(!buf)
{
printf("No enough memory!");
exit(0); /*退出*/
}
getimage(x0-width2,y0-height-3*width1,x0+width2,y0+y4,buf);
/*确定保存图像所需的存储区大小*/
}
六、设计结果说明: /*如果火箭图象没有生成*/
▲ 设计优点:本程序较巧妙的实现了从绘制到发射的过程。设计时对各种操作的所需要的进程设计的比较全面。
▲ 设计不足:本程序只能对火箭的“上”起作用,而对其“左右”的控制不起作用。
c语言字符画火箭,用C语言实现火箭的升空相关推荐
- c语言字符画火箭,C语言字符画-字符闪画
C语言字符画-字符闪画 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该文档所得收入 ...
- c语言中时间字符化,C语言字符画,字符闪画.doc
C语言字符画,字符闪画.doc (32页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.90 积分 星星图#include #include #de ...
- c语言小狗字符画,C语言字符画字符闪画.docx
C语言字符画字符闪画.docx .星星图include stdio.hinclude math.hdefine x powfabsi-25.0,2.0/3define y powfabsj/2.0-2 ...
- c语言字符数组赋值超过,C语言字符数组赋值
C语言字符数组赋值教程 C语言字符数组赋值详解 语法 arr[index] = value; 参数 参数 描述 arr 数组名. index 需要赋值的下标索引. value 需要设置的值. 说明 给 ...
- c语言字符型常量计算,c语言字符型常量和变量.doc
c语言字符型常量和变量 谅娄协逞妥唐氦错赵夏教灶技竞白量菲荚锚坤缆咕囤厢失随着牲淋我雾谋蹬格椭金佃贮官梳冕萨鱼疥卫答襟回咬逢砾摘宛嵌拎宛拽抱钢簧彩城挛霉门窗莉辉托罚椽建呛液汛炕午望延晒纠挺谱阔衔解抗贱 ...
- c语言字符型数据是,C语言字符型数据.doc
C语言字符型数据 2.5.1字符常量字符常量是指用一对单引号括起来的一个字符.如'a','9','!'.字符常量中的单引号只起定界作用并不表示字符本身.单引号中的字符不能是单引号(')和反斜杠(\), ...
- c语言字符型输入格式化,c语言之字符串和格式化输入输出
字符串和格式化输入输出 #include #include #define DENSITY 62.4 int main(void) { float weight, volume; int size, ...
- c语言字符函数isalpha,总结C语言字符检测函数:isalnum、isalpha...
前言:最近一直在刷leetcode的题,用到isalnum函数,用man手册查找了一下,总共有13个相关函数如下: #include int isalnum(int c); int isalpha(i ...
- c语言用字符画一个椭圆,c语言,绘制椭圆并使其旋转.doc
c语言,绘制椭圆并使其旋转 设计题目:绘制椭圆并使其旋转. 计算机程序训练题目及要求 目录 一.训练目的-------------------2 二.设计要求-------------------2 ...
最新文章
- shell无上传cmd等exe文件权限解决办法
- 电商仓储管理水平的五大标准
- 【LiveVideoStack采访】李备:音视频技术的难点与未来
- rabbitmq python_Python操作RabbitMQ服务器实现消息队列的路由功能
- 盘点程序员必备的专业术语,值得看一看
- 前端学习(1532):项目1---项目功能展示
- 初探Backbone
- 使用循环链表实现一个通讯录的管理程序_【LeetCode链表题型总结】
- python输入10个数字排序案例_介绍十个Python小案例,新手入门就在这里
- 多线程之同步synchronized的使用不当造成java.lang.IllegalMonitorStateException 异常
- typec扩展坞hdmi没反应_HDMI+两个USB接口,让surface秒变办公神器?这个扩展坞真香...
- 51nod 1022 石子归并 V2(四边形不等式)
- 使用 Java 编写 Apache APISIX 插件
- 全国计算机等级考试怎么卸载,教你三种方法卸载Windows7SP1Beta
- 3月16日—3月20日四年级课程表
- 对于Linux内核tty设备的一点理解 【转】
- 网络基础知识 — 设备
- 安卓 类微信开发(二)
- 共享手机 馅饼还是陷阱
- 奥格斯堡大学计算机系,奥格斯堡大学
热门文章
- ZvulDrill靶场
- Java-计算器模拟程序
- 驱动编程,点亮LED小灯
- qme---模拟安装arm--debian安装到开发板
- pmp直方图与帕累托图的区别_PMP中容易混淆的20个图表工具总结
- UnicodeEncodeError: 'gbk' codec can't encode character '\U0001f914' in position ....
- c语言实验7字符串,C语言实验六(第七章二维数组字符串数组)
- 自然语言处理:词性标注
- .com域名再次涨价
- 虚拟主机评测网php源码 php,php项目布置到虚拟主机怎么样?虚拟主机后台源码测评...