版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、貪吃蛇游戲程序設(shè)計(jì)貪吃蛇小游戲程序設(shè)計(jì)二、設(shè)計(jì)要求通過(guò)游戲程序設(shè)計(jì),提高編程興趣與編程思路,鞏固C語(yǔ)言中所學(xué)的知識(shí),合理的運(yùn)用資料,實(shí)現(xiàn)理論與實(shí)際相結(jié)合。(1).收集資料,分析課題,分解問(wèn)題,形成總體設(shè)計(jì)思路;(2 )對(duì)于設(shè)計(jì)中用到的關(guān)鍵函數(shù),要學(xué)會(huì)通過(guò)查資料,弄懂其用法,要聯(lián)系問(wèn)題進(jìn)行具體介紹;(3 )上機(jī)調(diào)試,查錯(cuò),逐步分析不能正常運(yùn)行的原因,確保所設(shè)計(jì)的程序正確,并且能正常運(yùn)行;(4 )完成課程設(shè)計(jì)報(bào)告,并進(jìn)行答辯三、需求分析3.1、程序功能貪吃蛇游戲是一個(gè)經(jīng)典小游戲,一條蛇在封閉圍墻里,圍墻里隨機(jī)出現(xiàn)一個(gè)食物,通 過(guò)按鍵盤(pán)四個(gè)光標(biāo)鍵控制蛇向上下左右四個(gè)方向移動(dòng),蛇頭撞倒食物,則食物被吃
2、掉,蛇 身體長(zhǎng)一節(jié),同時(shí)記10分,接著又出現(xiàn)食物,等待蛇來(lái)吃,如果蛇在移動(dòng)中撞到墻或身 體交叉蛇頭撞倒自己身體游戲結(jié)束。3.2、設(shè)計(jì)思想程序關(guān)鍵在于表示蛇的圖形及蛇的移動(dòng)。用一個(gè)小矩形快表示蛇的一節(jié)身體,身體每 長(zhǎng)一節(jié),增加一個(gè)矩形塊,蛇頭用倆節(jié)表示。移動(dòng)時(shí)必須從蛇頭開(kāi)始,所以蛇不能向相反 的方向移動(dòng),如果不按任意鍵,蛇自行在當(dāng)前方向上前移,但按下有效方向鍵后,蛇頭朝 著該方向移動(dòng),一步移動(dòng)一節(jié)身體,所以按下有效方向鍵后,先確定蛇頭的位置,而后蛇 的身體隨蛇頭移動(dòng),圖形的實(shí)現(xiàn)是從蛇頭新位置開(kāi)始畫(huà)出蛇,這時(shí),由于未清屏的原因, 原來(lái)的蛇的位置和新蛇的位置差一個(gè)單位,所以看起來(lái)蛇多一節(jié)身體,所以將
3、蛇的最后一 節(jié)用背景色覆蓋。食物的出現(xiàn)與消失也是畫(huà)矩形塊和覆蓋矩形塊。為了便于理解,定義兩 個(gè)結(jié)構(gòu)體:食物與蛇。3.3、流程圖四、設(shè)計(jì)的具體實(shí)現(xiàn)(1 )函數(shù)定義函數(shù)定義是對(duì)各個(gè)基礎(chǔ)函數(shù)的定義,并且設(shè)置需要運(yùn)用的信息,便于調(diào)用#defi ne N 200實(shí)際情況自行調(diào)整#defi ne M 200struct Food#in clude"gra phics.h"#in clude<stdlib.h>int X;/食物的橫坐標(biāo)#i ncludevstdio.h>int y;/食物的縱坐標(biāo)#i ncludevstri ng.h>int yes;/判斷是否要
4、出現(xiàn)食物的變量#i ncludeviostream.h>food;/食物的結(jié)構(gòu)體#in clude<dos.h>struct Sn ake#in clude<c oni o.h>#i nclude vwin dows.h>int xM;#defi ne LEFT 97/Aint yM;#defi ne RIGHT 100/D int node;/蛇的節(jié)數(shù)#defi ne DOWN 115/Sint directio n;/蛇的移動(dòng)方向#defi ne UP 119/Wint life;/蛇的生命,0表示活著,1表#defi ne Esc 0x011b示死亡i
5、nt i,key;sn ake;int score=0;void In it();/圖形驅(qū)動(dòng)int gamespeed=250;/游戲速度可根據(jù)void Close();/ 圖形結(jié)束void DrawK();/ 開(kāi)始畫(huà)面void GameOverO;/ 游戲結(jié)束void P rScoreO;/ 輸出成績(jī)void Game Play();/玩游戲的具體過(guò)程(2)主函數(shù) main()主函數(shù)是程序的主流程,首先定義使用到的常數(shù)、全局變量及函數(shù)原型說(shuō)明,然后初始化圖形系統(tǒng),調(diào)用函數(shù) DrawK()畫(huà)出開(kāi)始畫(huà)面,調(diào)用函數(shù) GamePlay(),即玩游戲的具體過(guò)程,游戲結(jié)束后調(diào)用 CloseO關(guān)閉圖形系統(tǒng)
6、,結(jié)束程序 void ma in()/ 主函數(shù)Init();/圖形驅(qū)動(dòng)DrawK();/開(kāi)始畫(huà)面GamePlay();/玩游戲的具體過(guò)程Close();/圖形結(jié)束 void In it()/ 圖形驅(qū)動(dòng)int gd=DETECT,gm;initgraph(&gd,&gm," ");/*此處為turboc的路徑,讀者可以根據(jù)自己的電腦而改 */cleardevice();(3) 畫(huà)界面函數(shù)DrawK()主界面是一個(gè)封閉的圍墻,用兩個(gè)循環(huán)語(yǔ)句分別在水平和垂直方向輸出連續(xù)的寬度和高度均的矩形方塊,表示圍墻,為了醒目,設(shè)置為白色。void DrawK()/開(kāi)始畫(huà)面,左
7、上角坐標(biāo)為(50,40),右下角坐標(biāo)為(610,460 )的圍墻setbkcolor(GREEN);setcolor(LIGHTRED);setli nestyle(0,0,5);/設(shè)置線型for(i=50;i<=600;i+=10)/ 畫(huà)圍墻recta ngle(i,40,i+10,49);/上邊recta ngle(i,451,i+10,460);/下邊f(xié)or(i=40;i<=450;i+=10)recta ngle(50,i,59,i+10);/左邊recta ngle(601,i,610,i+10);/右邊游戲具體過(guò)程函數(shù)Game Play ()這是游戲的主要組成部分,他采
8、用將前一節(jié)的坐標(biāo)賦給后一節(jié),用背景顏色將最后節(jié)去除,當(dāng)蛇頭的坐標(biāo)與食物的坐標(biāo)相等時(shí),表示食物被吃掉了。void Game Play()/ 玩游戲的具體過(guò)程rand();/隨機(jī)數(shù)發(fā)生器food.yes=1;/1表示需要出現(xiàn)新食物,0表示已經(jīng)存在食物sn ake.life=O;/ 蛇活著sn ake.directio n=1;/方向往右sn ake.x0=100;s nake.y0=100;/舌頭坐標(biāo)sn ake.x1=110;s nake.y1=100 ;sn ake .n ode=2;/ 蛇的節(jié)數(shù)PrScoreO;/輸出分?jǐn)?shù)while(1)/可重復(fù)玩游戲,按ESC鍵結(jié)束while(!kbhit
9、()/在沒(méi)有按鍵的情況下,蛇自己移動(dòng)身體if(food.yes=1)/ 需要出現(xiàn)新食物food.x=ra nd()%400+60;food.y=ra nd()%350+60;while(food.x%10!=0)/食物隨即出現(xiàn)后必須讓食物能夠在整格內(nèi),這樣才能讓蛇遲到food.x+;while(food.y%10!=0)food.y+;food.yes=0;/ 畫(huà)面上有食物了if(food.yes=0)/畫(huà)面上有食物就要顯示sn ake.y0+=10;break;算法動(dòng)蛇頭setcolor(GREEN);recta ngle(food.x,food.y,food.x+10,food.y-10)
10、;for(i=s nake .n ode-1;i>0;i-)/蛇的每個(gè)環(huán)節(jié)往前移動(dòng),也就是貪吃蛇的關(guān)鍵sn ake.xi=s nake.xi-1;sn ake.yi=s nake.yi-1;switch(s nake.directio n)/1,2,3,4表示上下左右四個(gè)方向,通過(guò)這個(gè)判斷來(lái)移case 1:sn ake.x0+=10;break;case 2:sn ake.x0-=10;break;case 3:sn ake.y0-=10;break;case 4:for(i=3;i<s nake. no de;i+)/從蛇的第四節(jié)開(kāi)始判斷是否撞到自己了, 因?yàn)樯哳^為兩節(jié),第三節(jié)不
11、可能拐過(guò)來(lái)if(sn ake.xi=s nake.xO&&sn ake.yi=s nake.yO)GameOverO;/顯示失敗 sn ake.life=1;蛇是break;if(s nake.x0v55|s nake.x0>595|s nake.y0v55|s nake.y0>455)/否撞到墻壁sn ake.direct ion=3;GameOver();/本次游戲結(jié)束sn ake.life=1;/蛇死if(s nake.life=1)/以上兩種判斷以后,如果蛇死就跳出內(nèi)循環(huán),重新開(kāi)始吃到食物以后break;if(sn ake.x0=food.x&&am
12、p;sn ake.y0=food.y)/setcolor(0);/把畫(huà)面上的食物去掉 recta ngle(food.x,food.y,food.x+10,food.y-10);sn ake.ys nake .n ode=-20;/新的一節(jié)先放在看不見(jiàn)得位置,下次循環(huán)就取前一節(jié)的位置sn ake. no de+;/蛇的身體長(zhǎng)一節(jié)food.yes=1;score+=10;PrScoreO;/輸出新的得分setcolor(WHITE);/ 畫(huà)出蛇for(i=0;i<s nake .no de;i+)recta ngle(s nake.xi,s nake.yi,s nake.xi+10,s n
13、ake.yi-10);Slee p( games peed);setcolor(0);/用黑色去除蛇的最后一節(jié)recta ngle(s nake.xs nake. no de-1,s nake.ys nake. no de-1,s nake.xs nake. no de-1 +10,s nake.ys nake. no de-1-10);if(sn ake.life=1)/如果蛇死就跳出循環(huán)break;key=getchar();/接受案件if(key=Esc)/ 按 ESC 鍵退出break;else if(key=U P&&sn ake.directio n!=4)else
14、 if(key=RIGHT&&sn ake.directio n!=2)sn ake.direct ion=1;else if(key=LEFT&&sn ake.direct ion!=1)sn ake.direct ion=2;else if(key=DOW N&&sn ake.directio n!=3)sn ake.direct ion=4;/en dwhile(1)(5)游戲結(jié)束函數(shù) GameOver ()游戲結(jié)束,清除屏幕,輸出分?jǐn)?shù),顯示游戲結(jié)束信息。void GameOver()/游戲結(jié)束cleardevice();P rScore(
15、);setcolor(RED);outtextxy(100,100,"我會(huì)回來(lái)的!");getch();void PrScore()/ 輸出成績(jī)char str1O;setfillstyle(SOLID_FILL,YELLOW);bar(50,15,220,35);setcolor(6);sprin tf(str,"score:%d",score);outtextxy(55,20,str);void Close()/ 圖形結(jié)束getch();closegra ph();五、調(diào)試及解決方法可以按照程序運(yùn)行的錯(cuò)誤提示對(duì)原程序進(jìn)行修改,在調(diào)試過(guò)程中有時(shí)也會(huì)遇到
16、不懂的問(wèn)題,我去圖書(shū)館或上網(wǎng)查閱一些資料或者是向老師請(qǐng)教也解決了對(duì)源程序一一修改直到運(yùn)行成功。六、測(cè)試結(jié)果訓(xùn)課程設(shè)謂Debug応aa, e<e"eDLLx七、設(shè)計(jì)心得體會(huì)在設(shè)計(jì)這個(gè)程序中我主要學(xué)會(huì)了如何運(yùn)用以下有關(guān)C語(yǔ)言和C+的知識(shí)1)函數(shù)定義是要做到顧名思義是很重要的,它對(duì)讀程序的人正確認(rèn)識(shí)程序十分重要,在修改這個(gè)程序的過(guò)程中也能很快找到程序各模塊的作用,大大增加了程序的可讀性。2)分析函數(shù)先從main()函數(shù)入手。Main()函數(shù)是C+源程序編譯時(shí)的開(kāi)始,從main()函數(shù)開(kāi)始讀函數(shù)可將其他函數(shù)的功能理解得更透徹。3) 在做程序的時(shí)候先列框架,將這個(gè)程序所要達(dá)到的目的(功能
17、)分析出來(lái),選擇正確的數(shù)據(jù)結(jié)構(gòu)然后在將程序模塊化,按照模塊編寫(xiě)函數(shù)更加簡(jiǎn)單合理。4)我還了解了很多的庫(kù)函數(shù)的作用,如字符串函數(shù)中有很多對(duì)字符串進(jìn)行處理的函數(shù),起功能我都有所了解。5)學(xué)會(huì)了有關(guān)頭文件的使用方法, 及系統(tǒng)調(diào)配問(wèn)題的解決方法等。6)了解到了注釋的重要性。八、附錄1、參考文獻(xiàn):譚浩強(qiáng),C+程序設(shè)計(jì)清華大學(xué)出版社郭翠英,C語(yǔ)言課程設(shè)計(jì)案例精編,中國(guó)水利水電出版社,2004.3李麗娟,C語(yǔ)言程序設(shè)計(jì)教程人民郵電出版社林華聰,C語(yǔ)言程序設(shè)計(jì)思想與實(shí)踐冶金工業(yè)出版社2、源代碼#defi ne M 200#i nclude"gra phics.h"#i nclude<
18、stdlib.h>#in clude<stdio.h>#in clude<stri ng.h>#in clude<iostream.h>#in clude<dos.h>int node;/ 蛇的節(jié)數(shù)#in clude<c oni o.h>int directio n;/蛇的移動(dòng)方向#in elude <win dows.h>int life;/蛇的生命,0表示活著,1表示死#defi ne LEFT 97/A#defi ne RIGHT 100/Dsn ake;#defi ne DOWN 115/Svoid In i
19、t();/ 圖形驅(qū)動(dòng)#defi ne UP 119/Wvoid CloseO;/圖形結(jié)束#defi ne Esc 0x011bvoid DrawK();/ 開(kāi)始畫(huà)面int i,key;void Game Play();/玩游戲的具體過(guò)程int score=0;void GameOver();/游戲結(jié)束void P rScoreO;/輸出成績(jī)in t games peed=250;/游戲速度可根據(jù)實(shí)際情況自行調(diào)整void mai n()/ 主函數(shù)struct FoodInit();/圖形驅(qū)動(dòng)int x;/食物的橫坐標(biāo)DrawK();/開(kāi)始畫(huà)面int y;/食物的縱坐標(biāo)Game Play();/玩
20、游戲的具體過(guò)程int yes;/判斷是否要出現(xiàn)食物的變量Close();/圖形結(jié)束food;/食物的結(jié)構(gòu)體struct Sn akeint xM;int yM;void In it()/圖形驅(qū)動(dòng)in t gd=DETECT,gm;while(food.x%10!=0)/ 食物的路徑,讀者可以根據(jù)自己的電腦而改*/rand();/隨機(jī)數(shù)發(fā)生器cleardevice();food.yes=1;/1表示需要出現(xiàn)新食物,0表 示已經(jīng)存在食物sn ake.life=0;/ 蛇活著void DrawK()/開(kāi)始畫(huà)面,左上角坐標(biāo)為(50,40 ),右下角坐標(biāo)為(610,460 )的圍墻sn ake.dire
21、cti on=1;/ 方向往右舌頭坐sn ake.x0=100;s nake.y0=100;/setbkcolor(GREEN);setcolor(LIGHTRED);sn ake.x1=110;s nake.y1=100 ;setli nestyle(0,0,5);/設(shè)置線型sn ake. no de=2;/蛇的節(jié)數(shù)for(i=50;i<=600;i+=10)/畫(huà)圍墻PrScoreO;/輸出分?jǐn)?shù)上邊while(1)/可重復(fù)玩游戲,按 ESC鍵結(jié)束recta ngle(i,40,i+10,49);/recta ngle(i,451,i+10,460);/下邊while(!kbhit()/
22、在沒(méi)有按鍵的情況下,蛇自己移動(dòng)身體for(i=40;i<=450;i+=10)左邊右邊if(food.yes=1)/需要出現(xiàn)新食recta ngle(50,i,59,i+10);/ recta ngle(601,i,610,i+10);/food.x=ra nd()%400+60;food.y=ra nd()%350+60;void Game Play()/玩游戲的具體過(guò)程隨即出現(xiàn)后必須讓食物能夠在整格內(nèi),這樣才能讓蛇遲到switch(s nake.directio n)/1,2,3,4表示上下左右四個(gè)方向,通過(guò)這個(gè)判斷來(lái)移動(dòng)蛇food.x+;while(food.y%10!=0)foo
23、d.y+;case 1:sn ake.x0+=10;break;case 2:sn ake.x0-=10;break;if(food.yes=0)/畫(huà)面上有食物case 3:就要顯示setcolor(GREEN);sn ake.y0-=10;break;case 4:sn ake.y0+=10;break;recta ngle(food.x,food.y,food.x+10,food.for(i=3;i<s nake .no de;i+)/從蛇y-10);的第四節(jié)開(kāi)始判斷是否撞到自己了,因?yàn)樯哳^為兩節(jié),第三節(jié)不可能拐過(guò)來(lái)for(i=s nake .no de-1;i>0;i-)/的
24、每個(gè)環(huán)節(jié)往前移動(dòng),也就是貪吃蛇的關(guān)鍵算法if(sn ake.xi=s nake.x 0&&sn ake.yi=sn ake.xi=s nake.xi-1;=sn ake.y0)sn ake.yi=s nake.yi-1;food.yes=0;/畫(huà)面上有食物GameOverO;/ 顯示失敗sn ake.life=1;break;if(s nake.x0<55|s nake.x0>595|s nake.y0<55|s nake.y0>455)/蛇是否撞到墻壁GameOver();/本次游戲結(jié)束sn ake.life=1;/蛇死if(s nake.life=1
25、)/以上兩種判斷以后,如果蛇死就跳出內(nèi)循環(huán),重新開(kāi)始break;if(sn ake.x0=food.x&&sn ake.y0=forecta ngle(food.x,food.y,food.x+10,food.y-10);sn ake.xs nake .no de=-20;sn ake.ys nake .no de=-20;/新的一節(jié)先放在看不見(jiàn)得位置,下次循環(huán)就取前節(jié)的位置sn ake .n ode+;/蛇的身體長(zhǎng)food.yes=1;score+=10;PrScoreO;/輸出新的得分setcolor(WHITE);/ 畫(huà)出蛇for(i=0;i<s nake .no de;i+)recta ngle(s nake.xi,s nake.yi,s nake.xiod.y)/吃到食物以后+10,s nake.yi
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 獨(dú)居庭院出售合同范例
- 警服洗滌采購(gòu)合同范例
- 淋浴器安裝合同范例
- 店面轉(zhuǎn)讓合同范例
- 商場(chǎng)垃圾回收合同范例
- 銷(xiāo)售商務(wù)合同范例
- 小區(qū)綠化工程建設(shè)合同范例
- 運(yùn)輸瓷磚合同范例
- 銷(xiāo)售石材銷(xiāo)售合同范例
- 等額等息合同范例
- 2022-2023學(xué)年江蘇省連云港市九年級(jí)(上)期末數(shù)學(xué)試卷(含詳細(xì)答案解析)
- 二年級(jí)上冊(cè)豎式計(jì)算200題附答案
- 2024年同等學(xué)力英語(yǔ)考試真題及詳解
- CDASHStandards數(shù)據(jù)采集標(biāo)準(zhǔn)全版
- 初中地理學(xué)科學(xué)習(xí)新課標(biāo)(2022版)考核試卷有答案
- 玻璃工業(yè)的節(jié)能減排與綠色制造
- 波士頓咨詢-X大型制造業(yè)數(shù)字化轉(zhuǎn)型戰(zhàn)略規(guī)劃項(xiàng)目(交付版)
- 紀(jì)法培訓(xùn)課件
- 南京理工大學(xué)物理化學(xué)課程考試8套卷(含答案)
- 泌尿外科工作總結(jié)及計(jì)劃
- 2023-2024學(xué)年度第一學(xué)期墻新學(xué)校小學(xué)部六年級(jí)課外閱讀答題活動(dòng)
評(píng)論
0/150
提交評(píng)論