用C语言实现火升空.docx
- 文档编号:26627047
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:12
- 大小:60.21KB
用C语言实现火升空.docx
《用C语言实现火升空.docx》由会员分享,可在线阅读,更多相关《用C语言实现火升空.docx(12页珍藏版)》请在冰豆网上搜索。
用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
#defineESC 0x1b /*ESC的ASCII码,十六进制数*/
voidInstallGraph(void); /*图形初始化函数的声明*/
voidDrawGun(void); /*画发射架函数的声明*/
voidDrawPlan(void); /*画火箭函数的声明*/
voidDrawStar(void); /*画星函数的声明*/
void*buf; /*全局变量,用于存储火箭的图像*/
intx0=300; /*以下是火箭的位置初始化参数*/
inty0=340;
intwidth1=5;/*对火箭上部的宽度定义*/
intwidth2=20;/*对火箭下部的宽度定义*/
intheight=25;/*对火箭的高度定义*/
inty1=8;
inty2=15;
inty3=23;
inty4=38;
main()
{
intsize;/*以下是定义几个变量*/
inti=0;
intkey;
intstation;
InstallGraph();/*图形初始化函数*/
setbkcolor(WHITE); /*设置背景颜色*/
cleardevice();/*清除屏幕的图形*/
setcolor(RED); /*设置字的颜色*/
outtextxy(80,100,"Ready!
!
!
...Now,anykeytoSETOFF!
!
!
");
/*在屏幕上输出字符*/
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!
!
!
PressESCtoquit");/*在屏幕上输出字符*/
if(key==ESC)
{
if(y0-height-3*width1-i>0)/*如果在发射过程中*/
{
cleardevice();/*再一次清除屏幕图形*/
outtextxy(100,100,"Failue.Whatdidyoudo?
");/*在屏幕上输出字符*/
outtextxy(130,300,"Pressanykeytoquit.");/*在屏幕上输出字符*/
getch();/*再从键盘上无回显的接收一个字符*/
}
}
}
while(key!
=ESC);
free(buf);/*释放已分配的块*/
closegraph();/*操作已经完成,关闭图形系统*/
return0; /*返回编辑界面*/
}
voidInstallGraph(void) /*图形初始化函数*/
{
intgrdriver=DETECT;/*以下是定义几个变量*/
intgrmode;
interrorcode;
char*errormsg;/*定义一个字符型指针,因为后面的语句所返回的是一个指针*/
initgraph(&grdriver,&grmode,"");/*初始化图形系统*/
errorcode=graphresult();/*返回最后一次不成功的图形操作的错误代码,并赋值*/
errormsg=grapherrormsg(errorcode);/*返回一个错误信息串的指针,并赋值*/
if(errorcode!
=grOk)
{
printf("Graphicserror:
%s\n",errormsg);/*输出错误的信息串*/
printf("Pressanykeytoexit.\n");/*输出退出返回编辑界面的条件*/
getch();/*从键盘上接收一个字符以返回*/
exit
(1);/*返回退出*/
}
}
voidDrawStar(void) /*画星函数*/
{
intseed=2000;/*以下是定义几个变量*/
inti;
intdotx;
intdoty,height;
intwidth;
intcolor;
intmaxcolor;
maxcolor=getmaxcolor();/*返回可以传给函数setcolor的最大颜色值,并赋值*/
width=getmaxx();/*返回屏幕的最大X坐标,并赋值*/
height=getmaxy();/*返回屏幕的最大Y坐标并赋值*/
srand(seed);/*初始化随机数发生器*/
i=0;
for(;i<1000;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);/*初始化随机数发生器*/
}
voidDrawGun() /*画发射架函数*/
{
intx0=300;/*以下是定义几个变量并赋值*/
inty0=430;
intheight=45;
intrx=20;
intry=5;
intrightx,righty;
intleftx;
intlefty;
intcentery1=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);/*画连接右斜线与居中线的两个内端点间的线段*/
}
voidDrawPlan(void) /*画火箭函数*/
{
intsize;/*定义一个变量*/
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("Noenoughmemory!
");
exit(0);/*退出*/
}
getimage(x0-width2,y0-height-3*width1,x0+width2,y0+y4,buf);
/*确定保存图像所需的存储区大小*/
}
六、设计结果说明:
▲设计优点:
本程序较巧妙的实现了从绘制到发射的过程。
设计时对各种操作的所需要的进程设计的比较全面。
▲设计不足:
本程序只能对火箭的“上”起作用,而对其“左右”的控制不起作用。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 实现 升空