貪吃蛇課程設(shè)計報告_第1頁
貪吃蛇課程設(shè)計報告_第2頁
貪吃蛇課程設(shè)計報告_第3頁
貪吃蛇課程設(shè)計報告_第4頁
貪吃蛇課程設(shè)計報告_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、目錄1 .課程設(shè)計目的32 .課程設(shè)計任務(wù)與要求32.1 課程設(shè)計內(nèi)容32.2 課程設(shè)計要求32.3 課程設(shè)計環(huán)境33 .課程設(shè)計方案33.1 方案論證33.2 程序整體設(shè)計說明33.3 設(shè)計思路43.4 設(shè)計總體流程圖43.5 設(shè)計的具體實(shí)現(xiàn)54 .程序測試84.1 測試內(nèi)容與結(jié)果84.2 程序運(yùn)行效果圖95 .課程設(shè)計總結(jié)106 .參考文獻(xiàn)11附錄源程序111 .課程設(shè)計目的:復(fù)習(xí)、鞏固才C、C+的基礎(chǔ)知識,進(jìn)一步加深對VC技術(shù)的理解和掌握;課程設(shè)計為學(xué)生提供了一個既動手又動腦,獨(dú)立實(shí)踐的機(jī)會,將課本上的理論知識和實(shí)際有機(jī)的結(jié)合起來,鍛煉學(xué)生的分析解決實(shí)際問題的能力。培養(yǎng)學(xué)生在項目開發(fā)中團(tuán)

2、隊合作精神、創(chuàng)新意識及能力2 .課程設(shè)計任務(wù)與要求2.1 課程設(shè)計內(nèi)容貪吃蛇游戲開發(fā),首先它可以為大家提供一種當(dāng)前比較流行的休閑小游戲。貪吃蛇是家喻戶曉的益智類小游戲,選擇這個題目一是為了將自己的所學(xué)知識加以運(yùn)用,二是一直以來貪吃蛇這個游戲就深深地吸引著很多人,它的制作方法對于很多同學(xué)而言都是很神秘的。所以我們希望通過這學(xué)期所學(xué)知識把它剖析開來,真真正正的了解它的本質(zhì)和精髓。在這次學(xué)習(xí)中我們將從實(shí)踐和實(shí)際的項目中提高自己的編程能力。因此決定選擇這個題目作為VC的課程設(shè)計。最后一部分就是游戲的模塊劃分,根據(jù)分析,貪吃蛇這個程序一共要實(shí)現(xiàn)如下幾個功能,包括游戲方面開始游戲、暫停游戲以及停止游戲,游

3、戲設(shè)置(蛇的顏色、食物的顏色操作說明等)與積分。2.2 課程設(shè)計要求對系統(tǒng)進(jìn)行功能模塊分析、控制模塊分析正確,符合課題要求,實(shí)現(xiàn)相應(yīng)功能;可以加以其他功能或修飾,使程序更加完善、合理;系統(tǒng)設(shè)計要實(shí)用,采用模塊化程序設(shè)計方法,編程簡練、可用,功能全面;說明書、流程圖要清楚;記錄設(shè)計情況(備查,也為編寫設(shè)計說明書作好準(zhǔn)備);2.3 課程設(shè)計環(huán)境Windows7s作系統(tǒng),VC6.0開發(fā)環(huán)境。3 .課程設(shè)計方案3.1 方案論證方案一:基于MFCS計該方案的好處是系統(tǒng)自動生成軟件框架,設(shè)計者只需填充編寫的代碼即可,程序設(shè)計比較復(fù)雜,對于編程能力不強(qiáng)的同學(xué)來說難度較大。方案二:基于easyX設(shè)計該方案的好

4、處是設(shè)計者只需編寫程序文件,完成后編譯即可生成可執(zhí)行文件,編程前需要先安裝easyX圖形庫。由于編程能力不強(qiáng),方案二設(shè)計簡單,易于調(diào)試,故選擇方案二。3.2 程序整體設(shè)計說明一個游戲要有開始部分,運(yùn)行部分,結(jié)束部分(實(shí)際上開始部分與運(yùn)行部分是一體的)。游戲界面:1)開始游戲(加載并開始)2)暫停游戲(從當(dāng)前進(jìn)度結(jié)束)3)重新開始(在某一時刻暫停后可以繼續(xù)接著玩)游戲設(shè)置:1)蛇的顏色(紅色)2)游戲幫助(游戲控制說明)3)積分(每次吃掉一個食物增加10分,并顯示出來)3.3 設(shè)計思路這個程序的關(guān)鍵是表示蛇的圖形以及蛇的移動。用一個小矩形表示蛇的一節(jié)身體,身體每長一節(jié),增加一個矩形塊。移動時必須

5、從蛇頭開始,所以蛇不能向相反方向移動,也就是蛇尾不能改作蛇頭。如果不按任何鍵,蛇自行在當(dāng)前方向上前移,當(dāng)游戲者按了有效的方向鍵后,蛇頭朝著指定的方向移動,一步移動一節(jié)身體,所以當(dāng)按了有效的方向鍵后,先確定蛇頭的位置,然后蛇身體隨著蛇頭移動,圖形的實(shí)現(xiàn)是從蛇頭的新位置開始畫出蛇,這時原來蛇的位置和新蛇的位置差一個單位,所以看起來蛇會多一節(jié)身體,所以將蛇的最后一節(jié)用背景色覆蓋。食物的出現(xiàn)和消失也是畫矩形塊和覆蓋矩形塊。3.4 設(shè)計總體流程圖1)食物類int x;int y;2)載入游戲并初3.5設(shè)計的具體體定義*/struct Food蛇璃的啜勺橫坐標(biāo)*/n口食物坐標(biāo)是查/*食物的縱坐標(biāo)I */*

6、int addFood;根據(jù)鍵盤控制蛇技H/*和臍票告要出胡變量*/蛇塊類 把蛇分成一I,一個蛇狗當(dāng)于有若驢個U它邛類就是用來描述每塊的信息。隨機(jī)生成下一個struct Snake/* 蛇的結(jié)構(gòu)體定義*/int xMAX_JOINTS;int yMAX_JOINTS;int joint;int direction;/* 保存蛇身每一節(jié)位于屏幕上的列坐標(biāo)*/* 保存蛇身每一節(jié)位于屏幕上的行坐標(biāo) */* 蛇的節(jié)數(shù) */* 蛇移動方向 */int life;/* 蛇的生命 ,0 活著 ,1 死亡 */;3)初始化游戲游戲開始界面的初始化:voidInitGraph()cleardevice();se

7、tbkcolor(BLUE);/*設(shè)置背景顏色*/setcolor(WHITE);/*設(shè)置前景顏色*/cleardevice();setfont(25,0,_T(微軟雅黑);outtextxy(170,150,GreedySnake);/*在坐標(biāo)(170,150)處輸出字符串*/outtextxy(219,254,Ready?);getch();setbkcolor(0);cleardevice();4)繪制游戲場景setlinestyle(PS_SOLID,5)用于繪制實(shí)心的寬度為5個像素的線型,bar(i,40,i+7,47);為畫一個左上角為(i,40),右下角為(i+7,47)的矩形條

8、,rectangle(i,40,i+10,49)也用于畫矩形。voidDrawFence()inti;setbkcolor(LIGHTGREEN);setlinestyle(PS_SOLID,5);/畫圍墻setfillstyle(LIGHTBLUE);for(i=50;i=591;i+=10)/rectangle(i,40,i+10,49);/上邊bar(i,40,i+7,47);bar(i,551,i+7,558);/下邊f(xié)or(i=40;i0;i-)/蛇的每個節(jié)往前移動snake.xi=snake.xi-1;snake.yi=snake.yi-1;/1,2,3,4表示右,左,上,下四個方

9、向,來決定蛇頭的移動switch(snake.direction)caseMV_RIGHT:snake.x0+=10;break;caseMV_LEFT:snake.x0-=10;break;caseMV_UP:snake.y0-=10;break;caseMV_DOWN:snake.y0+=10;break;8)a.從蛇的第四節(jié)開始判斷是否撞到自己,因?yàn)樯哳^為兩節(jié),第三節(jié)不可能拐過來for(i=3;isnake.joint;i+)if(snake.xi=snake.x0&snake.yi=snake.y0)GameOver(score);/顯示失敗snake.life=1;/蛇死*/brea

10、k;b. 判斷蛇是否撞到墻壁if(snake.x0595|snake.y0455)GameOver(score);/本次游戲結(jié)束snake.life=1;/蛇死c. 判斷是否撞到障礙物for(intobs_i=0;obs_ivox.size();obs_i+)if(voxobs_i=snake.x0&voyobs_i=snake.y0)GameOver(score);,如果蛇死就跳出內(nèi)循環(huán),重新開始。9)吃到食物后畫蛇if(snake.x0=food.x&snake.y0=food.y)/吃到食物后/把畫面上的食物清除setcolor(0);rectangle(food.x,food.y,fo

11、od.x+10,food.y-10);/新的一節(jié)先放在看不見的位置,下次循環(huán)就取前一節(jié)的位置snake.xsnake.joint=-20;snake.ysnake.joint=-20;/ 蛇的身體長一節(jié)/ 畫面上需要出現(xiàn)新食物/ 輸出新得分snake.joint+;food.addFood=1;score+=10;/PrScore(score);/畫蛇setcolor(RED);for(i=0;isnake.joint;i+)rectangle(snake.xi,snake.yi,snake.xi+10,snake.yi-10);Sleep(gamespeed);/延時控制蛇的速度/去除蛇的最

12、后一節(jié)setcolor(0);rectangle(snake.xsnake.joint-1,snake.ysnake.joint-1,snake.xsnake.joint-1+10,snake.ysnake.joint-1-10);10)按鍵操作key=getch();/接收按鍵switch(key)/判斷按鍵,是否往相反方向移動casew:caseW:if(snake.direction!=MV_DOWN)snake.direction=MV_UP;break;cased:caseD:if(snake.direction!=MV_LEFT)snake.direction=MV_RIGHT;b

13、reak;casea:caseA:if(snake.direction!=MV_RIGHT)snake.direction=MV_LEFT;break;cases:caseS:if(snake.direction!=MV_UP)snake.direction=MV_DOWN;break;casep:caseP:fun_pause();break;caser:caseR:fun_reset();break;編好程序后進(jìn)行編譯、運(yùn)行,生成可執(zhí)行文件,就可以玩貪吃蛇游戲了。4. 程序測試4.1測試內(nèi)容與結(jié)果1)開始:程序運(yùn)行后,會出來藍(lán)色背景界面和提示語Ready?,按任意鍵開始,注意不要在中文輸入

14、法下玩。開始后只有兩節(jié)的紅色蛇和一個綠色的食物,并且蛇是運(yùn)動的。2)方向鍵和WSAD:蛇開始運(yùn)行之后,當(dāng)點(diǎn)擊上下左右鍵(或WSAD蛇就會按相應(yīng)的方向運(yùn)動,蛇不能180度轉(zhuǎn)彎,只能進(jìn)行90度的轉(zhuǎn)彎。程序檢測時蛇確實(shí)會按點(diǎn)擊方向運(yùn)動且不會向相反方向運(yùn)動,所有方向鍵使用正確。3)暫停/繼續(xù):當(dāng)程序正在運(yùn)行時,點(diǎn)擊暫停/繼續(xù)按鈕“P”,蛇停在當(dāng)前的位置,再次點(diǎn)擊“P”蛇又從當(dāng)前位置繼續(xù)運(yùn)動。此按鈕符合要求,所以暫停/繼續(xù)按鈕使用正確,功能能夠?qū)崿F(xiàn)。4) 重新開始:當(dāng)游戲結(jié)束或想重新開始一局時,點(diǎn)擊按鈕“R”,游戲又回到最初的狀態(tài),一個食物,一個運(yùn)動著的紅色蛇塊,且游戲積分清零。所以重新開始功能能夠?qū)崿F(xiàn)

15、。5) 界面右側(cè)能夠出現(xiàn)按鍵提示和分?jǐn)?shù)顯示等有關(guān)信息。4.2程序運(yùn)行效果圖5. 課程設(shè)計總結(jié)在設(shè)計這個程序中我主要學(xué)會了如何運(yùn)用以下有關(guān)C吾言和C+勺知識:1) 函數(shù)定義是要做到顧名思義是很重要的,它對讀程序的人正確認(rèn)識程序十分重要,在修改這個程序的過程中也能很快找到程序各模塊的作用,大大增加了程序的可讀性。2)分析函數(shù)先從main()函數(shù)入手。Main()函數(shù)是C+礴程序編譯時的開始,從main()函數(shù)開始讀函數(shù)可將其他函數(shù)的功能理解得更透徹。3) 在做程序的時候先列框架,將這個程序所要達(dá)到的目的(功能)分析出來,選擇正確的數(shù)據(jù)結(jié)構(gòu)然后在將程序模塊化,按照模塊編寫函數(shù)更加簡單合理。4) 我還

16、了解了很多的庫函數(shù)的作用,如字符串函數(shù)中有很多對字符串進(jìn)行處理的函數(shù),其功能我都有所了解。5)學(xué)會了有關(guān)頭文件的使用方法,及系統(tǒng)調(diào)配問題的解決方法等。6)了解到了注釋的重要性。通過這次試驗(yàn),讓我學(xué)到很多這個學(xué)期沒有接觸過的很多知識,完成一個貪吃蛇的項目;第一步就是先理清思路,設(shè)計主界面,主界面是以一塊封閉的畫布,并在畫布內(nèi)設(shè)計蛇體和食物。蛇頭如果碰到墻或者與蛇身的某一部分碰到就會死亡;如果蛇頭碰到食物,就會自動增加一節(jié)蛇身,并更改得分。想要寫出好的程序,還是要有扎實(shí)的基礎(chǔ),這樣遇到問題就不會一籌莫展來。在編程時我們要有想象力,不要拘泥于現(xiàn)有的貪吃蛇游戲,而是要把自己想到的再加上所學(xué)的知識,遇到

17、問題不能怕,而是要專心找出問題的原因,再回來看看書本的知識,不懂的還可以問問老師。編程過程還要養(yǎng)成良好的編程習(xí)慣,這樣不僅自己能夠很好看懂自己的代碼,也讓人家容易看懂自己的代碼,而不至于代碼知識自己會看,出來問題只有自己會解決而其他人都不會解決;遇到問題時要考慮最簡單的解決方案,只有簡單的方案不能滿足要求時再考慮復(fù)雜的方案。最主要編程還是要多與人溝通,不會的不能立即問別人,但是一段時間后解決不了時還是應(yīng)該向別人請教請教,“三人行必有我?guī)煛闭沁@個意思。通過這次實(shí)驗(yàn),我深刻地體會到了面向?qū)ο笈c面向過程的區(qū)別。程序在最初設(shè)計時由于面向?qū)ο蟮乃枷氩粔虺墒?,?dǎo)致在最后想要增加一些新的功能時,出現(xiàn)了一些

18、麻煩。總之,我們還需要進(jìn)一步提升自己的能力。6. 參考文獻(xiàn)C吾言程序設(shè)計武雅麗清華大學(xué)出版社C+癰向?qū)ο蟪绦蛟O(shè)計譚浩強(qiáng)清華大學(xué)出版社C吾言課程設(shè)計案例精編李麗娟中國水利水電出版社附錄:源程序/程序名稱:貪吃蛇/制作:莫新存/編譯環(huán)境:VisualC+6.0EasyX/#include#include#include#include#include#include#include#include#definerandom(a,b)(rand()%(b)-(a)+(a)#pragmacomment(lib,Winmm.lib)/加入背景音樂時使用usingnamespacestd;#defineM

19、AX_JOINTS200#defineMV_RIGHT1#defineMV_LEFT2#defineMVUP3#defineMV_DOWN4intrnd1,rnd2;vectorvox;/* 圖形界面初始化函數(shù)*/vectorvoy;voidInitGraph(void);void DrawFence(void);void GameOver(int score);void GamePlay(void);void PrScore(int score);void fun_pause();void fun_reset();void fun_obstacle();struct Foodint x;in

20、t y;int addFood;struct Snakeint xMAX_JOINTS;int yMAX_JOINTS;int joint;int direction;int life;void play()/*繪制游戲場景*/*結(jié)束游戲*/*玩游戲具體過程*/*顯示分?jǐn)?shù)*/*暫停游戲*/*重置游戲*/*設(shè)置障礙物*/*食物的結(jié)構(gòu)體定義*/*食物的橫坐標(biāo)*/*食物的縱坐標(biāo)*/*判斷是否要出現(xiàn)食物的變量*/*蛇的結(jié)構(gòu)體定義*/*保存蛇身每一節(jié)位于屏幕上的列坐標(biāo)*/*保存蛇身每一節(jié)位于屏幕上的行坐標(biāo)*/*蛇的節(jié)數(shù)*/*蛇移動方向*/*蛇的生命,0活著,1死亡*/initgraph(800,600)

21、;InitGraph();DrawFence();GamePlay();getch();intmain()mciSendString(playmo.mp3,NULL,0,NULL);/播放音樂play();return0;/初始化voidInitGraph()cleardevice();setbkcolor(BLUE);setcolor(WHITE);cleardevice();setfont(25,0,_T(微軟雅黑);outtextxy(170,150,GreedySnake);outtextxy(219,254,Ready?);getch();setbkcolor(0);cleardev

22、ice();/繪制游戲場景voidDrawFence()inti;setbkcolor(LIGHTGREEN);setlinestyle(PS_SOLID,5);/畫圍墻setfillstyle(LIGHTBLUE);for(i=50;i=591;i+=10)/rectangle(i,40,i+10,49);/上邊bar(i,40,i+7,47);bar(i,551,i+7,558);/下邊f(xié)or(i=40;i0&score%50=0)fun_obstacle();voidGamePlay()inti,key;intgamespeed=200;/控制游戲速度*/表示需要出現(xiàn)新食物/ 記錄游戲得

23、分食物結(jié)構(gòu)體變量蛇結(jié)構(gòu)體變量,0 表示已經(jīng)存在食物/ 置蛇的生命狀態(tài)為活著/ 置蛇頭方向往右/ 置蛇頭初始位置置蛇的初始節(jié)數(shù)為 2/ 顯示游戲得分intscore=0;structFoodfood;structSnakesnake;food.addFood=1;/1snake.life=0;snake.direction=MV_RIGHT;snake.x0=100;snake.y0=100;snake.x1=110;snake.y1=100;snake.joint=2;/PrScore(score);/重復(fù)玩游戲,直到按Esc鍵結(jié)束srand(time(NULL);while(1)while(

24、!kbhit()mciSendString(playmo.mp3,NULL,0,NULL);/播放音樂/ 需要出現(xiàn)新食物if(food.addFood=1)food.x=rand()%400+60;food.y=rand()%350+60;/食物出現(xiàn)后必須在整格內(nèi)才能讓蛇吃到while(food.x%10!=0)food.x+;while(food.y%10!=0)food.y+;food.addFood=0;/畫面上有食物if(food.addFood=0)/畫面上有食物,則顯示setcolor(GREEN);rectangle(food.x,food.y,food.x+10,food.y-

25、10);/在沒有按鍵的情況下,蛇自己移動身體for(i=snake.joint-1;i0;i-)/蛇的每個節(jié)往前移動snake.xi=snake.xi-1;snake.yi=snake.yi-1;/1,2,3,4表示右,左,上,下四個方向,來決定蛇頭的移動switch(snake.direction)caseMV_RIGHT:snake.x0+=10;break;caseMV_LEFT:snake.x0-=10;break;caseMV_UP:snake.y0-=10;break;caseMV_DOWN:snake.y0+=10;break;/從蛇的第四節(jié)開始判斷是否撞到自己,因?yàn)樯哳^為兩節(jié),

26、第三節(jié)不可能拐過來for(i=3;isnake.joint;i+)if(snake.xi=snake.x0&snake.yi=snake.y0)GameOver(score);/顯示失敗snake.life=1;/蛇死*/break;/判斷蛇是否撞到墻壁if(snake.x0595|snake.y0455)GameOver(score);/本次游戲結(jié)束snake.life=1;/蛇死for(intobs_i=0;obs_ivox.size();obs_i+)/判斷是否撞到障礙物if(voxobs_i=snake.x0&voyobs_i=snake.y0)GameOver(score);/以上三

27、種判斷以后,如果蛇死就跳出內(nèi)循環(huán),重新開始if(snake.life=1)break;吃到食物后if(snake.x0=food.x&snake.y0=food.y)/把畫面上的食物清除setcolor(0);rectangle(food.x,food.y,food.x+10,food.y-10);/新的一節(jié)先放在看不見的位置,下次循環(huán)就取前一節(jié)的位置snake.xsnake.joint=-20;snake.ysnake.joint=-20;/ 蛇的身體長一節(jié)snake.joint+;food.addFood = 1;/ 畫面上需要出現(xiàn)新食物score+=10;/ 輸出新得分PrScore(score);/畫蛇setcolor(RED);for(i=0;isnake.joint;i+)rectangle(snake.xi,snake.yi,snake

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論