![C語(yǔ)言課程設(shè)計(jì)報(bào)告-貪吃蛇源程序_第1頁(yè)](http://file4.renrendoc.com/view10/M00/02/27/wKhkGWVomZmAPebIAACnfUXMEgU178.jpg)
![C語(yǔ)言課程設(shè)計(jì)報(bào)告-貪吃蛇源程序_第2頁(yè)](http://file4.renrendoc.com/view10/M00/02/27/wKhkGWVomZmAPebIAACnfUXMEgU1782.jpg)
![C語(yǔ)言課程設(shè)計(jì)報(bào)告-貪吃蛇源程序_第3頁(yè)](http://file4.renrendoc.com/view10/M00/02/27/wKhkGWVomZmAPebIAACnfUXMEgU1783.jpg)
![C語(yǔ)言課程設(shè)計(jì)報(bào)告-貪吃蛇源程序_第4頁(yè)](http://file4.renrendoc.com/view10/M00/02/27/wKhkGWVomZmAPebIAACnfUXMEgU1784.jpg)
![C語(yǔ)言課程設(shè)計(jì)報(bào)告-貪吃蛇源程序_第5頁(yè)](http://file4.renrendoc.com/view10/M00/02/27/wKhkGWVomZmAPebIAACnfUXMEgU1785.jpg)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C語(yǔ)言課程設(shè)計(jì)(小游戲貪吃蛇的程序設(shè)計(jì)報(bào)告)設(shè)計(jì)人:班級(jí):201年月號(hào)一:概述1:研究背景及意義2:設(shè)計(jì)的任務(wù)與需要知識(shí)點(diǎn)3:具體完成設(shè)計(jì)容二:需求分析1:功能需求2:操作方法三:總體設(shè)計(jì)1:模塊劃分2:數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)四:詳細(xì)設(shè)計(jì)1:主空摸塊設(shè)計(jì)2:繪制游戲界面3:游戲的具體過(guò)程4:游戲的結(jié)束處理5:顯示排行榜信息模塊五:程序的調(diào)試與測(cè)試1:動(dòng)畫(huà)與音樂(lè)同步2:蛇的運(yùn)行3:終止程序六:結(jié)論七::結(jié)束語(yǔ)八:程序清單九:參考文獻(xiàn)概述本課程設(shè)計(jì)以軟件工程方法為指導(dǎo),采用了結(jié)構(gòu)化,模塊化的程序設(shè)計(jì)方法,以C語(yǔ)言技術(shù)為基礎(chǔ),使用TurboC++3.0為主要開(kāi)發(fā)工具,對(duì)貪吃蛇游戲進(jìn)行了需求分析,總體設(shè)計(jì),詳細(xì)設(shè)計(jì),最終完成系統(tǒng)的實(shí)現(xiàn)與測(cè)試。研究的背景及意義隨著社會(huì)的發(fā)展,人們生活的節(jié)奏日益加快,越來(lái)越多的人加入了全球化的世界。人們不再拘泥與一小塊天地,加班,出差成了現(xiàn)代人不可避免的公務(wù)。而此時(shí)一款可以隨時(shí)隨地娛樂(lè)的游戲成為了人們的需要。此次課程設(shè)計(jì)完成的貪吃蛇小游戲,正是為了滿足上述需求而設(shè)計(jì)出來(lái)的。貪吃蛇游戲雖小,卻設(shè)計(jì)諸多的知識(shí)點(diǎn)。通過(guò)開(kāi)發(fā)貪吃蛇游戲系統(tǒng),可使讀者初步了解使用軟件工程的和那個(gè)發(fā),技術(shù)和工具開(kāi)發(fā)軟件的過(guò)程,進(jìn)一步掌握結(jié)構(gòu)化,模塊化的程序設(shè)計(jì)方法和步驟,進(jìn)一步掌握總體數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì),模塊劃分方法,掌握局部變量,全局變量,結(jié)構(gòu)體,共用體,數(shù)組,指針,文件等數(shù)據(jù)結(jié)構(gòu)的使用方法,掌握?qǐng)D形,聲音,隨機(jī)數(shù)等多種庫(kù)函數(shù)的使用方法,學(xué)習(xí)動(dòng)畫(huà),音樂(lè),窗口,菜單,鍵盤(pán)等多項(xiàng)編程技術(shù),進(jìn)一步學(xué)會(huì)軟件調(diào)試,測(cè)試,組裝等軟件測(cè)試方法,為后續(xù)課程的學(xué)習(xí)和將來(lái)實(shí)際軟件開(kāi)發(fā)打下堅(jiān)實(shí)的基礎(chǔ)。設(shè)計(jì)的任務(wù)和需要的知識(shí)點(diǎn)課程設(shè)計(jì)主要完成的任務(wù).通過(guò)編寫(xiě)“貪吃蛇游戲”程序,掌握結(jié)構(gòu)化,模塊塊化程序設(shè)計(jì)的思想,培養(yǎng)解決實(shí)際問(wèn)題的能力。有同步播放動(dòng)畫(huà),聲音效果。設(shè)計(jì)好數(shù)組元素與蛇,食物的對(duì)應(yīng)關(guān)系。隨機(jī)產(chǎn)生食物。有分?jǐn)?shù)統(tǒng)計(jì),排行榜,分?jǐn)?shù)存儲(chǔ)等功能。通過(guò)此次課程設(shè)計(jì),希望使讀者能更深入的理解和掌握課程教學(xué)中的基本概念,培養(yǎng)讀者應(yīng)用基本技術(shù)解決實(shí)際問(wèn)題的能力,從而進(jìn)一步提高分析問(wèn)題和解決問(wèn)題的能力。需要掌握和運(yùn)用的知識(shí)點(diǎn)本次課程設(shè)計(jì)需要掌握和運(yùn)用如下的知識(shí)點(diǎn):數(shù)組的應(yīng)用。全局變量的使用。按鍵處理。4)結(jié)構(gòu)體的應(yīng)用。5)圖形,音樂(lè)和動(dòng)畫(huà)的有關(guān)知識(shí)。6)隨即函數(shù)的使用。7)文件的基本出操作。8)結(jié)構(gòu)化,模塊化的設(shè)計(jì)方法。1.3具體完成的設(shè)計(jì)容在本次課程設(shè)計(jì)中需要完成的任務(wù)有:包含命令,全局變量的定義和宏定義,函數(shù)聲明等(50行),主控模塊(MAIN函數(shù),14行),動(dòng)畫(huà),音樂(lè)播放模塊(DRAWSNOW函數(shù),33行),畫(huà)出游戲開(kāi)始界面模塊,具體游戲過(guò)程模塊,游戲結(jié)束處理模塊。開(kāi)發(fā)中工作量約為215行源代碼。二.需求分析貪吃蛇游戲是個(gè)簡(jiǎn)單的小游戲,能讓游戲者的身心得到娛樂(lè),從而能夠更好地投入到學(xué)習(xí)或工作當(dāng)中。雖然現(xiàn)在市面上出來(lái)這各種各樣的游戲版本,可是貪吃蛇這類的小游戲其市場(chǎng)還是相當(dāng)大的,因?yàn)樗娣ê?jiǎn)單易行,不論是手機(jī),還是小游戲機(jī),都能很順利的運(yùn)行。對(duì)于在外忙碌的人,不可能花費(fèi)大量時(shí)間在娛樂(lè)上,大型游戲是行不通的,這樣的小游戲剛好迎合了他們的需求。功能的需求要開(kāi)發(fā)貪吃蛇游戲程序,首先要分析改程序應(yīng)實(shí)現(xiàn)哪些功能。對(duì)貪吃蛇游戲程序的功能需求可描述如下:程序運(yùn)行后顯示動(dòng)畫(huà),音樂(lè),按ESC鍵退出游戲界面后,左邊有一個(gè)矩形區(qū),外游戲區(qū)域,在矩形區(qū)中有食物和貪食蛇,上方有統(tǒng)計(jì)分?jǐn)?shù)及關(guān)數(shù)顯示區(qū)域。蛇在封閉圍墻利用綠色矩形表示,圍墻里隨機(jī)的出現(xiàn)一個(gè)食物,通過(guò)按鍵盤(pán)四個(gè)光標(biāo)鍵控制蛇向上,下,左右四個(gè)方向移動(dòng),蛇頭撞到食物,則食物被吃掉,蛇身體長(zhǎng)一節(jié),接著又出現(xiàn)食物,等待蛇來(lái)吃。食物用一個(gè)點(diǎn)表示,并且每次食物的位置都是隨機(jī)出現(xiàn)的。游戲中要使貪吃蛇盡可能的長(zhǎng),但是不能使貪吃蛇撞到四周的墻壁,而且蛇的身體不能撞到一起,否則游戲結(jié)束。游戲中每吃掉一個(gè)食物要有積分,隨著分?jǐn)?shù)的增加可進(jìn)入下一關(guān),即使速度會(huì)加快。游戲結(jié)束時(shí),如果分?jǐn)?shù)進(jìn)入前5名則重新排榜并存儲(chǔ)。顯示排行榜。由于有關(guān)貪吃蛇和食物的數(shù)據(jù)較多,而且關(guān)系密切,貪吃蛇及食物都是定義結(jié)構(gòu)體數(shù)據(jù)類型,這樣定義便于操作與處理。操作方法進(jìn)入游戲游戲界面游戲操作游戲結(jié)束三總體設(shè)計(jì)確定貪吃蛇游戲體系結(jié)構(gòu),給出總體模塊結(jié)構(gòu)圖,確定程序的主要函數(shù)及之間的調(diào)用關(guān)系,同時(shí)設(shè)計(jì)蛇與游戲者等的數(shù)據(jù)結(jié)構(gòu)。模塊劃分本程序采用結(jié)構(gòu)化程序設(shè)計(jì)的方法,按照自頂向下,逐步細(xì)化的方法對(duì)要解決的問(wèn)題進(jìn)行逐層分解。首先畫(huà)出頂層模塊,即主控模塊,之完成對(duì)下層模塊的調(diào)用功能,即調(diào)用其他的功能模塊;接著,按需求分析中的功能需求設(shè)計(jì)第一層模塊,有音樂(lè)動(dòng)畫(huà),圖形驅(qū)動(dòng),畫(huà)主界面,游戲過(guò)程,結(jié)束處理,退出等第6個(gè)主要功能;接著,畫(huà)出第二層模塊??傮w模塊結(jié)構(gòu)如圖6-1所示。主控模塊。動(dòng)畫(huà)音樂(lè)模塊畫(huà)主界面模塊游戲過(guò)程模塊游戲結(jié)束處理模塊讀取記錄模塊成績(jī)排序模塊寫(xiě)入文件模塊排行榜模塊退出總體數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)設(shè)計(jì)思路:測(cè)序的關(guān)鍵在于表示蛇的圖形及蛇的移動(dòng)。用一個(gè)小局限性方塊表示蛇的一節(jié)身體,身體每長(zhǎng)一節(jié),增加一個(gè)矩形塊,蛇頭業(yè)用同樣的一節(jié)小矩形方塊表示移動(dòng)時(shí)必須從蛇可以上向前爬行,檔案下有效方向鍵后,應(yīng)先確定蛇頭的位置,而后蛇的身體雖蛇頭移動(dòng),圖形的實(shí)現(xiàn)是從身體新位置開(kāi)始畫(huà)出蛇。這時(shí),由于未清屏的原因,原來(lái)的蛇的位置和新蛇的位置差一節(jié)蛇身,即看起來(lái)蛇多一節(jié)身體,所以將蛇的最后一節(jié)用背景色覆蓋。食物的出現(xiàn)與消失意識(shí)畫(huà)矩形塊和覆蓋矩形塊。為了便于理解,定義兩個(gè)結(jié)構(gòu)體:食物與蛇。下面介紹貪吃蛇游戲程序的主要數(shù)據(jù)結(jié)構(gòu)。食物與蛇的數(shù)據(jù)結(jié)構(gòu)表示食物與蛇的矩形塊設(shè)計(jì)為10*10個(gè)像素單位,食物的基本數(shù)據(jù)域?yàn)樗霈F(xiàn)的位置用X和Y坐標(biāo)表示,則矩形塊用函數(shù)RECTANGLE(X,Y,X+10,Y+10)或RECTANGLE(X,Y,X+10,丫-10)可以畫(huà)出。由于每次只出現(xiàn)一個(gè)食物,所以設(shè)定YES表示是否需要出現(xiàn)食物。YES=1表示沒(méi)有食物或食物已經(jīng)被蛇吃掉,需要畫(huà)出食物。放置食物后,置YES=0。蛇的一節(jié)身體為一個(gè)矩形塊,表示矩形塊只需左上角點(diǎn)坐標(biāo)(X,Y)。由于在游戲過(guò)程中蛇的身體不斷增長(zhǎng),需用數(shù)組存放每節(jié)坐標(biāo),最大設(shè)定為N=200,NODE表示當(dāng)前節(jié)數(shù)。DIRECTION是保存蛇的移動(dòng)方向的變量,其值可為1、2、3、4之一,分別表示右、左、上、下的方向。1小岳是表示生命的變量,LIFE=0表示蛇活著,一旦LIFE=1,一旦LIFE=1,表示蛇死,結(jié)束游戲。#defineN200StructFood{intx;inty;Intyes;}food;StructSnake{intx[N];Inty[N];Intnode;Intderection;Intlife;}snake;排行榜中優(yōu)勝者的數(shù)據(jù)結(jié)構(gòu)排行榜主要記錄優(yōu)勝者的和成績(jī)。為了存放排行榜信息,可定義如下的結(jié)構(gòu)體類型,其中字符數(shù)組name成員存放優(yōu)勝者的,整型變量score成員存放優(yōu)勝者的成績(jī)。Structperson{charname[20];Intscore;};其他全局變量的定義Structpersonper[5];Intscore=0;Intgamespeed=400;符號(hào)常量的宏定義define LEFT 0x4b00;define RIGHT 0x4d00;define DOWN 0x5000;define UP 0x4800
#define#define#define#defineESC0x011bFILENAME四.詳細(xì)設(shè)計(jì)根據(jù)總體設(shè)計(jì)的模塊功能和結(jié)構(gòu),完成所承擔(dān)的程序模塊的算法設(shè)計(jì)。給出每個(gè)模塊的詳細(xì)的算法,算法分別用傳統(tǒng)流程圖和文字說(shuō)明來(lái)描述。主控模塊main函數(shù)主函數(shù)是程序的主控模塊。首先初始化圖形系統(tǒng),然后使用drawsnow函數(shù)播放動(dòng)畫(huà)和聲音,接著調(diào)用init函數(shù)初始化圖形系統(tǒng),之后調(diào)用drawk函數(shù)畫(huà)出游戲開(kāi)始畫(huà)面,在調(diào)用gameplay函數(shù),即開(kāi)始了游戲的具體過(guò)程,游戲結(jié)束后調(diào)用endplay函數(shù)進(jìn)行游戲結(jié)束處理;從文件中讀取記錄信息,排序,顯示排行榜信息,最后關(guān)閉圖形系統(tǒng),結(jié)束程序。主控模塊的流程圖如圖6-2所示。其中帶有兩個(gè)豎線的矩形框表示對(duì)自定義函數(shù)的調(diào)用。余下流程圖在下頁(yè)余下流程圖在下頁(yè)繪制游戲開(kāi)始界面drawk函數(shù)繪制游戲界面的函數(shù)的算法流程圖如圖6-3所示。主界面就是一個(gè)封閉的圍墻,用兩個(gè)循環(huán)語(yǔ)句分別在水平方向和垂直方向輸出連續(xù)的寬度和高的均為10個(gè)像素單位的距行小方塊,圍成封閉圖形表示圍墻,為了醒目,設(shè)置為淡
青色,用函數(shù)setlinestyle設(shè)直線型寬度為3個(gè)像素,設(shè)置3個(gè)像素的圍墻線,。最后,在界面的左上部輸出游戲程序的版本信息,在右上部輸出游戲成績(jī)(score)和關(guān)(level)的表頭。游戲具體過(guò)程gameplay函數(shù)該函數(shù)是游戲的核心部分。游戲具體過(guò)程gameplay函數(shù)的大致算法流程圖如圖6-4所示。下面對(duì)該算法不夠詳細(xì)的地方作進(jìn)一步的描述。
窗蛇身,蛇死蛇撞墻置蛇死標(biāo)志蛇死吃到物吃后處理循環(huán)畫(huà)蛇延遲10秒除蛇尾,增節(jié)蛇死接受按鍵keykey=ESC由按鍵判蛇的位置初始化為防止食物總是出現(xiàn)在一個(gè)位置上,要設(shè)置隨機(jī)數(shù)發(fā)生器的種子數(shù),產(chǎn)生真正的隨機(jī)數(shù)。由于還沒(méi)有畫(huà)出食物,并設(shè)置需要食物,并設(shè)置蛇活著。初始時(shí),蛇只有蛇頭和1節(jié)蛇尾,設(shè)置這2節(jié)坐標(biāo)。設(shè)定蛇開(kāi)始的爬行方向左右。隨機(jī)確定食物位置由于蛇吃到食物的判斷是蛇頭的坐標(biāo)和食物的坐標(biāo)相等,所以要確保食物出現(xiàn)的位置在10的倍數(shù)位置上。先用兩個(gè)帶隨機(jī)函數(shù)的表達(dá)式產(chǎn)生一個(gè)位于圍墻的x、y坐標(biāo),然后用兩個(gè)while循環(huán)將兩個(gè)坐標(biāo)值調(diào)整到10的倍數(shù)上,這樣就可以讓蛇吃到。循環(huán)確定蛇身的新坐標(biāo)
這里的難點(diǎn)是表示蛇的新位置并消除前一次的圖形。采用的方法是每次移動(dòng)的時(shí)候從最后一節(jié)開(kāi)始到第二節(jié),將前一節(jié)的坐標(biāo)值賦給后一節(jié)的坐標(biāo),移動(dòng)后只要把最后一節(jié)用背景色擦出即可,因?yàn)樾挛恢?到n-1節(jié)還是要出現(xiàn)在畫(huà)面上的。這里用一個(gè)for循環(huán)來(lái)確定蛇身的新坐標(biāo)。吃到食物后的處理蛇吃到食物后,首先將食物擦除,即用背景色畫(huà)出該食物,然后給蛇的節(jié)數(shù)加1,設(shè)置需要食物標(biāo)志,是游戲成績(jī)加10分,如果成績(jī)達(dá)到50分的倍數(shù),則給關(guān)數(shù)加1,并加快游戲速度。有按鍵判斷蛇的方向這是一個(gè)嵌的嵌套的條件選擇結(jié)構(gòu),根據(jù)安東上下左右鍵來(lái)設(shè)定蛇的移動(dòng)方向。其中1=向右,2=向左,3=向上,4=向下。判斷是還考慮相反的方向鍵無(wú)效,比如蛇正在向上爬行,按下一鍵方向是無(wú)效的。游戲的結(jié)束處理木塊ENDPLAY函數(shù)游戲結(jié)束時(shí),應(yīng)該用ENDPLAY函數(shù)進(jìn)行游戲結(jié)束處理,其算法流程圖如圖6-5所示該塊首先調(diào)用讀取排行榜文件的記錄,如果文件不2存在,則在READFILES函數(shù)中調(diào)用INITSCOREFILES函數(shù)建立該文件,然后再讀出記錄。其次,判斷游戲者的成績(jī)是否可以上排行榜。如果可以上榜,則畫(huà)出淡藍(lán)色矩形界面,在界面中輸入游戲者,對(duì)成績(jī)進(jìn)行賦值,然后調(diào)用CompareScore函數(shù)對(duì)記錄排序,并調(diào)用Writefiles函數(shù)將記錄寫(xiě)入排行榜幫文件;如果不能上榜,則直接在游戲界面輸出不能上榜信息。最后,調(diào)用pain_board函數(shù)顯示排行榜信息。函數(shù)voidpain_board完成排行榜的繪制.五.程序的調(diào)試與測(cè)試調(diào)試與測(cè)試軟件的目標(biāo)就是發(fā)現(xiàn)并改正潛伏的錯(cuò)誤。一個(gè)程序,必須經(jīng)過(guò)認(rèn)真的調(diào)試和測(cè)試,才能盡量減少錯(cuò)誤、保證程序滿足功能、性能需求,達(dá)到最初的設(shè)計(jì)、使用要求,從而保證程序的開(kāi)發(fā)質(zhì)量。詳細(xì)設(shè)計(jì)完成后,就可以用C語(yǔ)言根據(jù)各個(gè)模塊的算法來(lái)設(shè)計(jì)程序,每個(gè)模塊都要設(shè)計(jì)成一個(gè)自定義函數(shù)。幾個(gè)模塊可以放在一起構(gòu)成一個(gè)原函數(shù)程序文件,也可以一個(gè)模塊構(gòu)成一個(gè)源程序文件。原程序設(shè)計(jì)好后,輸入到計(jì)算機(jī)中,并存儲(chǔ)到磁盤(pán)上;然后對(duì)每個(gè)源程序文件都進(jìn)行了獨(dú)立編譯和調(diào)試(具體代碼可以參看程序清單);并針對(duì)不同的模塊程序設(shè)計(jì)測(cè)試用例進(jìn)行單元測(cè)試;最后,將幾個(gè)分別開(kāi)發(fā)的模塊組裝在一起,形成一個(gè)完整的程序,進(jìn)行集成測(cè)試,從而發(fā)現(xiàn)并改正了程序程序中存在的一些潛藏的錯(cuò)誤,并使程序的容錯(cuò)能力大大增強(qiáng)。5.1動(dòng)畫(huà)與音樂(lè)的同步播放預(yù)期結(jié)果:①片頭在顯示動(dòng)畫(huà)得同時(shí)播放音樂(lè);②按任意鍵后進(jìn)入游戲主界面;③進(jìn)入游戲主界面后動(dòng)畫(huà)音樂(lè)同時(shí)停止。實(shí)際運(yùn)行效果:滿足①和②,不滿足③,即進(jìn)入游戲后仍然播放片頭音樂(lè)。錯(cuò)誤分析:程序中使用循環(huán)播放動(dòng)畫(huà),并在其循環(huán)體中插入發(fā)聲函數(shù)以達(dá)到音樂(lè)和動(dòng)畫(huà)的同步。由于在結(jié)束動(dòng)畫(huà)時(shí)沒(méi)有關(guān)閉揚(yáng)聲器,所以進(jìn)入游戲界面后仍然發(fā)聲。修改:在動(dòng)畫(huà)播放完后加一條“nosound()”語(yǔ)句將揚(yáng)聲器關(guān)閉,問(wèn)題得到解決。
修改后程序運(yùn)行的實(shí)際效果與預(yù)期效果一致蛇撞到墻預(yù)期結(jié)果:蛇運(yùn)行時(shí)如果撞到墻壁,則游戲結(jié)束。實(shí)際運(yùn)效果:超出左右墻壁后程序結(jié)束,但超出上面墻壁后仍然運(yùn)行,如圖6-9所示。錯(cuò)誤分析:錯(cuò)誤程序段在蛇運(yùn)行中的條件判斷語(yǔ)句中,其判斷條件是:if(snake.x[0]<55||snake.x[0]>595),即少了上、下兩個(gè)方向的判斷。修改:在蛇的運(yùn)行過(guò)程中添加兩個(gè)邏輯表達(dá)式,判斷蛇是否闖到上下的圍墻。代碼:If(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455)修改后的程序運(yùn)行結(jié)果與預(yù)期的結(jié)果一致。蛇頭闖到蛇身預(yù)期的結(jié)果:當(dāng)蛇得頭部與蛇身相撞時(shí),游戲應(yīng)當(dāng)結(jié)束。實(shí)際運(yùn)行效果:蛇頭撞到蛇身時(shí),程序并不終止
錯(cuò)誤分析:在蛇的運(yùn)行判斷的程序出錯(cuò),其代碼如下Fori=3;i<snake.node;i++){if(snake.x[i]=snake.x[0]&&snake.y[i]=snake.y[0]){snake.life=0;break;}}修改:將循環(huán)體中的snake.life=0改為snake.life=1;修改后的結(jié)果與預(yù)期結(jié)果一致。終止循環(huán)經(jīng)過(guò)對(duì)各個(gè)模塊的調(diào)試和單元測(cè)試并修改了錯(cuò)誤后,將各個(gè)模塊組裝成一個(gè)系統(tǒng),并進(jìn)行集成測(cè)試。在集成的過(guò)程中發(fā)現(xiàn)了一些錯(cuò)誤,比如全局變量重復(fù)定義、函數(shù)重復(fù)聲明等,分別進(jìn)行了改正。最后連續(xù)運(yùn)行了5次,以便測(cè)試該游戲程序的功能、性能是否達(dá)到了預(yù)期的目標(biāo),并根據(jù)所使用的具體機(jī)器對(duì)蛇的爬行速度進(jìn)行適當(dāng)?shù)恼{(diào)整。測(cè)試容包括蛇的運(yùn)行、分?jǐn)?shù)、關(guān)數(shù)、排行榜及排序、文件存儲(chǔ)、音樂(lè)動(dòng)畫(huà)等功能,情況均正常。六.結(jié)論通過(guò)2周的課程設(shè)計(jì),在開(kāi)發(fā)小組共同的努力下,終于完成了貪吃蛇游戲程序的開(kāi)發(fā)任務(wù)。該游戲程序?qū)崿F(xiàn)了用方向鍵控制蛇在圍墻爬行、隨機(jī)產(chǎn)生食物、控制蛇吃掉食物并加分、控制游戲中闖關(guān)的數(shù)目和蛇的運(yùn)行速度、實(shí)時(shí)顯示得分和關(guān)數(shù)、結(jié)束時(shí)處理和顯示排行榜等功能。該游戲程序具有界面友好、操作方便、控制準(zhǔn)確和容錯(cuò)能力強(qiáng)等特點(diǎn)。這個(gè)貪吃蛇游戲還存在一些缺陷,還應(yīng)該在如下幾個(gè)方面加以改進(jìn)。1)進(jìn)入游戲后,到蛇死亡,只能玩一次就會(huì)退出程序。應(yīng)加入多次游戲的控制能力。2)蛇的樣子不美觀,應(yīng)將蛇頭、蛇尾和蛇身進(jìn)一步美化,使其更像真實(shí)的蛇。3)當(dāng)分?jǐn)?shù)達(dá)到400分時(shí),蛇的速度變得非常快,一下子就撞到圍墻上了,應(yīng)適當(dāng)控制蛇的速度和關(guān)數(shù),以便使游戲更具有吸引力。.結(jié)束語(yǔ)貪吃蛇游戲的編程練習(xí)思考數(shù)據(jù)結(jié)構(gòu):定義食物的坐標(biāo)來(lái)控制它出現(xiàn)的位置,用一系列的函數(shù)時(shí)進(jìn)行表示,比如用函數(shù)rectangle來(lái)畫(huà)出矩形,用life變量的值表示蛇的生命,用direction變量的值表示蛇移動(dòng)的方向等,還有用數(shù)組來(lái)存放蛇身各節(jié)的坐標(biāo),這些都讓我們熟悉了對(duì)數(shù)組的操作,此外還熟悉了各種函數(shù)的應(yīng)用。貪吃蛇的設(shè)計(jì)有很多幫助,學(xué)習(xí)編寫(xiě)貪吃蛇的游戲?qū)φ莆誄語(yǔ)言的知識(shí)有很大的幫助。通過(guò)編程實(shí)踐,還能拓展思路,讓我們?nèi)ふ倚枰{(diào)用那些函數(shù),怎樣提高程序的質(zhì)量等。要寫(xiě)出好的程序,需要我們有扎實(shí)的基礎(chǔ),這樣遇到一些基本算法的時(shí)候就會(huì)游刃有余了。在編程時(shí)我們要有豐富的想象力,不要拘泥與固定的思維方式,遇到問(wèn)題的時(shí)侯要多想幾種解決問(wèn)題的方案。豐富的想象力是建立在豐富的知識(shí)基礎(chǔ)上,所以我們要通過(guò)多個(gè)途徑來(lái)幫助自己建立較豐富的知識(shí)結(jié)構(gòu)。在編程是我們碰倒了很多的困難,這就需要我們多與別人交流。在編程的過(guò)程中,我們也發(fā)現(xiàn)有良好的編程風(fēng)格是十分重要的,至少在時(shí)間效率上就體現(xiàn)了這一點(diǎn)。養(yǎng)成良好的習(xí)慣,代碼的縮進(jìn)編排,變量的命名規(guī)則要始終保持一致,這些都是提高我們編程能力的要點(diǎn)。在進(jìn)行課程設(shè)計(jì)的過(guò)程中我們也學(xué)到了許多別的東西。首先,我們學(xué)會(huì)了合作,要以別人的眼光看看問(wèn)題,也許這樣得到的會(huì)比各自得到的都要多;其次,我們學(xué)會(huì)了分工,分工是為了更好地合作,分工才能提高合作的效率;最后,我們學(xué)會(huì)了奮斗,我們相信,通過(guò)四年的學(xué)習(xí),我們一定能寫(xiě)出更精彩的程序,將來(lái)會(huì)描繪出更精彩的人生。在這里,我們要感指導(dǎo)課程設(shè)計(jì)的鳳君老師,給予我們悉心的指導(dǎo)。老師多次詢問(wèn)編寫(xiě)進(jìn)程,并為我們指點(diǎn)迷津,幫助我們開(kāi)拓研究思路,精心點(diǎn)撥、熱心鼓勵(lì)。老師一絲不茍的工作作風(fēng),嚴(yán)謹(jǐn)?shù)膽B(tài)度,踏踏實(shí)實(shí)的精神,不僅受我以文,而且教我做人,給以終生受益無(wú)窮之道。我還要感我們開(kāi)發(fā)小組的其他同學(xué),在設(shè)計(jì)中他們給我很大的幫助。正是由于我們團(tuán)結(jié)協(xié)作,才順利的完成了課程設(shè)計(jì)任務(wù)。.程序清單/*貪吃蛇游戲程序清單*/#include<stdio.h>#include<string.h>#include<time.h>#include<bios.h>#include<graphics.h>#include<conio.h>#include<stdlib.h>#include<dos.h>#definefilename"c:\\person.dat" /*排行榜文件的文件全名*/#defineesc0x011b/*esc鍵*/#definen200/*蛇的最大節(jié)數(shù)*/#defineleft0x4b00 /*左移方向鍵*/#defineright0x4d00 /*右移放向鍵*/#definedown0x5000 /*下移方向鍵*/#defineup0x4800 /*上移方向鍵*//*排行榜結(jié)構(gòu)體*/structperson{intscore; /*游戲者分?jǐn)?shù)*/charname[20]; /*游戲者*/}per[5];/*小蘑菇結(jié)構(gòu)體*//*自定義的函數(shù)聲明*/voiddrawmogu();/*動(dòng)畫(huà)音樂(lè)函數(shù)*/voidreadfiles();/*從文件中讀取記錄信息*/voidwritefiles(structperson*); /*將紀(jì)錄寫(xiě)入文件中*/voidinitscorefiles(); /*初始化記錄文件*/voidcomparescore(structperson); /*排行榜按分?jǐn)?shù)進(jìn)行排序*/voidendplay(); /*游戲結(jié)束處理函數(shù)*/voidpaihb(); /*繪制排行榜函數(shù)*//*輸出歡迎詞并播放聲音函數(shù)*/voidpr(){ints[15]={0,100,150,200,250,300,250,150,100,250,350};setcolor(change/10);/*改變歡迎詞顏色*/settextstyle(0,0,4);outtextxy(20,200,"WELCOMETOOURGAME");/*輸出歡迎詞*/sound(s[change/10]);/*使揚(yáng)聲器以括號(hào)的頻率發(fā)聲*/}/*下雪的動(dòng)畫(huà)并同步播放音樂(lè)函數(shù)*/voidDrawSnow(){inti;intsx[62];selinestyle(SOLID_LINE,0,THICK_WIDTH);打口?(1,1,9,9);/*一次3行畫(huà)出白色雪花的3條線必line(0,5,10,5);line(9,1,1,9);save=malloc(200);/*在堆中申請(qǐng)200字節(jié)空間*/getimage(0,0,10,10,save);/*將雪花位圖保存到save中*/cleardevice();/*清屏*/randomize();/*設(shè)置隨機(jī)種子數(shù)*/for(i=0;i<62;i++)sx[i]=(i+2)*10/*計(jì)算雪花位置的橫坐標(biāo)數(shù)組*//*以下的鍵控while循環(huán)控制播放音樂(lè)和下雪動(dòng)畫(huà)*/亞說(shuō)^^^由乜戶/米如果未按鍵,執(zhí)行循環(huán)體*/{Pr();/*調(diào)用Pr函數(shù)輸出歡迎詞并播放聲音*/if(snownum!=100){snow[snownum].speed=2+random(5);i=random(62);snow[snownum].x=sx[i];/*取橫坐標(biāo)*/snow[snownum].y=10-random(100);/*取縱坐標(biāo)*/}/*循環(huán)放置snownum個(gè)雪花*/for(i=0;i<snownum;i++)putimage(snow[i].x,snow[i].y,save,COPY_PUT);delay(100);/*延遲100ms以便看到雪花*/cleardevice();/*清屏*/Pr(); /*調(diào)用Pr函數(shù)輸出歡迎詞并播放聲音*/if(snownum!=100)snownum++;setfillstyle(SOLID_FILL,15);for(i=0;i<snownum;i++)/*循環(huán)畫(huà)出snownum個(gè)雪花*/{snow[i].y+=snow[i].speed;putimage(snow[i].x,snow[i].y,save,COPY_PUT);if(snow[i].y>500)snow[i].y=10-random(200);}change++;if(change==140)change=10;}nosound();/*關(guān)閉揚(yáng)聲器*/cleardevice();/*清屏*/}/*圖像系統(tǒng)初始化函數(shù)*/voidinit(void){intgd=DETECT,gm;initgraph(&gd,&gm,"c:\\tc3\\BGI");cleardevice();/*清屏*/}/*游戲開(kāi)始界面,左上角坐標(biāo)為(50,40),右下角坐標(biāo)(610,460)的圍墻*/voiddrawk(void){inti;setcolor(BLUE);setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*設(shè)置線性*/for(i=50;i<=600;i+=10) /*用循環(huán)畫(huà)圍墻*/{setcolor(2*i+1);circle(i,40,5); /*畫(huà)上邊*/circle(i,451,5);circle(i,460,5);/*畫(huà)下邊*/}for(i=40;i<=450;i+=10){setcolor(2*i+1);circle(50,i,5); /*畫(huà)左邊*/circle(601,i,5);}for(i=40;i<=460;i+=10){setcolor(2*i+1);circle(41,i,5); /*畫(huà)右邊*/circle(610,i,5);}setcolor(LIGHTCYAN);setlinestyle(SOLID_LINE,0,THICK_WIDTH);outtextxy(20,5," GREEDYSNAKEGAMESji11_1");/*輸出版本*/outtextxy(480,10,"scorelevel");/*輸出此文本*/}/*玩游戲具體過(guò)程*/voidgameplay(void){food.yes=1;/*0表示蘋(píng)果已經(jīng)存在,1表示需要出現(xiàn)新蘋(píng)果*/snake.life=0; /*蛇活著*/intlevel=1; /*記錄游戲等級(jí)*/charbuffer[10];/*字符數(shù)組用于轉(zhuǎn)換整形數(shù)據(jù)*/randomize(); /*設(shè)置隨機(jī)數(shù)的種子數(shù)*/snake.direction=1;/*方向向右*/snake.x[0]=110;snake.y[0]=100; /*蛇頭坐標(biāo)初值*/snake.x[1]=100;snake.y[1]=100;/*蛇身1節(jié)坐標(biāo)初值*/snake.x[2]=90;snake.y[2]=100; /*蛇身2節(jié)坐標(biāo)初值*/snake.node=3; /*蛇節(jié)數(shù)初值*/while(1)/*玩游戲死循環(huán),按esc鍵或蛇死時(shí)結(jié)束*/{while(!kbhit()) /*在沒(méi)有按鍵的情況下,蛇自己移動(dòng)身體*/{if(food.yes==1)/*需要出現(xiàn)新蘋(píng)果*/{food.x=rand()%400+60; /*在墻隨機(jī)產(chǎn)生蘋(píng)果橫坐標(biāo)*/food.y=rand()%350+60; /*在墻隨機(jī)產(chǎn)生蘋(píng)果縱坐標(biāo)*//*事物隨機(jī)產(chǎn)生后必須讓蘋(píng)果能夠在整格上,這樣才能吃到*/while(food.x%10!=0)food.x++;while(food.y%10!=0)food.y++;food.yes=0; /*畫(huà)面上有蘋(píng)果了*/}if(food.yes==0) /*畫(huà)面上有蘋(píng)果就要畫(huà)出來(lái)*/{setcolor(GREEN);setfillstyle(SOLID_FILL,GREEN);circle(food.x,food.y,5);fillellipse(food.x,food.y,5,5);}setfillstyle(1,BLUE);bar(475,18,590,35);/*畫(huà)出顯示分?jǐn)?shù)及關(guān)數(shù)藍(lán)色矩形條*/setcolor(WHITE);itoa(score,buffer,10);/*將整形數(shù)據(jù)分?jǐn)?shù)轉(zhuǎn)換成字符串*/outtextxy(480,20,buffer); /*輸出分?jǐn)?shù)*/itoa(level,buffer,10); /*將整形數(shù)據(jù)關(guān)數(shù)轉(zhuǎn)換成字符串*/outtextxy(560,20,buffer); /*輸出關(guān)數(shù)*//*循環(huán)使蛇的每一節(jié)往前移動(dòng),這是貪吃蛇的“關(guān)鍵算法”*/for(i=snake.node-1;i>0;i--){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1];}/*1、2、3、4表示右、左、上、下四個(gè)方向,通過(guò)這個(gè)判斷來(lái)移動(dòng)蛇頭*/switch(snake.direction){case1:snake.x[0]+=10;break;case2:snake.x[0]-=10;break;case3:snake.y[0]-=10;break;case4:snake.y[0]+=10;break;}/*判斷蛇是否撞到墻*/if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<45||snake.y[0]>445){snake.life=1;/*置蛇死標(biāo)志*/break;}/*從蛇的第四節(jié)開(kāi)始判斷是否撞到自己,*/for(i=3;i<snake.node;i++){if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]){snake.life=1;/*置蛇死標(biāo)志*/break;}}if(snake.life==1)/*以上兩種判斷以后,如果蛇死就跳出循環(huán)*/break; /*跳出while(!kbhit)*/if(snake.x[0]==food.x&&snake.y[0]==food.y) /*吃到蘋(píng)果以后*/{setcolor(BLACK); /*把畫(huà)面上的蘋(píng)果擦除*/circle(food.x,food.y,5);snake.node++;/*蛇的身體長(zhǎng)一節(jié)*/food.yes=1;/*畫(huà)面上需要出現(xiàn)新的蘋(píng)果*/score+=10;/*沒(méi)吃一個(gè)蘋(píng)果增加10分*/if(score%50==0) /*吃夠5個(gè)蘋(píng)果進(jìn)入下一關(guān)*/{level+=1;/*關(guān)數(shù)加1*/gamespeed-=60; /*控制速度的值減少60,以便加快速度*/}}setcolor(RED);/*畫(huà)出紅色蛇的循環(huán)*/setfillstyle(SOLID_FILL,RED); /*用圓畫(huà)出紅色蛇頭*/fillellipse(snake.x[0],snake.y[0],5,5);setcolor(GREEN);setfillstyle(SOLID_LINE,GREEN);circle(snake.x[0],snake.y[0],1); /*對(duì)蛇頭填充綠色小圓作為眼睛*/setcolor(RED);setfillstyle(SOLID_FILL,BLUE);for(i=1;i<snake.node;i++) /*用圓畫(huà)出紅色蛇身*/{setcolor(RED);setfillstyle(SOLID_FILL,BLUE);fillellipse(snake.x[i],snake.y[i],5,5);/*對(duì)每節(jié)蛇身用藍(lán)色填充*/setcolor(CYAN);circle(snake.x[i],snake.y[i],1);/*用青色小圓畫(huà)在每節(jié)蛇身上*/}delay(gamespeed);/*延遲gamespeed毫秒,以便控制蛇的爬行速度*/setcolor(BLACK); /*用背景色黑色去除蛇的最后一節(jié)*/circle(snake.x[snake.node-1],snake.y[snake.node-1],5);setfillstyle(SOLID_FILL,BLACK);fillellipse(snake.x[snake.node-1],snake.y[snake.node-1],5,5);}if(snake.life==1)break;/*如果蛇死就跳出循環(huán)*/key=bioskey(0);/*接收按鍵*/if(key==esc)break;/*按esc鍵退出*//*判斷是否往相反的方向運(yùn)動(dòng)*/elseif(key==up&&snake.direction!=4)snake.direction=3;elseif(key==right&&snake.direction!=2)snake.direction=1;elseif(key==left&&snake.direction!=1)snake.direction=2;elseif(key==down&&snake.direction!=3)snake.direction=4;}/*endwhile(1)*/} /*結(jié)束游戲*//*讀取文件操作函數(shù)*/voidreadfiles(){FILE*fpread;/*如果文件不存在,則創(chuàng)建1個(gè)空文件,否則打開(kāi)該文件*/if((fpread=fopen(filename,"ab+"))==NULL){printf("cant'topenthefileperson.dat!");exit(0);}if(fgetc(fpread)==EOF)/*如果文件容為空*/initscorefiles();/*調(diào)用函數(shù)進(jìn)行記錄初始化工作*/rewind(fpread);/*重新復(fù)位文件位置指針*/fread(per,sizeof(structperson),5,fpread);fclose(fpread);/*關(guān)閉排行榜文件*/}/*寫(xiě)入文件操作函數(shù)*/voidwritefiles(structperson*tmp){FILE*fpwrite;/*以讀寫(xiě)方式打開(kāi)文件,文件原有的數(shù)據(jù)將被清空*/if((fpwrite=fopen(filename,"wb+"))==NULL){printf("cant'topenthefileperson.dat!");exit(0);}fwrite(tmp,sizeof(structperson),5,fpwrite);fclose(fpwrite);}/*初始化記錄函數(shù)*/voidinitscorefiles(){inti;structpersona[5];for(i=0;i<5;i++){a[i].score=0;/*5人的分?jǐn)?shù)為0*/strcpy(a[i].name,"nobody");/*5人的名為nobody*/}writefiles(a);/*調(diào)用記錄寫(xiě)入函數(shù)*/}/*排序函數(shù),如果玩家分?jǐn)?shù)超過(guò)最低記錄,則將玩家分?jǐn)?shù)插入到合適的位置,同時(shí)刪除原先的最低記錄*/voidcomparescore(structpersondes){inti,j;for(i=0;1<5;i++){if(des.score>=per[i].score){if(i<5){for(j=4;j>=i+1;j--)per[j]=per[j-1];}per[i]=des;break;}}}/*顯示排行榜信息*/voidpaihb(){inti;charstring[10];readfiles();/*調(diào)用讀取文件中存在的記錄函數(shù)*/setfillstyle(1,9);bar(482,227,599,239);/**/outtextxy(490,230,"highestboard"); /*輸出此文本*/setcolor(15);rectangle(480,255,600,240);/*畫(huà)矩形*/setcolor(8);rectangle(481,226,601,241); /*畫(huà)矩形*/setfillstyle(1,7);bar(475,257,610,426); /*畫(huà)矩形線*/setcolor(15);line(475,257,610,257);/*畫(huà)線*/line(475,257,475,426);setcolor(8);line(475,426,610,426);line(610,257,610,426);setcolor(1);outtextxy(480,26
溫馨提示
- 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òng)方案策劃
- 雙11小活動(dòng)策劃方案
- 現(xiàn)服科技發(fā)展與創(chuàng)新人才培訓(xùn)模式探討
- 匯報(bào)技巧構(gòu)建高效商業(yè)匯報(bào)的核心要素
- 國(guó)慶節(jié)活動(dòng)方案披薩
- 7 角的初步認(rèn)識(shí) 第二課時(shí)(說(shuō)課稿)-2023-2024學(xué)年二年級(jí)下冊(cè)數(shù)學(xué)蘇教版001
- Unit 11 Chinese festivals(period 1)(說(shuō)課稿)-2023-2024學(xué)年滬教牛津版(深圳用)英語(yǔ)五年級(jí)下冊(cè)001
- 16 家鄉(xiāng)新變化(說(shuō)課稿)2023-2024學(xué)年統(tǒng)編版道德與法治二年級(jí)上冊(cè)
- 2023四年級(jí)數(shù)學(xué)上冊(cè) 二 加減法的關(guān)系和加法運(yùn)算律第5課時(shí)說(shuō)課稿 西師大版
- 2023九年級(jí)物理下冊(cè) 第十一章 物理學(xué)與能源技術(shù)11.3能源說(shuō)課稿 (新版)教科版
- 統(tǒng)編小學(xué)《道德與法治》三年級(jí)上下冊(cè)教材的解讀
- 人教版(2024)英語(yǔ)七年級(jí)上冊(cè)單詞表
- 產(chǎn)業(yè)鏈競(jìng)爭(zhēng)關(guān)聯(lián)度
- TTJSFB 002-2024 綠色融資租賃項(xiàng)目評(píng)價(jià)指南
- 涵洞施工鋼筋混凝土圓管涵
- 高考地理一輪復(fù)習(xí)學(xué)案+區(qū)域地理填圖+亞洲
- 全新車位轉(zhuǎn)讓協(xié)議模板下載(2024版)
- 高中數(shù)學(xué)必修一試卷及答案
- 砌筑工考試卷及答案
- 呼吸治療師進(jìn)修匯報(bào)
- 智慧港口和自動(dòng)化集裝箱碼頭
評(píng)論
0/150
提交評(píng)論