- 相關(guān)推薦
用C語言實現(xiàn)火箭的升空
/計算機(jī)程序設(shè)計
----課程設(shè)計(C語言)
題目:用C語言實現(xiàn)火箭的升空
學(xué)院:
專業(yè):
班級:
姓名:
指導(dǎo)教師:
設(shè)計日期:
一. 選題背景:
問題的提出:在科學(xué)技術(shù)高度發(fā)達(dá)的世界的今天,人類向太空的探索已經(jīng)進(jìn)入
了熱門化階段,伴隨著我國航天事業(yè)的飛速發(fā)展,選擇了此次程序的設(shè)計。
在此,用C語言編制的程序,實現(xiàn)了對火箭“升空”的“鍵盤”控制。
二.設(shè)計思路.
本程序是從畫火箭架、星星、火箭以及發(fā)射火箭進(jìn)行的完整過程。畫火箭架是用了調(diào)
用函數(shù)DrawGun()函數(shù),這其中是用了兩個ellipse()函數(shù)畫上面的完整橢圓以及下面的半
橢圓,然后分別用moveto()函數(shù)和lineto()函數(shù)進(jìn)行移動畫線點和執(zhí)行畫線過程。其中定
義的rightx ,righty ,leftx ,lefty以及centry1 ,rx ,ry ,變量對實現(xiàn)每個交叉點建的
連線提供了條件,然后用circle()函數(shù)對三條線的端點分別用函數(shù)畫圓,就是用以上的方
法實現(xiàn)了畫火箭發(fā)射架的過程;
畫星星調(diào)用了Drawstar()函數(shù),主要就是用srand()函數(shù)對每個象素進(jìn)行隨機(jī)分布以
及用random()函數(shù)和setcolor()函數(shù)對每一個象素進(jìn)行顏色處理,再用circle()函數(shù)對
每一個象素進(jìn)行了放大處理(在每一個象素上畫一個小圓);
畫火箭調(diào)用了DrawPlan()函數(shù),主要是用ellipse()函數(shù)對火箭的頂部畫橢圓,并再
次用moveto()函數(shù)和lineto()函數(shù)對火箭的外觀輪廓進(jìn)行畫線處理,定義的
width1 ,width2 ,y0 ,y1 ,y2 ,y3 ,y4等變量對火箭的繪制的精確有了保障。其中用的
setcolor()函數(shù)設(shè)置了此畫線的顏色,并用了setfillstyle()函數(shù)設(shè)置了歲火箭的閉合輪
廓天填充的模式和顏色,再用了floodfill()函數(shù)對火箭輪廓不同顏色的填充,當(dāng)然這其
中也用了setfillstyle()函數(shù)的兩次不同的應(yīng)用。為使火箭的圖象處于穩(wěn)定的狀態(tài),當(dāng)完
成畫火箭后,又用了imagesize()函數(shù)返回了保存此圖象所需要的字節(jié)數(shù)目,這對此次程
序是直關(guān)重要的了;
發(fā)射火箭是用了循環(huán)語句do-while結(jié)構(gòu),并用了putimage()函數(shù)用與移動火箭的圖
象,方法是方法是用異或方式在屏幕上連續(xù)畫出火箭的圖像,每畫一次,新圖像和原來的
位置相差兩個像素點。這個值越大,飛行速度越快。運行的退出是用了free()函數(shù)釋放分
配的塊,并用了closegraph()函數(shù)關(guān)閉了圖形系統(tǒng),除了以上主要的介紹外,此程序還用
了如outtextxy()函數(shù)(在指定的位置輸出指定的內(nèi)容,如“繼續(xù)”,“返回”等所需要
的條件等),setbkco()lor函數(shù)(設(shè)置屏幕的顏色),InstallGraph()函1數(shù)(圖形初始
化函數(shù)),getch()函數(shù)(從鍵盤無回顯的接收一個字符,用于控制火箭的進(jìn)程的“端口”),
等一系列的函數(shù)來設(shè)計此次程序。
三、主要解決問題的方法及技術(shù)關(guān)鍵
1.主要問題及解決方法
★ 火箭及火箭發(fā)射架的畫法問題。因為火箭和火箭架都不是簡單的如正方、長方
形等圖形,而是由一些橢圓和圓形組織而成的復(fù)雜圖形。這就對火箭以及火箭架的
畫法提出了問題:如何畫?解決的方法是用moveto()和lineto()函數(shù)來連接火箭
或火箭架的每一個交叉點(接點)。
★ 屏幕的美觀問題,即程序中對星星的顯示大小問題。此次程序如何用C語言來
更加現(xiàn)實化的顯示星星?在這里有一個很巧妙的方法就是用circle()函數(shù)以每個
像素為圓心畫一個小圓,這樣做不僅美觀,而且增加了現(xiàn)實性。
★ 火箭艱苦的移動問題;鸺m然是比較圓滿的畫出,但移動火箭卻遇到了困難,
如何移動?再這里,是用了do-while 結(jié)構(gòu)以及putimage()函數(shù),設(shè)置了每接收一
個字符前后的位圖就相差幾個像素點(本程序中相差2個像素點)。
★ 滿天繁星的美麗天空如何制作?此程序中的解決方法是用一個for 循環(huán)結(jié)構(gòu)
和random()函數(shù)對“天空”中的星星進(jìn)行隨機(jī)分布顯示,這也是一種很巧妙的方法,
這樣即成了滿天繁星的美觀場景。
2.技術(shù)關(guān)鍵
◆ 對火箭的移動技術(shù)。(do-while 以及 putimage()的應(yīng)用)
◆
◆ 對火箭的位圖的字節(jié)保存過程。 四:程序流程圖
五.
#include /*下面是對程序中的某些函數(shù)做預(yù)定義*/
#include
#include
#include
#include
#define ESC 0x1b /*ESC的ASCII碼,十六進(jìn)制數(shù)*/
void InstallGraph(void); /*圖形初始化函數(shù)的聲明*/
void DrawGun(void); /*畫發(fā)射架函數(shù)的聲明*/
void DrawPlan(void); /*畫火箭函數(shù)的聲明*/
void DrawStar(void); /*畫星函數(shù)的聲明*/
void *buf; /*全局變量,用于存儲火箭的圖像*/
int x0=300; /*以下是火箭的位置初始化參數(shù)*/
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(); /*圖形初始化函數(shù)*/
setbkcolor(WHITE); /*設(shè)置背景顏色*/
cleardevice(); /*清除屏幕的圖形*/
setcolor(RED); /*設(shè)置字的顏色*/
outtextxy(80,100,"Ready!!!...Now,any key to SET OFF !!!");
/*在屏幕上輸出字符*/
DrawGun(); /*調(diào)用畫火箭架函數(shù)*/
getch(); /*從鍵盤上無回顯的接收一個字符*/
cleardevice(); /*再一次清除屏幕圖形*/
setbkcolor(BLUE); /*再次設(shè)置屏幕顏色*/
DrawGun(); /*再一次調(diào)用畫火箭架函數(shù)*/
DrawPlan(); /*調(diào)用畫火箭函數(shù)*/
DrawStar(); /*調(diào)用畫星星函數(shù)*/
setcolor(LIGHTRED); /*設(shè)置畫線的顏色*/
do
{
putimage(x0-width2,y0-height-3*width1-i,buf,XOR_PUT);
/*主循環(huán)開始,用于移動火箭,方法是用異或方式在屏幕上連續(xù)畫出火箭的圖像,每畫一次,新圖像和原來的位置相差兩個像素點。這個值越大,飛行速度越快*/
i+=2;
putimage(x0-width2,y0-height-3*width1-i,buf,XOR_PUT);
key=getch(); /*從鍵盤上無回顯的接收一個字符,并賦值*/
if(y0-height-3*width1-i==0) /*如果火箭發(fā)射成功*/
outtextxy(60,100,"Successfully!!! Press ESC to quit"); /*在屏幕上輸出字符*/
if (key==ESC)
{
if (y0-height-3*width1-i>0) /*如果在發(fā)射過程中*/
{
cleardevice(); /*再一次清除屏幕圖形*/
outtextxy(100,100,"Failue. What did you do?"); /*在屏幕上輸出字符*/
outtextxy(130,300,"Press any key to quit."); /*在屏幕上輸出字符*/
getch(); /*再從鍵盤上無回顯的接收一個字符*/
}
}
}
while(key!=ESC);
free(buf); /*釋放已分配的塊*/
closegraph(); /*操作已經(jīng)完成,關(guān)閉圖形系統(tǒng)*/
return 0; /*返回編輯界面*/
}
void InstallGraph(void) /*圖形初始化函數(shù)*/
{
int grdriver=DETECT; /*以下是定義幾個變量*/
int grmode;
int errorcode;
char *errormsg; /*定義一個字符型指針,因為后面的語句所返回的是一個指針*/
initgraph(&grdriver,&grmode," "); /*初始化圖形系統(tǒng)*/
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) /*畫星函數(shù)*/
{
int seed=2000; /*以下是定義幾個變量*/
int i;
int dotx;
int doty,http://www.msguai.com/news/55A9D0018FF7F9CA.htmlheight;
int width;
int color;
int maxcolor;
maxcolor=getmaxcolor(); /*返回可以傳給函數(shù)setcolor的最大顏色值,并賦值*/ width=getmaxx(); /*返回屏幕的最大X坐標(biāo),并賦值*/
height=getmaxy(); /*返回屏幕的最大Y 坐標(biāo)并賦值*/
srand(seed);/*初始化隨機(jī)數(shù)發(fā)生器*/
i=0;
for(;i
{
dotx=i+random(width-1); /*以下是生成隨機(jī)的點*/
doty=i+random(height-1);
color=random(maxcolor);
setcolor(color); /*設(shè)置當(dāng)前畫線顏色*/
putpixel(dotx,doty,color); /*在指定的位置化一像素*/
circle(dotx+1,doty+1,1); /*在給定的點畫圓*/
}
srand(seed); /*初始化隨機(jī)數(shù)發(fā)生器*/
}
void DrawGun() /*畫發(fā)射架函數(shù)*/
{
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); /*設(shè)置當(dāng)前畫線顏色*/
ellipse(x0,y0,180,360,rx,ry); /*在指定位置畫一個半橢圓*/
ellipse(x0,y0-height,0,360,rx,ry); /*在指定位置畫一橢圓*/
line(x0+rx,y0,x0+rx,y0-height); /*以下是畫發(fā)射架每條線的過程,畫火箭架右側(cè)豎線*/
line(x0-rx,y0,x0-rx,y0-height); /*畫火箭架左側(cè)豎線*/
moveto(x0+rx,y0); /*移動初始點到右側(cè)豎線下端點*/
lineto(x0+rx+rightx,y0+righty); /*畫右側(cè)斜線上部分*/
moveto(x0+rx+rightx,y0+righty); /*移動初始點到右側(cè)斜線上部分下端點*/ lineto(x0+rx+rightx+10,y0+righty+10); /*畫右側(cè)斜線的下部分*/
circle(x0+rx+rightx+10,y0+righty+10,4); /*在右側(cè)斜線下部分下端點畫圓*/ 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); /*移動初始點到下半橢圓最左側(cè)點*/
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); /*畫連接左斜線與居中線的兩個內(nèi)端點間的線段*/
line(x0,y0+centery1,x0+rx+rightx,y0+righty); /* 畫連接右斜線與居中線的兩個內(nèi)端點間的線段*/
}
void DrawPlan(void) /*畫火箭函數(shù)*/
{
int size; /*定義一個變量*/
setcolor(LIGHTRED); /*設(shè)置當(dāng)前畫線顏色*/
setfillstyle(1,BLUE); /*設(shè)置填充模式和顏色*/
ellipse(x0,y0-height,0,180,width1,3*width1); /*在指定位置畫一橢圓*/ moveto(x0+width1,y0); /*移動初始點到火箭張部右側(cè)豎線的下端點*/
lineto(x0+width1,y0-height) ; /*畫右側(cè)連接半橢圓與以上點間的線段*/ moveto(x0+width1,y0); /*移動初始點到火箭上部右側(cè)豎線的下端點*/ lineto(x0+width2,y0+y2) ; /*畫火箭尾部右側(cè)的上層斜線*/
moveto(x0-width1,y0); /*移動初始點到火箭上部左側(cè)豎線的下端點*/ lineto(x0-width1,y0-height); /*畫左側(cè)連接半橢圓與以上點間的線段*/ moveto(x0-width1,y0); /*移動初始點到火箭上部左側(cè)豎線的下端點*/ lineto(x0-width2,y0+y2); /*畫火箭尾部左側(cè)的上層斜線*/
moveto(x0+width2,y0+y3); /*移動初始點到火箭尾部最右側(cè)線段下端點*/ lineto(x0+width2,y0+y1); /*畫由以上端點豎直向上的線段*/
moveto(x0+width2,y0+y3); /*移動初始點到火箭尾部最右側(cè)線段下端點*/ lineto(x0+width1,y0+y2); /*畫火箭尾部右側(cè)的下層斜線*/
moveto(x0-width2,y0+y3); /*移動初始點到火箭尾部最左側(cè)線段下端點*/ lineto(x0-width2,y0+y1); /*畫由以上線段豎直向上的線段*/
moveto(x0-width2,y0+y3); /*移動初始點到火箭尾部最左側(cè)線段下端點*/ lineto(x0-width1,y0+y2); /*畫火箭尾部左側(cè)的下層斜線*/
moveto(x0,y0+y4); /*移動初始點到火箭的最下端點*/
lineto(x0+width1,y0+y2); /*畫由以上端點到右側(cè)下層斜線上端點間的線段*/ moveto(x0,y0+y4); /*移動初始點到火箭的最下端點*/
lineto(x0-width1,y0+y2); /* 畫由以上端點到左側(cè)下層斜線上端點間的線段*/ setfillstyle(2,WHITE); /*設(shè)置填充模式和顏色*/
floodfill(x0,y0,LIGHTRED); /*填充一個有界區(qū)域*/
size=imagesize(x0-width2-1,y0-height-3*width1,x0+width2+1,y0+y4); /*返回保存位圖像所需的字節(jié)數(shù)*/
buf=malloc(size); /*從堆中分配大小為size字節(jié)的塊*/
if(!buf)
{
printf("No enough memory!");
exit(0); /*退出*/
}
getimage(x0-width2,y0-height-3*width1,x0+width2,y0+y4,buf);
/*確定保存圖像所需的存儲區(qū)大小*/
}
六、設(shè)計結(jié)果說明: /*如果火箭圖象沒有生成*/
▲ 設(shè)計優(yōu)點:本程序較巧妙的實現(xiàn)了從繪制到發(fā)射的過程。設(shè)計時對各種操作的所需要的進(jìn)程設(shè)計的比較全面。
▲ 設(shè)計不足:本程序只能對火箭的“上”起作用,而對其“左右”的控制不起作用。
【用C語言實現(xiàn)火箭的升空】相關(guān)文章:
c語言心得04-24
C語言課程教案04-24
奮力托舉火箭升空泰然書寫華彩人生-記我國著名火箭發(fā)動機(jī)專家張貴田院士05-03
C語言實習(xí)心得01-01
C語言實習(xí)總結(jié)01-19
基于TMS320C6713坐標(biāo)轉(zhuǎn)換的實現(xiàn)04-28
氣象探測火箭發(fā)射用軟件射表04-30
C語言基礎(chǔ)實驗報告10-11
c語言實踐報告模型10-28