貪吃蛇游戲程序設(shè)計(jì)__一、課程設(shè).doc_第1頁(yè)
貪吃蛇游戲程序設(shè)計(jì)__一、課程設(shè).doc_第2頁(yè)
貪吃蛇游戲程序設(shè)計(jì)__一、課程設(shè).doc_第3頁(yè)
貪吃蛇游戲程序設(shè)計(jì)__一、課程設(shè).doc_第4頁(yè)
貪吃蛇游戲程序設(shè)計(jì)__一、課程設(shè).doc_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、貪吃蛇游戲程序設(shè)計(jì)_一、課程設(shè)。txt同志們:別炒股,風(fēng)險(xiǎn)太大了,還是做豆腐最安全!做硬了是豆腐干,做稀了是豆腐腦,做薄了是豆腐皮,做沒了是豆?jié){,放臭了是臭豆腐!穩(wěn)賺不虧呀!貪吃蛇游戲程序設(shè)計(jì)一、課程設(shè)計(jì)任務(wù) 貪吃蛇小游戲程序設(shè)計(jì)二、設(shè)計(jì)要求通過游戲程序設(shè)計(jì),提高編程興趣與編程思路,鞏固C語言中所學(xué)的知識(shí),合理的運(yùn)用資料,實(shí)現(xiàn)理論與實(shí)際相結(jié)合.(1)收集資料,分析課題,分解問題,形成總體設(shè)計(jì)思路;(2)對(duì)于設(shè)計(jì)中用到的關(guān)鍵函數(shù),要學(xué)會(huì)通過查資料,弄懂其用法,要聯(lián)系問題進(jìn)行具體介紹;(3)上機(jī)調(diào)試,查錯(cuò),逐步分析不能正常運(yùn)行的原因,確保所設(shè)計(jì)的程序正確,并且能正常運(yùn)行;(4)完成課程設(shè)計(jì)報(bào)告,并

2、進(jìn)行答辯三、需求分析3。1、程序功能 貪吃蛇游戲是一個(gè)經(jīng)典小游戲,一條蛇在封閉圍墻里,圍墻里隨機(jī)出現(xiàn)一個(gè)食物,通過按鍵盤四個(gè)光標(biāo)鍵控制蛇向上下左右四個(gè)方向移動(dòng),蛇頭撞倒食物,則食物被吃掉,蛇身體長(zhǎng)一節(jié),同時(shí)記10分,接著又出現(xiàn)食物,等待蛇來吃,如果蛇在移動(dòng)中撞到墻或身體交叉蛇頭撞倒自己身體游戲結(jié)束。3。2、設(shè)計(jì)思想程序關(guān)鍵在于表示蛇的圖形及蛇的移動(dòng)。用一個(gè)小矩形快表示蛇的一節(jié)身體,身體每長(zhǎng)一節(jié),增加一個(gè)矩形塊,蛇頭用倆節(jié)表示。移動(dòng)時(shí)必須從蛇頭開始,所以蛇不能向相反的方向移動(dòng),如果不按任意鍵,蛇自行在當(dāng)前方向上前移,但按下有效方向鍵后,蛇頭朝著該方向移動(dòng),一步移動(dòng)一節(jié)身體,所以按下有效方向鍵后,

3、先確定蛇頭的位置,而后蛇的身體隨蛇頭移動(dòng),圖形的實(shí)現(xiàn)是從蛇頭新位置開始畫出蛇,這時(shí),由于未清屏的原因,原來的蛇的位置和新蛇的位置差一個(gè)單位,所以看起來蛇多一節(jié)身體,所以將蛇的最后一節(jié)用背景色覆蓋。食物的出現(xiàn)與消失也是畫矩形塊和覆蓋矩形塊.為了便于理解,定義兩個(gè)結(jié)構(gòu)體:食物與蛇。3。3、流程圖開始 初始化界面和蛇身 放置食物 蛇開始運(yùn)動(dòng) 蛇吃到食? 蛇長(zhǎng)大 蛇死亡? 繼續(xù)? 退出界面 N N Y N Y 游戲者按鍵選擇 Y 四、設(shè)計(jì)的具體實(shí)現(xiàn)(1)函數(shù)定義 函數(shù)定義是對(duì)各個(gè)基礎(chǔ)函數(shù)的定義,并且設(shè)置需要運(yùn)用的信息,便于調(diào)用define N 200#define M 200#include”grap

4、hics。h”include<stdlib.h#includestdio.h>#include<string。h#include<iostream。hinclude<dos.h>includeconio.h>include windows。h#define LEFT 97/Adefine RIGHT 100/Ddefine DOWN 115/Sdefine UP 119/Wdefine Esc 0x011bint i,key;int score=0;int gamespeed=250;/游戲速度可根據(jù)實(shí)際情況自行調(diào)整struct Food int x;

5、/食物的橫坐標(biāo) int y;/食物的縱坐標(biāo) int yes;/判斷是否要出現(xiàn)食物的變量food;/食物的結(jié)構(gòu)體struct Snake int xM; int yM; int node;/蛇的節(jié)數(shù) int direction;/蛇的移動(dòng)方向 int life;/蛇的生命,0表示活著,1表示死亡snake;void Init();/圖形驅(qū)動(dòng)void Close();/圖形結(jié)束void DrawK();/開始畫面void GamePlay();/玩游戲的具體過程void GameOver();/游戲結(jié)束void PrScore();/輸出成績(jī)(2)主函數(shù)main( )主函數(shù)是程序的主流程,首先定義

6、使用到的常數(shù)、全局變量及函數(shù)原型說明,然后初始化圖形系統(tǒng),調(diào)用函數(shù)DrawK()畫出開始畫面,調(diào)用函數(shù)GamePlay(),即玩游戲的具體過程,游戲結(jié)束后調(diào)用Close()關(guān)閉圖形系統(tǒng),結(jié)束程序void main()/主函數(shù) Init();/圖形驅(qū)動(dòng)DrawK();/開始畫面GamePlay();/玩游戲的具體過程Close();/圖形結(jié)束void Init()/圖形驅(qū)動(dòng)int gd=DETECT,gm;initgraph(&gd,gm," ”);/此處為turboc的路徑,讀者可以根據(jù)自己的電腦而改/cleardevice();(3) 畫界面函數(shù)DrawK( ) 主界面是一

7、個(gè)封閉的圍墻,用兩個(gè)循環(huán)語句分別在水平和垂直方向輸出連續(xù)的寬度和高度均的矩形方塊,表示圍墻,為了醒目,設(shè)置為白色。void DrawK()/開始畫面,左上角坐標(biāo)為(50,40),右下角坐標(biāo)為(610,460)的圍墻 setbkcolor(GREEN); setcolor(LIGHTRED); setlinestyle(0,0,5);/設(shè)置線型 for(i=50;i<=600;i+=10)/畫圍墻 rectangle(i,40,i+10,49);/上邊 rectangle(i,451,i+10,460);/下邊 for(i=40;i<=450;i+=10) rectangle(50,

8、i,59,i+10);/左邊 rectangle(601,i,610,i+10);/右邊 (4)游戲具體過程函數(shù)GamePlay( ) 這是游戲的主要組成部分,他采用將前一節(jié)的坐標(biāo)賦給后一節(jié),用背景顏色將最后節(jié)去除,當(dāng)蛇頭的坐標(biāo)與食物的坐標(biāo)相等時(shí),表示食物被吃掉了。void GamePlay()/玩游戲的具體過程 rand();/隨機(jī)數(shù)發(fā)生器 food。yes=1;/1表示需要出現(xiàn)新食物,0表示已經(jīng)存在食物 snake.life=0;/蛇活著 snake.direction=1;/方向往右 snake.x0=100;snake。y0=100;/舌頭坐標(biāo) snake.x1=110;snake。y

9、1=100 ; snake。node=2;/蛇的節(jié)數(shù) PrScore();/輸出分?jǐn)?shù) while(1)/可重復(fù)玩游戲,按ESC鍵結(jié)束 while(!kbhit()/在沒有按鍵的情況下,蛇自己移動(dòng)身體 if(food。yes=1)/需要出現(xiàn)新食物 food.x=rand()400+60; food.y=rand()350+60; while(food.x10!=0)/食物隨即出現(xiàn)后必須讓食物能夠在整格內(nèi),這樣才能讓蛇遲到 food.x+; while(food。y10!=0) food。y+; food.yes=0;/畫面上有食物了 if(food。yes=0)/畫面上有食物就要顯示 setco

10、lor(GREEN); rectangle(food.x,food.y,food.x+10,food。y10); for(i=snake。node1;i0;i-)/蛇的每個(gè)環(huán)節(jié)往前移動(dòng),也就是貪吃蛇的關(guān)鍵算法 snake。xi=snake。xi1; snake。yi=snake。yi-1; switch(snake.direction)/1,2,3,4表示上下左右四個(gè)方向,通過這個(gè)判斷來移動(dòng)蛇頭 case 1: snake。x0+=10;break; case 2: snake.x0-=10;break; case 3: snake.y0-=10;break; case 4: snake。y0

11、+=10;break; for(i=3;i<snake。node;i+)/從蛇的第四節(jié)開始判斷是否撞到自己了,因?yàn)樯哳^為兩節(jié),第三節(jié)不可能拐過來 if(snake.xi=snake。x0snake.yi=snake。y0) GameOver();/顯示失敗 snake.life=1; break; if(snake。x0<55|snake。x0595snake。y055|snake。y0455)/蛇是否撞到墻壁 GameOver();/本次游戲結(jié)束 snake.life=1;/蛇死 if(snake.life=1)/以上兩種判斷以后,如果蛇死就跳出內(nèi)循環(huán),重新開始 break; i

12、f(snake。x0=food。x&snake。y0=food.y)/吃到食物以后 setcolor(0);/把畫面上的食物去掉 rectangle(food。x,food。y,food。x+10,food.y-10); snake.xsnake.node=-20; snake。ysnake。node=-20;/新的一節(jié)先放在看不見得位置,下次循環(huán)就取前一節(jié)的位置 snake.node+;/蛇的身體長(zhǎng)一節(jié) food。yes=1; score+=10; PrScore();/輸出新的得分 setcolor(WHITE);/畫出蛇 for(i=0;isnake.node;i+) recta

13、ngle(snake.xi,snake.yi,snake。xi+10,snake。yi10); Sleep(gamespeed); setcolor(0);/用黑色去除蛇的最后一節(jié) rectangle(snake.xsnake。node1,snake.ysnake.node1,snake.xsnake.node1+10,snake.ysnake。node-110); if(snake。life=1)/如果蛇死就跳出循環(huán) break; key=getchar();/接受案件 if(key=Esc)/按ESC鍵退出 break; else if(key=UP&snake.direction

14、!=4) snake。direction=3; else if(key=RIGHT&snake。direction!=2) snake.direction=1; else if(key=LEFT&snake.direction!=1) snake。direction=2; else if(key=DOWNsnake.direction!=3) snake。direction=4; /endwhile(1)(5)游戲結(jié)束函數(shù)GameOver( ) 游戲結(jié)束,清除屏幕,輸出分?jǐn)?shù),顯示游戲結(jié)束信息。void GameOver()/游戲結(jié)束 cleardevice(); PrScore

15、(); setcolor(RED); outtextxy(100,100,"我會(huì)回來的!!”); getch();void PrScore()/輸出成績(jī) char str10; setfillstyle(SOLID_FILL,YELLOW); bar(50,15,220,35); setcolor(6); sprintf(str,"score:%d”,score); outtextxy(55,20,str);void Close()/圖形結(jié)束 getch(); closegraph();五、調(diào)試及解決方法可以按照程序運(yùn)行的錯(cuò)誤提示對(duì)原程序進(jìn)行修改,在調(diào)試過程中有時(shí)也會(huì)遇到不

16、懂的問題,我去圖書館或上網(wǎng)查閱一些資料或者是向老師請(qǐng)教也解決了對(duì)源程序一一修改直到運(yùn)行成功。六、測(cè)試結(jié)果 七、設(shè)計(jì)心得體會(huì)在設(shè)計(jì)這個(gè)程序中我主要學(xué)會(huì)了如何運(yùn)用以下有關(guān)C語言和C+的知識(shí)1) 函數(shù)定義是要做到顧名思義是很重要的,它對(duì)讀程序的人正確認(rèn)識(shí)程序 十分重要,在修改這個(gè)程序的過程中也能很快找到程序各模塊的作用,大大增加了程序的可讀性。2) 分析函數(shù)先從main()函數(shù)入手。Main()函數(shù)是C+源程序編譯時(shí)的開始, 從main()函數(shù)開始讀函數(shù)可將其他函數(shù)的功能理解得更透徹.3) 在做程序的時(shí)候先列框架,將這個(gè)程序所要達(dá)到的目的(功能)分析出 來,選擇正確的數(shù)據(jù)結(jié)構(gòu)然后在將程序模塊化,按照

17、模塊編寫函數(shù)更加簡(jiǎn)單合理。4) 我還了解了很多的庫(kù)函數(shù)的作用,如字符串函數(shù)中有很多對(duì)字符串進(jìn)行 處理的函數(shù),起功能我都有所了解。5)學(xué)會(huì)了有關(guān)頭文件的使用方法,及系統(tǒng)調(diào)配問題的解決方法等。 6)了解到了注釋的重要性。八、附錄1、參考文獻(xiàn):譚浩強(qiáng),C+程序設(shè)計(jì) 清華大學(xué)出版社郭翠英,C語言課程設(shè)計(jì)案例精編,中國(guó)水利水電出版社,2004。3李麗娟,C語言程序設(shè)計(jì)教程 人民郵電出版社林華聰,C語言程序設(shè)計(jì)思想與實(shí)踐 冶金工業(yè)出版社2、源代碼#define M 200#include”graphics。h”#includestdlib.hincludestdio.hincludestring.h>

18、;#include<iostream。h#includedos。h>#include<conio.hinclude windows。hdefine LEFT 97/A#define RIGHT 100/Ddefine DOWN 115/S#define UP 119/Wdefine Esc 0x011bint i,key;int score=0;int gamespeed=250;/游戲速度可根據(jù)實(shí)際情況自行調(diào)整struct Food int x;/食物的橫坐標(biāo) int y;/食物的縱坐標(biāo) int yes;/判斷是否要出現(xiàn)食物的變量food;/食物的結(jié)構(gòu)體struct Sna

19、ke int xM; int yM; int node;/蛇的節(jié)數(shù) int direction;/蛇的移動(dòng)方向 int life;/蛇的生命,0表示活著,1表示死亡snake;void Init();/圖形驅(qū)動(dòng)void Close();/圖形結(jié)束void DrawK();/開始畫面void GamePlay();/玩游戲的具體過程void GameOver();/游戲結(jié)束void PrScore();/輸出成績(jī)void main()/主函數(shù) Init();/圖形驅(qū)動(dòng) DrawK();/開始畫面 GamePlay();/玩游戲的具體過程 Close();/圖形結(jié)束void Init()/圖形驅(qū)動(dòng)

20、 int gd=DETECT,gm; initgraph(&gd,&gm," ");/此處為turboc的路徑,讀者可以根據(jù)自己的電腦而改*/ cleardevice();void DrawK()/開始畫面,左上角坐標(biāo)為(50,40),右下角坐標(biāo)為(610,460)的圍墻 setbkcolor(GREEN); setcolor(LIGHTRED); setlinestyle(0,0,5);/設(shè)置線型 for(i=50;i<=600;i+=10)/畫圍墻 rectangle(i,40,i+10,49);/上邊 rectangle(i,451,i+10,4

21、60);/下邊 for(i=40;i=450;i+=10) rectangle(50,i,59,i+10);/左邊 rectangle(601,i,610,i+10);/右邊 void GamePlay()/玩游戲的具體過程 rand();/隨機(jī)數(shù)發(fā)生器 food。yes=1;/1表示需要出現(xiàn)新食物,0表示已經(jīng)存在食物 snake.life=0;/蛇活著 snake.direction=1;/方向往右 snake。x0=100;snake。y0=100;/舌頭坐標(biāo) snake.x1=110;snake.y1=100 ; snake。node=2;/蛇的節(jié)數(shù) PrScore();/輸出分?jǐn)?shù) wh

22、ile(1)/可重復(fù)玩游戲,按ESC鍵結(jié)束 while(!kbhit())/在沒有按鍵的情況下,蛇自己移動(dòng)身體 if(food.yes=1)/需要出現(xiàn)新食物 food.x=rand()400+60; food。y=rand()%350+60; while(food.x%10!=0)/食物隨即出現(xiàn)后必須讓食物能夠在整格內(nèi),這樣才能讓蛇遲到 food.x+; while(food.y10!=0) food.y+; food。yes=0;/畫面上有食物了 if(food.yes=0)/畫面上有食物就要顯示 setcolor(GREEN); rectangle(food。x,food。y,food.x

23、+10,food。y-10); for(i=snake。node1;i>0;i-)/蛇的每個(gè)環(huán)節(jié)往前移動(dòng),也就是貪吃蛇的關(guān)鍵算法 snake。xi=snake。xi-1; snake.yi=snake.yi-1; switch(snake。direction)/1,2,3,4表示上下左右四個(gè)方向,通過這個(gè)判斷來移動(dòng)蛇頭 case 1: snake.x0+=10;break; case 2: snake.x0-=10;break; case 3: snake。y0-=10;break; case 4: snake.y0+=10;break; for(i=3;isnake.node;i+)/

24、從蛇的第四節(jié)開始判斷是否撞到自己了,因?yàn)樯哳^為兩節(jié),第三節(jié)不可能拐過來 if(snake.xi=snake.x0&snake.yi=snake.y0) GameOver();/顯示失敗 snake.life=1; break; if(snake.x0<55|snake。x0595|snake.y055snake。y0>455)/蛇是否撞到墻壁 GameOver();/本次游戲結(jié)束 snake。life=1;/蛇死 if(snake。life=1)/以上兩種判斷以后,如果蛇死就跳出內(nèi)循環(huán),重新開始 break; if(snake。x0=food。x&&snake。y0=food。y)/吃到食物以后 setcolor(0);/把畫面上的食物去掉 rectangle(food。x,food.y,food.x+10,food.y10); snake。xsnake。node=20; snake。ysnake.node=20;/新的一節(jié)先放在看不見得位置,下次循環(huán)就取前一節(jié)的位置 snake.node+;/蛇的身體長(zhǎng)一節(jié) food.yes=1; score+=10; PrScore();/輸出新的得分 setcolor(WHITE);/畫出蛇 for(i=0;i<snake.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論