收藏 分销(赏)

用C语言实现火箭的升空.doc

上传人:仙人****88 文档编号:11398054 上传时间:2025-07-21 格式:DOC 页数:10 大小:66.54KB 下载积分:10 金币
下载 相关
用C语言实现火箭的升空.doc_第1页
第1页 / 共10页
用C语言实现火箭的升空.doc_第2页
第2页 / 共10页


点击查看更多>>
资源描述
/计算机程序设计 ----课程设计(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()的应用) ◆ 对火箭的位图的字节保存过程。 ◆ 四:程序流程图 定义、赋值、包含的头文件、函数声明. 进入主函数,定义调用库函数。 If条件语句判断断断 为假时调用画火箭架函数DrawGun()。 为真退出 调用画火箭函数DrawPlan(). 调用画星星函数DrawStar(). If条件句判断字节数与内存的大小关系 为真,退出 为假,保存到主页中 当输入字符不为ESC时,If条件句判断:发射完毕时 用do-while结构及putimage()函数移动火箭 当输入字符为ESC时,循环一次。 用free()函数释放单元,用CloseGraph()函数关闭图形系统,退出运行过程。 五.程序清单: #include <graphics.h> /*下面是对程序中的某些函数做预定义*/ #include<conio.h> #include<stdio.h> #include<stdlib.h> #include<alloc.h> #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<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); /*初始化随机数发生器*/ } 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); /*确定保存图像所需的存储区大小*/ } 六、设计结果说明: ▲ 设计优点:本程序较巧妙的实现了从绘制到发射的过程。设计时对各种操作的所需要的进程设计的比较全面。 ▲ 设计不足:本程序只能对火箭的“上”起作用,而对其“左右”的控制不起作用。
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 通信科技 > 开发语言

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服