貪吃蛇游戲程序設(shè)計_第1頁
貪吃蛇游戲程序設(shè)計_第2頁
貪吃蛇游戲程序設(shè)計_第3頁
貪吃蛇游戲程序設(shè)計_第4頁
貪吃蛇游戲程序設(shè)計_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、測控技術(shù)與儀器專業(yè)課程設(shè)計題單班級0982011學(xué)生劉某某課程名稱計算機課程設(shè)計課 題貪吃蛇游戲程序設(shè)計設(shè)計要求 1學(xué)習(xí)游戲設(shè)計有關(guān)知識。2設(shè)計貪吃蛇游戲程序。3.調(diào)試并修改程序。4完成課程設(shè)計論文。課題發(fā)給日期2011年6月25日課程設(shè)計完成日期2011年7月09日指導(dǎo)教師余某某評語:貪吃蛇游戲?qū)W生姓名:劉某某班級:0882011指導(dǎo)老師:余某某摘要:編寫C語言程序?qū)崿F(xiàn)貪吃蛇游戲,貪吃蛇游戲是一個深受人們喜 愛的游戲,一條蛇在密閉的圍墻內(nèi),在圍墻內(nèi)隨機出現(xiàn)一個食物,通過按 鍵盤上的四個光標鍵控制蛇向上下左右四個方向移動,蛇頭撞到食物,則表示食物被蛇吃掉,這時蛇的身體長一節(jié),同時計 10分,接

2、著又出現(xiàn)食 物,等待被蛇吃掉,如果蛇在移動過程中,撞到墻壁或身體交叉蛇頭撞到 自己的身體游戲結(jié)束。作為一個完整的程序,必須考慮人機交流與用戶體驗。游戲的界面不 能太丑,更不能連個簡單的界面都沒有。游戲應(yīng)該有個比較漂亮的界面, 在有必要硬件支持和軟件的支持下,游戲開發(fā)者必須最大限度的使游戲美 觀。游戲的美觀是一方面,游戲的內(nèi)在素質(zhì)是另一方面。一個游戲的優(yōu)劣, 最終由玩家決定。在游戲與玩家見面之前,游戲開發(fā)者要設(shè)計一種讓玩家 投入的游戲模式,并且在一定的游戲規(guī)則下進行。關(guān)鍵詞:貪吃蛇 流程圖 c語言 源程序1前言 12課設(shè)內(nèi)容 32.1 課設(shè)目的32.2 設(shè)計功能32.3 結(jié)構(gòu)設(shè)計73結(jié)論 11參

3、考文獻 15附錄 A 161前言C語言是一種易學(xué)易懂的通用程序設(shè)計語言,由于它具有功能性強, 運用簡潔,靈活兼有高級語言與低級語言的優(yōu)點,以及“目標程序效率高” 可移植性和能在各種系統(tǒng)上普遍實現(xiàn)等特點使它成為當今世界上的主流 程序設(shè)計語言之一,同時被選作目前全世界廣泛應(yīng)用,同時也是大學(xué)生必 修的科目。作為一位當代的大學(xué)生更要很好的利用它,學(xué)好一門設(shè)計語言, 實現(xiàn)學(xué)以至用。制作C程序報告,可以鞏固和加深自己對C語言課程的基本知識的理 解和掌握,并且能夠掌握C語言編程和程序調(diào)試的基本技能。通過游戲程序的設(shè)計訓(xùn)練可以提高自己的基本技能, 更好地掌握字符串的 表示方法和字符串函數(shù)的功能、Tc圖形操作的

4、基本知識、鍵盤上特殊鍵 的獲取以及圖形方式下光標的顯示, 提高自己編程興趣與編程水平,學(xué)會 如何正確的書寫程序設(shè)計說明文檔,提高運用 C語言解決實際問題的能 力,鞏固C語言語法規(guī)則的理解和掌握,學(xué)會通過源程序?qū)懗隽鞒虉D,提 高自學(xué)以及查閱資料的能力。C語言課程應(yīng)注重邊學(xué)邊練,但由于課堂教學(xué)和實驗的深度和廣度有 限,練習(xí)的深度也受到一定限制。為了彌補這一點,學(xué)校開設(shè)了本課程設(shè) 計。它比教學(xué)實驗復(fù)雜一些,涉及的深度廣些并更加接近實用。目的是通 過課程設(shè)計的綜合訓(xùn)練,培養(yǎng)我們實際分析問題、編程和動手能力,最終 目標是想通過這種形式,幫助我們系統(tǒng)地掌握程序設(shè)計的主要內(nèi)容, 更好 地完成學(xué)業(yè)。這次課程設(shè)

5、計的主要特點如下:1 函數(shù)定義是要做到顧名思義是很重要的,它對讀程序的人正確認識程 序十分重要,在修改這個程序的過程中也能很快找到程序各模塊的作用,大大增加了程序的可讀性。2.分析函數(shù)先從main()函數(shù)入手。Main()函數(shù)是C源程序編譯時的開始, 從main()函數(shù)開始讀函數(shù)可將其他函數(shù)的功能理解得更透徹。3在做程序的時候先列框架,將這個程序所要達到的目的(功能)分析出來,選擇正確的數(shù)據(jù)結(jié)構(gòu)然后在將程序模塊化,按照模塊編寫函數(shù)更加簡單合理。4我還了解了很多的庫函數(shù)的作用,如字符串函數(shù)中有很多對字符串進行處理的函數(shù),起功能我都有所了解。5 它獨立于具體的C語言教科書,重點放在C語言的基本特征

6、上, 以 不變應(yīng)萬變,涵蓋C語言的重要基礎(chǔ)知識,讓我們熟練掌握 C語言的 實際使用。6結(jié)合實際應(yīng)用的要求,使課程設(shè)計既覆蓋知識點,又接近工程實際需 要。激發(fā)學(xué)習(xí)興趣,調(diào)動我們主動學(xué)習(xí)的積極性,并會根據(jù)實際編程要求, 訓(xùn)練自己實際分析問題的能力及編程能力,并養(yǎng)成良好的編程習(xí)慣。7提供綜合的課程設(shè)計理念,以期進一步鍛煉學(xué)生的動手能力。同時讓 同學(xué)合作完成這些實驗,以便鍛煉互相合作精神,培養(yǎng)團隊意識。8 通過觀察網(wǎng)絡(luò)的實例,循序漸進地啟發(fā)學(xué)生完成設(shè)計。課程設(shè)計將要 求、算法和源程序分開,為學(xué)生創(chuàng)造獨立思考的條件。學(xué)生在充分理解要 求和算法的前提下,設(shè)計自己的應(yīng)用程序。同時我也獲得了許多寶貴的經(jīng)驗:1

7、) 在設(shè)計程序之前,務(wù)必要對你所設(shè)計的題目和內(nèi)容有一個系統(tǒng)的了解 , 知道所設(shè)計的題目和內(nèi)容包含那些資源。2) 設(shè)計程序采用什么編程語言并不是非常重要,關(guān)鍵要有一個清晰的思 路和一個完整的軟件流程圖,因而,要先把設(shè)計原理與思路搞清楚,再把流 程圖畫出來,這樣設(shè)計起來就簡單多了。3)在設(shè)計程序時,不能妄想一次就將整個程序設(shè)計好,“反復(fù)修改,不斷改 進”是程序設(shè)計的必經(jīng)之路,發(fā)現(xiàn)錯誤也是取得成績的一種。4)要養(yǎng)成注釋程序的好習(xí)慣,一個程序的完美與否不僅僅是實現(xiàn)功能,而 應(yīng)該讓人一看就能明白你的思路,這樣也為資料的保存和交流提供了方 便。2課設(shè)內(nèi)容2.1設(shè)計目的通過課程設(shè)計的綜合訓(xùn)練,培養(yǎng)我們實際分

8、析問題、編程和動手能力, 據(jù)課堂講授內(nèi)容,學(xué)生做相應(yīng)的自主練習(xí),消化課堂所講解的內(nèi)容;通過 調(diào)試典型例題或習(xí)題積累調(diào)試 C程序的經(jīng)驗;通過完成輔導(dǎo)教材中的編程 題,逐漸培養(yǎng)學(xué)生的編程能力、用計算機解決實際問題的能力。最終目標 是想通過這種形式,幫助我們系統(tǒng)地掌握程序設(shè)計的主要內(nèi)容, 更好地完 成學(xué)業(yè)。2.2設(shè)計功能在這次課射中,我選擇的是貪吃蛇游戲的制作,游戲是人們生活中不 可或缺的,一個人從小到大,真正伴隨他成長的東西,游戲占有著很重要的 地位.不論是一個玩具,還是一個能和伙伴一起開心的小游戲,都是能給我 們留下很多美好的回憶所以不論是什么樣的游戲,只要它能迎合人們內(nèi) 心的某種需求,它的市場

9、總會是好的,而貪吃蛇是一個深受人們喜愛的游 戲,一條蛇在密閉的圍墻內(nèi),在圍墻內(nèi)隨即出現(xiàn)一個食物,通過按鍵上的 四個光標鍵控制向上下左右四個方向移動, 蛇頭撞到食物,則表示食物被 吃掉,這時蛇身體長一節(jié),同時計 10分,接著又出現(xiàn)食物,等待被蛇吃 掉,如果蛇在移動過程中,撞到墻壁或身體交叉蛇頭撞到自己的身體則游 戲結(jié)束。本程序運行實現(xiàn)的主要技巧在二維數(shù)組的應(yīng)用上, 程序運行時,游戲 界面如下圖所示,邊框表示圍墻,黑色單獨方塊表示食物:II I f II II F III圖2.1游戲界面2.3結(jié)構(gòu)設(shè)計程序關(guān)鍵在于表示蛇的圖形及蛇的移動。用一個小矩形快表示蛇的一 節(jié)身體,身體每長一節(jié),增加一個矩形塊

10、,蛇頭用倆節(jié)表示。移動時必須 從蛇頭開始,所以蛇不能向相反的方向移動,如果不按任意鍵,蛇自行在 當前方向上前移,但按下有效方向鍵后,蛇頭朝著該方向移動,一步移動 一節(jié)身體,所以按下有效方向鍵后,先確定蛇頭的位置,而后蛇的身體隨 蛇頭移動,圖形的實現(xiàn)是從蛇頭新位置開始畫出蛇,這時,由于未清屏的原因,原來的蛇的位置和新蛇的位置差一個單位,所以看起來蛇多一節(jié)身 體,所以將蛇的最后一節(jié)用背景色覆蓋。食物的出現(xiàn)與消失也是畫矩形塊 和覆蓋矩形塊。為了便于理解,定義兩個結(jié)構(gòu)體:食物與蛇。2.3.1 數(shù)據(jù)結(jié)構(gòu)表示食物和蛇的矩形都設(shè)計為10 X 10個像素單位,食物的基本數(shù)據(jù) 域為它所出現(xiàn)的位置,用X和y坐標表

11、示,則矩形塊用函數(shù) rectangle(x,y,x+10,y+10)或 rectangle(x,y,x+10,y-10)可以畫出。由于每次只出現(xiàn)一個食物,而食物被吃掉后,才出現(xiàn)下一個食物,所以設(shè)定 yes表示是否要出現(xiàn)一個食物的變量。蛇的一節(jié)身體為一個矩形塊,這樣表示每個矩形塊只需起點坐標x和y。身體是不斷增長的,所以用數(shù)組存放每一節(jié)的坐標,最大設(shè)定為 N=200,node表示當 前節(jié)數(shù)。另外還需要保存蛇移動方向的變量 direction和表示生命的變量life ,一但life 為1,則蛇死,游戲結(jié)束。所以程序功能的實現(xiàn)就是數(shù)組的操作。#define N 200struct Foodint x

12、/*食物的橫坐標*/int y/*食物的縱坐標*/int yes ; food ;/*struct sn akeint xN;/*int yN;/*int node;int directi on int life;snake ;232 ma in ()主函數(shù)/*判斷是否出現(xiàn)食物的變量*/食物的結(jié)構(gòu)體*/蛇的橫坐標*/蛇的縱坐標*/* 蛇的節(jié)數(shù)*/;/* 蛇移動方向*/* 蛇生命,0活著,1死亡*/主函數(shù)是程序的主流程,首先定義使用到的常數(shù)、全局變量及函數(shù)原 型說明,然后初始化圖形系統(tǒng),調(diào)用函數(shù) DrawK()畫出開始畫面,調(diào)用函 數(shù)GamePlay(),即玩游戲的具體過程,游戲結(jié)束后調(diào)用Clo

13、se()關(guān)閉圖形 系統(tǒng),結(jié)束程序void mai n(void)/*主函數(shù) */Init();/* 圖形驅(qū)動*/DrawK();/*開始畫面*/GamePlay();/*玩游戲具體過程*/Close();/* 圖形結(jié)束*/void Init(void)/*圖形驅(qū)動 */int gd=DETECT,gm;in itgraph(&gd,&gm,c:tc); /*第一個參數(shù)表示圖形適配器的類型,第二個為在該類型下圖形的顯示模式,第三個參數(shù)指定驅(qū)動程序所在目錄。*/cleardevice();233畫界面函數(shù)DrawK ()主界面就是一個密封的圍墻,用兩個循環(huán)語句分別在水平方向和垂直 方向輸出連續(xù)的寬

14、度和高度均為10個單位的矩形小方塊,圍成密閉圖形,表示圍墻,為了醒目,設(shè)置淡青顏色,用函數(shù)setl in estyle (SOLD_LINE, 0,THICK_WIDTH設(shè)置線型寬度為3個像素。設(shè)置3個像 素的圍墻線,蛇在貼墻走的時候,會擦掉部分圍墻線,使線變細,圖形變 得不好看,如果不想這種情況出現(xiàn),則將線型寬度設(shè)置為1個像素。void DrawK(void)/*開始畫面,左上角坐標為(50,40),右下角坐標為(610,460)的圍墻 */setbkcolor(O);/*設(shè)置當前背景顏色*/setcolor(YELLOW);/* 設(shè)置當前畫線顏色*/setlinestyle(SOLID_L

15、INE,O,THICK_WIDTH);/*設(shè)置線型 */for(i=50;i=600;i+=10)/* 畫圍墻 */recta ngle(i,40,i+10,49); /*上邊 */recta ngle(i,451,i+10,460);/*下邊 */for(i=40;i0;i-)/*蛇的每個環(huán)節(jié)往前移動,貪吃蛇的關(guān)鍵算法*/sn ake.xi=s nake.xi-1;sn ake.yi=s nake.yi-1;switch(snake.direction)/* 定義1,2,3,4 表示右,左,上,下四個方向, 通過這個判斷來移動蛇頭*/case 1:s nake.x0+=10;break;ca

16、se 2: sn ake.x0-=10;break;case 3: sn ake.y0-=10;break;case 4: sn ake.y0+=10;break;for(i=3;is nake .n ode;i+)/*從蛇的第四節(jié)開始判斷是否撞到自己了,因為蛇頭為兩節(jié),第三節(jié)不可能拐過來*/if(sn ake.xi=s nake.x0&sn ake.yi=s nake.y0)GameOver();/*顯示失敗 */sn ake.life=1;break;if(sn ake.x0595|s nake.y0455)/*蛇是否撞到墻壁*/GameOver();/* 本次游戲結(jié)束*/sn ake.l

17、ife=1; /*蛇死 */if(snake.life=1)/*以上兩種判斷以后,如果蛇死就跳出內(nèi)循環(huán),重新開始*/break;if(snake.x0=food.x&snake.y0=food.y)/*吃到食物以后 */setcolor(0);/*把畫面上的食物東西去掉*/recta ngle(food.x,food.y,food.x+10,food.y-10);sn ake.xs nake .no de=-20;s nake.ys nake .no de=-20; /*-20表示尾巴長一節(jié)*/*新的一節(jié)先放在看不見的位置,下次循環(huán)就取前一節(jié)的位置*/snake.node+;/*蛇的身體長一節(jié)

18、*/food.yes=1;/* 畫面上需要出現(xiàn)新的食物*/score+=10;PrScore();/* 輸出新得分*/setcolor(4);for(i=0;is nake. node;i+)/*畫出蛇 */recta ngle(s nake.xi,s nake.yi,s nake.xi+10,sn ake.yi-10);delay(gamespeed);setcolor(0);/*用黑色去除蛇的的最后一節(jié)*/recta ngle(s nake.xs nake. no de-1,s nake.ys nake. no de-1,sn ake.xs nake .no de-1+10,s nake.

19、ys nake .no de-1-10); /*endwhile(! kbhit)*/if(snake.life=1)/*如果蛇死就跳出循環(huán)*/break;key=bioskey(0);/* 接收按鍵 */if(key=ESC)/* 按 ESC鍵退出 */break;elseif(key=UP&sn ake.directio n!=4)/*判斷是否往相反的方向移動*/sn ake.directi on=3;elseif(key=RIGHT&sn ake.directio n!=2)sn ake.direct ion=1;elseif(key=LEFT&sn ake.directio n!=1)

20、sn ake.direct ion=2;elseif(key=DOW N&sn ake.directio n!=3)sn ake.directi on=4;/*en dwhile(1)*/2.3.5 游戲結(jié)束函數(shù)GameOver ()游戲結(jié)束,清除屏幕,輸出分數(shù),顯示游戲結(jié)束信息void GameOver(void)/* 游戲結(jié)束 */cleardevice();PrScore();setcolor(RED);settextstyle(0,0,4);outtextxy(200,200,guojia n);getch();void PrScore(void)/* 輸出成績 */char str1

21、O;setfillstyle(SOLID_FILL, WHITE);bar(50,15,200,35);setcolor(6);settextstyle(0,0,2);spri ntf(str,score:%d,score);outtextxy(55,20,str);void Close(void)/*圖形結(jié)束 */getch();closegraph();2.3.6 輸出分數(shù)函數(shù)PrScore ()在指定的位置利用sprintf ()將整數(shù)轉(zhuǎn)換為字符串,用outtextxy () 輸出,bar ()函數(shù)的應(yīng)用是為了覆蓋原來的值。2.3.7 圖形結(jié)束函數(shù)Close ()在顯示游戲結(jié)束信息的畫面

22、時,按任意鍵關(guān)閉圖形系統(tǒng),程序結(jié)束。2.3.8系統(tǒng)總體方案介紹貪吃蛇原理:游戲貪吃蛇就是在液晶屏幕上畫出蛇,同時隨機地給出食物。游戲者通過鍵盤操作控制貪吃蛇的移動,去吃食物,吃到后食物消失,然后再隨機給出食物同時蛇的身體增長。畫蛇的原理就是利用人眼的視覺效應(yīng)先將 蛇頭向前移動一格,然后所有蛇身依次向前移動一格,最后再擦除蛇尾。 這樣在人眼看來好像蛇在向前移動。食物的給出,首先需要產(chǎn)生一個隨機 數(shù),然后通過這個隨機數(shù)計算得到食物的橫縱坐標,在液晶屏上顯示出來??刂粕叩囊苿臃较颍枰獟呙桄I盤,然后根據(jù)鍵值改變蛇的移動方向239 游戲流程圖進入游戲#include #in elude #defi n

23、e LEFT 0x4b00#defi ne RIGHT 0x4d00#defi ne DOWN 0x5000#defi ne UP 0x4800#defi ne ESC 0x011bint i,key;int score=0;/* 得分 */int gamespeed=50000;/*游戲速度自己調(diào)整*/struct Food int x;/*食物的橫坐標*/int y;/*食物的縱坐標*/int yes;/*判斷是否要出現(xiàn)食物的變量*/food;/* 食物的結(jié)構(gòu)體*/struct Sn akeint xN;int yN;int node;/* 蛇的節(jié)數(shù)*/int direction;/*蛇移

24、動方向 */int life;/*蛇的生命,0活著,1死亡*/sn ake;void Init(void);/*圖形驅(qū)動 */void Close(void);/* 圖形結(jié)束 */void DrawK(void);/*開始畫面 */void GameOver(void);/*結(jié)束游戲 */void GamePlay(void);/*玩游戲具體過程 */void PrScore(void);/*輸出成績 */*主函數(shù)*/void main (void)Init();/*圖形驅(qū)動*/DrawK();/*開始畫面*/GamePlay();/*玩游戲具體過程*/Close();/*圖形結(jié)束*/*圖形驅(qū)

25、動*/void In it(void)int gd=DETECT,gm;in itgraph(&gd,&gm,c:tc);cleardevice();void DrawK(void)/*setbkcolor(LIGHTGREEN);*/setcolor(11);設(shè)置線型*/setli nestyle(SOLID_LINE,O,THICK_WIDTH);/*for(i=50;i=600;i+=10)/* 畫圍墻 */recta ngle(i,40,i+10,49); /*上邊 */recta ngle(i,451,i+10,460);/*下邊 */for(i=40;i0;i-)/*蛇的每個環(huán)節(jié)往

26、前移動,也就是貪吃蛇的關(guān)鍵算法*/sn ake.xi=s nake.xi-1;sn ake.yi=s nake.yi-1;/*1,2,3,4表示右,左,上,下四個方向,通過這個判斷來移動蛇頭*/switch(s nake.directio n)case 1:s nake.x0+=10;break;case 2: sn ake.x0-=10;break;case 3: sn ake.y0-=10;break;case 4: sn ake.y0+=10;break;for(i=3;is nake. node;i+)/*從蛇的第四節(jié)開始判斷是否撞到自己了,因為蛇頭為兩節(jié),第三節(jié)不可能拐過來*/if(sn ake.xi=s nake.x 0&sn ake.yi=s nake.yO)GameOver();/*顯示失敗 */sn ake.life=1;break;if(sn ake.x0595|s nake.y0455)/*蛇是否撞到墻壁*/GameOver();/*sn ake .1 ife=1; /* if(s nake.life=1)/* 開始*/break;本次游戲結(jié)束*/蛇死*/以上兩種判斷以后,如果蛇死就跳出內(nèi)循環(huán),重新if(s nake.x0=food.x&s

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論