C語言課程設(shè)計(jì)報(bào)告——貪吃蛇源程序--精選文檔_第1頁
C語言課程設(shè)計(jì)報(bào)告——貪吃蛇源程序--精選文檔_第2頁
免費(fèi)預(yù)覽已結(jié)束,剩余21頁可下載查看

下載本文檔

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

文檔簡(jiǎn)介

1、C 語 言 課 程 設(shè) 計(jì) (小游戲貪吃蛇的程序設(shè)計(jì)報(bào)告) 設(shè)計(jì)人: 班級(jí): 201 年 月 號(hào) 目 錄一:概述1:研究背景及意義2:設(shè)計(jì)的任務(wù)與需要知識(shí)點(diǎn) 3:具體完成設(shè)計(jì)內(nèi)容二:需求分析1:功能需求 2:操作方法 三:總體設(shè)計(jì)1:模塊劃分 2:數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì) 四:詳細(xì)設(shè)計(jì)1:主空摸塊設(shè)計(jì) 2:繪制游戲界面 3:游戲的具體過程 4:游戲的結(jié)束處理 5:顯示排行榜信息模塊 五:程序的調(diào)試與測(cè)試1:動(dòng)畫與音樂同步 2:蛇的運(yùn)行 3:終止程序 六:結(jié)論 七:結(jié)束語 八:程序清單 九:參考文獻(xiàn) 一 概述 本課程設(shè)計(jì)以軟件工程方法為指導(dǎo),采用了結(jié)構(gòu)化,模塊化的程序設(shè)計(jì)方法,以C語言技術(shù)為基礎(chǔ),使用Tur

2、bo C+3.0為主要開發(fā)工具,對(duì)貪吃蛇游戲進(jìn)行了需求分析,總體設(shè)計(jì),詳細(xì)設(shè)計(jì),最終完成系統(tǒng)的實(shí)現(xiàn)與測(cè)試。1.1 研究的背景及意義 隨著社會(huì)的發(fā)展,人們生活的節(jié)奏日益加快,越來越多的人加入了全球化的世界。人們不再拘泥與一小塊天地,加班,出差成了現(xiàn)代人不可避免的公務(wù)。而此時(shí)一款可以隨時(shí)隨地娛樂的游戲成為了人們的需要。此次課程設(shè)計(jì)完成的貪吃蛇小游戲,正是為了滿足上述需求而設(shè)計(jì)出來的。貪吃蛇游戲雖小,卻設(shè)計(jì)諸多的知識(shí)點(diǎn)。通過開發(fā)貪吃蛇游戲系統(tǒng),可使讀者初步了解使用軟件工程的和那個(gè)發(fā),技術(shù)和工具開發(fā)軟件的過程,進(jìn)一步掌握結(jié)構(gòu)化,模塊化的程序設(shè)計(jì)方法和步驟,進(jìn)一步掌握總體數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì),模塊劃分方法,掌握

3、局部變量,全局變量,結(jié)構(gòu)體,共用體,數(shù)組,指針,文件等數(shù)據(jù)結(jié)構(gòu)的使用方法,掌握?qǐng)D形,聲音,隨機(jī)數(shù)等多種庫函數(shù)的使用方法,學(xué)習(xí)動(dòng)畫,音樂,窗口,菜單,鍵盤等多項(xiàng)編程技術(shù),進(jìn)一步學(xué)會(huì)軟件調(diào)試,測(cè)試,組裝等軟件測(cè)試方法,為后續(xù)課程的學(xué)習(xí)和將來實(shí)際軟件開發(fā)打下堅(jiān)實(shí)的基礎(chǔ)。1.2 設(shè)計(jì)的任務(wù)和需要的知識(shí)點(diǎn)1.2.1 課程設(shè)計(jì)主要完成的任務(wù)1) . 通過編寫“貪吃蛇游戲”程序,掌握結(jié)構(gòu)化,模塊塊化程序設(shè)計(jì)的思想,培養(yǎng)解決實(shí)際問題的能力。2) 有同步播放動(dòng)畫,聲音效果。3) 設(shè)計(jì)好數(shù)組元素與蛇,食物的對(duì)應(yīng)關(guān)系。4) 隨機(jī)產(chǎn)生食物。5) 有分?jǐn)?shù)統(tǒng)計(jì),排行榜,分?jǐn)?shù)存儲(chǔ)等功能。 通過此次課程設(shè)計(jì),希望使讀者能更深

4、入的理解和掌握課程教學(xué)中的基本概念,培養(yǎng)讀者應(yīng)用基本技術(shù)解決實(shí)際問題的能力,從而進(jìn)一步提高分析問題和解決問題的能力。1.2.2需要掌握和運(yùn)用的知識(shí)點(diǎn) 1.2.3本次課程設(shè)計(jì)需要掌握和運(yùn)用如下的知識(shí)點(diǎn): 1) 數(shù)組的應(yīng)用。 2) 全局變量的使用。 3) 按鍵處理。 4)結(jié)構(gòu)體的應(yīng)用。 5)圖形,音樂和動(dòng)畫的有關(guān)知識(shí)。 6)隨即函數(shù)的使用。 7)文件的基本出操作。 8) 結(jié)構(gòu)化,模塊化的設(shè)計(jì)方法。 1.3具體完成的設(shè)計(jì)內(nèi)容 在本次課程設(shè)計(jì)中需要完成的任務(wù)有:包含命令,全局變量的定義和宏定義,函數(shù)聲明等(50行),主控模塊(MAIN函數(shù),14行),動(dòng)畫,音樂播放模塊(DRAWSNOW函數(shù),33行),

5、畫出游戲開始界面模塊,具體游戲過程模塊,游戲結(jié)束處理模塊。開發(fā)中工作量約為215行源代碼。二 .需求分析 貪吃蛇游戲是個(gè)簡(jiǎn)單的小游戲,能讓游戲者的身心得到娛樂,從而能夠更好地投入到學(xué)習(xí)或工作當(dāng)中。雖然現(xiàn)在市面上出來這各種各樣的游戲版本,可是貪吃蛇這類的小游戲其市場(chǎng)還是相當(dāng)大的,因?yàn)樗娣ê?jiǎn)單易行,不論是手機(jī),還是小游戲機(jī),都能很順利的運(yùn)行。對(duì)于在外忙碌的人,不可能花費(fèi)大量時(shí)間在娛樂上,大型游戲是行不通的,這樣的小游戲剛好迎合了他們的需求。2.1功能的需求 要開發(fā)貪吃蛇游戲程序,首先要分析改程序應(yīng)實(shí)現(xiàn)哪些功能。對(duì)貪吃蛇游戲程序的功能需求可描述如下: 程序運(yùn)行后顯示動(dòng)畫,音樂,按ESC鍵退出游戲界

6、面后,左邊有一個(gè)矩形區(qū),外游戲區(qū)域,在矩形區(qū)中有食物和貪食蛇,上方有統(tǒng)計(jì)分?jǐn)?shù)及關(guān)數(shù)顯示區(qū)域。 蛇在封閉圍墻利用綠色矩形表示,圍墻里隨機(jī)的出現(xiàn)一個(gè)食物,通過按鍵盤四個(gè)光標(biāo)鍵控制蛇向上,下,左右四個(gè)方向移動(dòng),蛇頭撞到食物,則食物被吃掉,蛇身體長(zhǎng)一節(jié),接著又出現(xiàn)食物,等待蛇來吃。食物用一個(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)系

7、密切,貪吃蛇及食物都是定義結(jié)構(gòu)體數(shù)據(jù)類型,這樣定義便于操作與處理。2.2 操作方法 2.2.1.進(jìn)入游戲 2.2.2.游戲界面 2.2.3.游戲操作 2.2.4.游戲結(jié)束三 總體設(shè)計(jì) 確定貪吃蛇游戲體系結(jié)構(gòu),給出總體模塊結(jié)構(gòu)圖,確定程序的主要函數(shù)及之間的調(diào)用關(guān)系,同時(shí)設(shè)計(jì)蛇與游戲者等的數(shù)據(jù)結(jié)構(gòu)。3.1 模塊劃分本程序采用結(jié)構(gòu)化程序設(shè)計(jì)的方法,按照自頂向下,逐步細(xì)化的方法對(duì)要解決的問題進(jìn)行逐層分解。首先畫出頂層模塊,即主控模塊,之完成對(duì)下層模塊的調(diào)用功能,即調(diào)用其他的功能模塊;接著,按需求分析中的功能需求設(shè)計(jì)第一層模塊,有音樂動(dòng)畫,圖形驅(qū)動(dòng),畫主界面,游戲過程,結(jié)束處理,退出等第6個(gè)主要功能;接

8、著,畫出第二層模塊??傮w模塊結(jié)構(gòu)如圖6-1所示。 主 控 模 板退出結(jié)束處理游戲過程畫主界面 圖形驅(qū)動(dòng)動(dòng)畫音樂排行榜寫入文件成績(jī)排序讀取記錄3.1.1. 主控模塊。3.1.2. 動(dòng)畫音樂模塊3.1.3. 畫主界面模塊3.1.4. 游戲過程模塊3.1.5. 游戲結(jié)束處理模塊3.1.6. 讀取記錄模塊3.1.7. 成績(jī)排序模塊3.1.8. 寫入文件模塊3.1.9. 排行榜模塊3.1.10. 退出3.2 總體數(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í)必須從蛇可以上向前爬行,檔案

9、下有效方向鍵后,應(yīng)先確定蛇頭的位置,而后蛇的身體雖蛇頭移動(dòng),圖形的實(shí)現(xiàn)是從身體新位置開始畫出蛇。這時(shí),由于未清屏的原因,原來的蛇的位置和新蛇的位置差一節(jié)蛇身,即看起來蛇多一節(jié)身體,所以將蛇的最后一節(jié)用背景色覆蓋。食物的出現(xiàn)與消失意識(shí)畫矩形塊和覆蓋矩形塊。為了便于理解,定義兩個(gè)結(jié)構(gòu)體:食物與蛇。下面介紹貪吃蛇游戲程序的主要數(shù)據(jù)結(jié)構(gòu)。3.2.1 食物與蛇的數(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,Y-10)可以畫出。由于每次只出現(xiàn)

10、一個(gè)食物,所以設(shè)定YES表示是否需要出現(xiàn)食物。YES=1表示沒有食物或食物已經(jīng)被蛇吃掉,需要畫出食物。放置食物后,置YES=0。蛇的一節(jié)身體為一個(gè)矩形塊,表示矩形塊只需左上角點(diǎn)坐標(biāo)(X,Y)。由于在游戲過程中蛇的身體不斷增長(zhǎng),需用數(shù)組存放每節(jié)坐標(biāo),最大設(shè)定為N=200,NODE表示當(dāng)前節(jié)數(shù)。DIRECTION是保存蛇的移動(dòng)方向的變量,其值可為1、2、3、4之一,分別表示右、左、上、下的方向。LIFE是表示生命的變量,LIFE=0表示蛇活著,一旦LIFE=1,一旦LIFE=1,表示蛇死,結(jié)束游戲。#define N 200Struct Food int x; int y; Int yes;foo

11、d;Struct Snake int xN;Int yN;Int node;Int derection;Int life;snake;3.2.2 排行榜中優(yōu)勝者的數(shù)據(jù)結(jié)構(gòu)排行榜主要記錄優(yōu)勝者的姓名和成績(jī)。為了存放排行榜信息,可定義如下的結(jié)構(gòu)體類型,其中字符數(shù)組name成員存放優(yōu)勝者的姓名,整型變量score成員存放優(yōu)勝者的成績(jī)。Struct person char name20; Int score;3.2.3 其他全局變量的定義Struct person per5;Int score=0;Int gamespeed=400;3.2.4 符號(hào)常量的宏定義#define LEFT 0x4b00;

12、#define RIGHT 0x4d00;#define DOWN 0x5000;#define UP 0x4800#define ESC 0x011b#define FILENAME四. 詳細(xì)設(shè)計(jì) 根據(jù)總體設(shè)計(jì)的模塊功能和結(jié)構(gòu),完成所承擔(dān)的程序模塊的算法設(shè)計(jì)。給出每個(gè)模塊的詳細(xì)的算法,算法分別用傳統(tǒng)流程圖和文字說明來描述。4.1 主控模塊main函數(shù)主函數(shù)是程序的主控模塊。首先初始化圖形系統(tǒng),然后使用drawsnow函數(shù)播放動(dòng)畫和聲音,接著調(diào)用init函數(shù)初始化圖形系統(tǒng),之后調(diào)用drawk函數(shù)畫出游戲開始畫面,在調(diào)用gameplay函數(shù),即開始了游戲的具體過程,游戲結(jié)束后調(diào)用endplay函

13、數(shù)進(jìn)行游戲結(jié)束處理;從文件中讀取記錄信息,排序,顯示排行榜信息,最后關(guān)閉圖形系統(tǒng),結(jié)束程序。主控模塊的流程圖如圖6-2所示。其中帶有兩個(gè)豎線的矩形框表示對(duì)自定義函數(shù)的調(diào)用。開始 初始化圖形系統(tǒng) 播放動(dòng)畫音樂 余下流程圖在下頁 初始化圖形系統(tǒng) 畫游戲開始界面 游戲具體過程 游戲結(jié)束處理 關(guān)閉圖形系統(tǒng)結(jié)束4.2 繪制游戲開始界面drawk函數(shù) 繪制游戲界面的函數(shù)的算法流程圖如圖6-3所示。 主界面就是一個(gè)封閉的圍墻,用兩個(gè)循環(huán)語句分別在水平方向和垂直方向輸出連續(xù)的寬度和高的均為10個(gè)像素單位的距行小方塊,圍成封閉圖形表示圍墻,為了醒目,設(shè)置為淡青色,用函數(shù)setlinestyle設(shè)直線型寬度為3個(gè)

14、像素,設(shè)置3個(gè)像素的圍墻線,。最后,在界面的左上部輸出游戲程序的版本信息,在右上部輸出游戲成績(jī)(score)和關(guān)(level)的表頭。4.3 游戲具體過程gameplay函數(shù) 該函數(shù)是游戲的核心部分。游戲具體過程gameplay函數(shù)的大致算法流程圖如圖6-4所示。下面對(duì)該算法不夠詳細(xì)的地方作進(jìn)一步的描述。開 始 初始化未按鍵為食物質(zhì)優(yōu)食物標(biāo)志隨即確定食物有食物畫食物輸出成績(jī)和關(guān)數(shù)輸出蛇位置確定蛇頭位置窗蛇身,蛇死 蛇撞墻置蛇死標(biāo)志蛇死吃到物吃后處理循環(huán)畫蛇延遲10秒除蛇尾,增節(jié)蛇死接受按鍵 keykey=ESC結(jié) 束由按鍵判蛇的位置4.3.1 初始化 為防止食物總是出現(xiàn)在一個(gè)位置上,要設(shè)置隨機(jī)

15、數(shù)發(fā)生器的種子數(shù),產(chǎn)生真正的隨機(jī)數(shù)。由于還沒有畫出食物,并設(shè)置需要食物,并設(shè)置蛇活著。初始時(shí),蛇只有蛇頭和1節(jié)蛇尾,設(shè)置這2節(jié)坐標(biāo)。設(shè)定蛇開始的爬行方向左右。4.3.2 隨機(jī)確定食物位置 由于蛇吃到食物的判斷是蛇頭的坐標(biāo)和食物的坐標(biāo)相等,所以要確保食物出現(xiàn)的位置在10的倍數(shù)位置上。先用兩個(gè)帶隨機(jī)函數(shù)的表達(dá)式產(chǎn)生一個(gè)位于圍墻內(nèi)的x、y坐標(biāo),然后用兩個(gè)while循環(huán)將兩個(gè)坐標(biāo)值調(diào)整到10的倍數(shù)上,這樣就可以讓蛇吃到。4.3.3 循環(huán)確定蛇身的新坐標(biāo) 這里的難點(diǎn)是表示蛇的新位置并消除前一次的圖形。采用的方法是每次移動(dòng)的時(shí)候從最后一節(jié)開始到第二節(jié),將前一節(jié)的坐標(biāo)值賦給后一節(jié)的坐標(biāo),移動(dòng)后只要把最后一節(jié)

16、用背景色擦出即可,因?yàn)樾挛恢?到n-1節(jié)還是要出現(xiàn)在畫面上的。這里用一個(gè)for循環(huán)來確定蛇身的新坐標(biāo)。4.3.4 吃到食物后的處理 蛇吃到食物后,首先將食物擦除,即用背景色畫出該食物,然后給蛇的節(jié)數(shù)加1,設(shè)置需要食物標(biāo)志,是游戲成績(jī)加10分,如果成績(jī)達(dá)到50分的倍數(shù),則給關(guān)數(shù)加1,并加快游戲速度。4.3.5 有按鍵判斷蛇的方向 這是一個(gè)內(nèi)嵌的嵌套的條件選擇結(jié)構(gòu),根據(jù)安東上下左右鍵來設(shè)定蛇的移動(dòng)方向。其中1=向右,2=向左,3=向上,4=向下。判斷是還考慮相反的方向鍵無效,比如蛇正在向上爬行,按下一鍵方向是無效的。4.4 游戲的結(jié)束處理木塊ENDPLAY函數(shù)游戲結(jié)束時(shí),應(yīng)該用ENDPLAY函數(shù)進(jìn)

17、行游戲結(jié)束處理,其算法流程圖如圖6-5所示。開 始 讀排行榜記錄文件score>per4.score 畫出填充矩形界面輸出提示信息輸出空格建立輸入框余下流程圖在下頁 輸出不夠上排行榜的信息輸入游戲者的姓名成績(jī)賦值記錄按成績(jī)排序記錄寫入排行榜文件顯示排行榜返回該塊首先調(diào)用讀取排行榜文件的記錄,如果文件不2存在,則在READFILES函數(shù)中調(diào)用INITSCOREFILES函數(shù)建立該文件,然后再讀出記錄。 其次,判斷游戲者的成績(jī)是否可以上排行榜。如果可以上榜,則畫出淡藍(lán)色矩形界面,在界面中輸入游戲者姓名,對(duì)成績(jī)進(jìn)行賦值,然后調(diào)用 CompareScore 函數(shù)對(duì)記錄排序,并調(diào)用 Writefi

18、les 函數(shù)將記錄寫入排行榜幫文件;如果不能上榜,則直接在游戲界面輸出不能上榜信息。 最后,調(diào)用 pain_board 函數(shù)顯示排行榜信息。4.5函數(shù)void pain_board完成排行榜的繪制.五. 程序的調(diào)試與測(cè)試 調(diào)試與測(cè)試軟件的目標(biāo)就是發(fā)現(xiàn)并改正潛伏的錯(cuò)誤。一個(gè)程序,必須經(jīng)過認(rèn)真的調(diào)試和測(cè)試,才能盡量減少錯(cuò)誤、保證程序滿足功能、性能需求,達(dá)到最初的設(shè)計(jì)、使用要求,從而保證程序的開發(fā)質(zhì)量。詳細(xì)設(shè)計(jì)完成后,就可以用C語言根據(jù)各個(gè)模塊的算法來設(shè)計(jì)程序,每個(gè)模塊都要設(shè)計(jì)成一個(gè)自定義函數(shù)。幾個(gè)模塊可以放在一起構(gòu)成一個(gè)原函數(shù)程序文件,也可以一個(gè)模塊構(gòu)成一個(gè)源程序文件。原程序設(shè)計(jì)好后,輸入到計(jì)算機(jī)

19、中,并存儲(chǔ)到磁盤上;然后對(duì)每個(gè)源程序文件都進(jìn)行了獨(dú)立編譯和調(diào)試(具體代碼可以參看程序清單);并針對(duì)不同的模塊程序設(shè)計(jì)測(cè)試用例進(jìn)行單元測(cè)試;最后,將幾個(gè)分別開發(fā)的模塊組裝在一起,形成一個(gè)完整的程序,進(jìn)行集成測(cè)試,從而發(fā)現(xiàn)并改正了程序程序中存在的一些潛藏的錯(cuò)誤,并使程序的容錯(cuò)能力大大增強(qiáng)。5.1 動(dòng)畫與音樂的同步播放預(yù)期結(jié)果:片頭在顯示動(dòng)畫得同時(shí)播放音樂;按任意鍵后進(jìn)入游戲主界面;進(jìn)入游戲主界面后動(dòng)畫音樂同時(shí)停止。實(shí)際運(yùn)行效果:滿足和,不滿足,即進(jìn)入游戲后仍然播放片頭音樂。錯(cuò)誤分析:程序中使用循環(huán)播放動(dòng)畫,并在其循環(huán)體中插入發(fā)聲函數(shù)以達(dá)到音樂和動(dòng)畫的同步。由于在結(jié)束動(dòng)畫時(shí)沒有關(guān)閉揚(yáng)聲器,所以進(jìn)入游

20、戲界面后仍然發(fā)聲。修改:在動(dòng)畫播放完后加一條“nosound();”語句將揚(yáng)聲器關(guān)閉,問題得到解決。修改后程序運(yùn)行的實(shí)際效果與預(yù)期效果一致。5.2 蛇的運(yùn)行 5.2.1 蛇撞到墻預(yù)期結(jié)果:蛇運(yùn)行時(shí)如果撞到墻壁,則游戲結(jié)束。實(shí)際運(yùn)效果:超出左右墻壁后程序結(jié)束,但超出上面墻壁后仍然運(yùn)行,如圖6-9所示。錯(cuò)誤分析:錯(cuò)誤程序段在蛇運(yùn)行中的條件判斷語句中,其判斷條件是:if(snake.x0<55| snake.x0>595),即少了上、下兩個(gè)方向的判斷。修改:在蛇的運(yùn)行過程中添加兩個(gè)邏輯表達(dá)式,判斷蛇是否闖到上下的圍墻。代碼:If( snake.x0<55| snake.x0>

21、595| snake.y0<55| snake.y0>455)修改后的程序運(yùn)行結(jié)果與預(yù)期的結(jié)果一致。5.2.2 蛇頭闖到蛇身 預(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.xi=snake.x0&&snake.yi=snake.y0) snake.life=0;break; 修改:將循環(huán)體中的snake.life=0改為snake.life=1; 修改后的結(jié)果與預(yù)期結(jié)果一致。5.3 終止循環(huán) 經(jīng)過

22、對(duì)各個(gè)模塊的調(diào)試和單元測(cè)試并修改了錯(cuò)誤后,將各個(gè)模塊組裝成一個(gè)系統(tǒng),并進(jìn)行集成測(cè)試。在集成的過程中發(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è)試內(nèi)容包括蛇的運(yùn)行、分?jǐn)?shù)、關(guān)數(shù)、排行榜及排序、文件存儲(chǔ)、音樂動(dòng)畫等功能,情況均正常。六. 結(jié)論通過2周的課程設(shè)計(jì),在開發(fā)小組共同的努力下,終于完成了貪吃蛇游戲程序的開發(fā)任務(wù)。該游戲程序?qū)崿F(xiàn)了用方向鍵控制蛇在圍墻內(nèi)爬行、隨機(jī)產(chǎn)生食物、控制蛇吃掉食物并加分、控制游戲中闖關(guān)的數(shù)目和蛇的運(yùn)行速度、實(shí)時(shí)顯示得分和關(guān)

23、數(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é)束語 貪吃蛇游戲的編程練習(xí)思考數(shù)據(jù)結(jié)構(gòu):定義食物的坐標(biāo)來控制它出現(xiàn)的位置,用一系列的函數(shù)時(shí)進(jìn)行表示,比如用函數(shù)rectangle來畫出矩形,用life變量的值表示蛇的生

24、命,用direction變量的值表示蛇移動(dòng)的方向等,還有用數(shù)組來存放蛇身各節(jié)的坐標(biāo),這些都讓我們熟悉了對(duì)數(shù)組的操作,此外還熟悉了各種函數(shù)的應(yīng)用。 貪吃蛇的設(shè)計(jì)有很多幫助,學(xué)習(xí)編寫貪吃蛇的游戲?qū)φ莆誄語言的知識(shí)有很大的幫助。通過編程實(shí)踐,還能拓展思路,讓我們?nèi)ふ倚枰{(diào)用那些函數(shù),怎樣提高程序的質(zhì)量等。要寫出好的程序,需要我們有扎實(shí)的基礎(chǔ),這樣遇到一些基本算法的時(shí)候就會(huì)游刃有余了。在編程時(shí)我們要有豐富的想象力,不要拘泥與固定的思維方式,遇到問題的時(shí)侯要多想幾種解決問題的方案。豐富的想象力是建立在豐富的知識(shí)基礎(chǔ)上,所以我們要通過多個(gè)途徑來幫助自己建立較豐富的知識(shí)結(jié)構(gòu)。在編程是我們碰倒了很多的困難,

25、這就需要我們多與別人交流。在編程的過程中,我們也發(fā)現(xiàn)有良好的編程風(fēng)格是十分重要的,至少在時(shí)間效率上就體現(xiàn)了這一點(diǎn)。養(yǎng)成良好的習(xí)慣,代碼的縮進(jìn)編排,變量的命名規(guī)則要始終保持一致,這些都是提高我們編程能力的要點(diǎn)。 在進(jìn)行課程設(shè)計(jì)的過程中我們也學(xué)到了許多別的東西。首先,我們學(xué)會(huì)了合作,要以別人的眼光看看問題,也許這樣得到的會(huì)比各自得到的都要多;其次,我們學(xué)會(huì)了分工,分工是為了更好地合作,分工才能提高合作的效率;最后,我們學(xué)會(huì)了奮斗,我們相信,通過四年的學(xué)習(xí),我們一定能寫出更精彩的程序,將來會(huì)描繪出更精彩的人生。在這里,我們要感謝指導(dǎo)課程設(shè)計(jì)的張鳳君老師,給予我們悉心的指導(dǎo)。老師多次詢問編寫進(jìn)程,并為

26、我們指點(diǎn)迷津,幫助我們開拓研究思路,精心點(diǎn)撥、熱心鼓勵(lì)。老師一絲不茍的工作作風(fēng),嚴(yán)謹(jǐn)求實(shí)的態(tài)度,踏踏實(shí)實(shí)的精神,不僅受我以文,而且教我做人,給以終生受益無窮之道。我還要感謝我們開發(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>#

27、include<stdlib.h>#include<dos.h>#define filename "c:person.dat" /*排行榜文件的文件全名*/#define esc 0x011b /*esc鍵*/#define n 200 /*蛇的最大節(jié)數(shù)*/#define left 0x4b00 /*左移方向鍵*/#define right 0x4d00 /*右移放向鍵*/#define down 0x5000 /*下移方向鍵*/#define up 0x4800 /*上移方向鍵*/ /*排行榜結(jié)構(gòu)體*/struct person int score

28、; /*游戲者分?jǐn)?shù)*/ char name20; /*游戲者姓名*/ per5; /*小蘑菇結(jié)構(gòu)體*/ /*自定義的函數(shù)聲明*/void drawmogu(); /*動(dòng)畫音樂函數(shù)*/void readfiles(); /*從文件中讀取記錄信息*/void writefiles(struct person *) ; /*將紀(jì)錄寫入文件中*/void initscorefiles(); /*初始化記錄文件*/void comparescore(struct person); /*排行榜按分?jǐn)?shù)進(jìn)行排序*/void endplay(); /*游戲結(jié)束處理函數(shù)*/void paihb(); /*繪制排行

29、榜函數(shù)*/*輸出歡迎詞并播放聲音函數(shù)*/void pr() int s15=0,100,150,200,250,300,250,150,100,250,350; setcolor(change/10);/*改變歡迎詞顏色*/ settextstyle(0,0,4); outtextxy(20,200,"WELCOME TO OUR GAME");/*輸出歡迎詞*/ sound(schange/10);/*使揚(yáng)聲器以括號(hào)內(nèi)的頻率發(fā)聲*/*下雪的動(dòng)畫并同步播放音樂函數(shù)*/void DrawSnow() int i; int sx62; selinestyle(SOLID_LIN

30、E,0,THICK_WIDTH); line(1,1,9,9);/*一次3行畫出白色雪花的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+) sxi=(i+2)*10/*計(jì)算雪花位置的橫坐標(biāo)數(shù)組*/ /*以下的鍵控while循環(huán)控制播放音樂和下雪動(dòng)畫*/ while(!kbhit()/*如果未

31、按鍵,執(zhí)行循環(huán)體*/ Pr();/*調(diào)用Pr函數(shù)輸出歡迎詞并播放聲音*/ if(snownum!=100) snowsnownum.speed=2+random(5); i=random(62); snowsnownum.x=sxi;/*取橫坐標(biāo)*/ snowsnownum.y=10-random(100);/*取縱坐標(biāo)*/ /*循環(huán)放置snownum個(gè)雪花*/ for(i=0;i<snownum;i+) putimage(snowi.x,snowi.y,save,COPY_PUT); delay(100);/*延遲100ms以便看到雪花*/ cleardevice();/*清屏*/ P

32、r(); /*調(diào)用Pr函數(shù)輸出歡迎詞并播放聲音*/ if(snownum !=100) snownum+; setfillstyle(SOLID_FILL,15);for(i=0;i<snownum;i+) /*循環(huán)畫出snownum個(gè)雪花*/ snowi.y+=snowi.speed; putimage(snowi.x,snowi.y,save,COPY_PUT); if(snowi.y>500)snowi.y=10-random(200);change+;if(change=140) change=10; nosound(); /*關(guān)閉揚(yáng)聲器*/cleardevice();/*

33、清屏*/*圖像系統(tǒng)初始化函數(shù)*/void init(void) int gd=DETECT,gm; initgraph(&gd,&gm,"c:tc3BGI"); cleardevice(); /*清屏*/*游戲開始界面,左上角坐標(biāo)為(50,40),右下角坐標(biāo)(610,460)的圍墻*/void drawk(void) int i; setcolor(BLUE); setlinestyle(SOLID_LINE,0,THICK_WIDTH); /*設(shè)置線性*/ for(i=50;i<=600;i+=10) /*用循環(huán)畫圍墻*/ setcolor(2*i+

34、1); circle(i,40,5); /*畫上邊*/ circle(i,451,5); circle(i,460,5); /*畫下邊*/ for(i=40;i<=450;i+=10) setcolor(2*i+1); circle(50,i,5); /*畫左邊*/ circle(601,i,5); for(i=40;i<=460;i+=10) setcolor(2*i+1); circle(41,i,5); /*畫右邊*/ circle(610,i,5); setcolor(LIGHTCYAN); setlinestyle(SOLID_LINE,0,THICK_WIDTH); o

35、uttextxy(20,5," GREEDY SNAKE GAMES ji 11_1"); /*輸出版本*/ outtextxy(480,10,"score level "); /*輸出此文本*/ /*玩游戲具體過程*/void gameplay(void) food.yes=1; /*0表示蘋果已經(jīng)存在,1表示需要出現(xiàn)新蘋果*/ snake.life=0; /*蛇活著*/ int level=1; /*記錄游戲等級(jí)*/ char buffer10; /*字符數(shù)組用于轉(zhuǎn)換整形數(shù)據(jù)*/ randomize(); /*設(shè)置隨機(jī)數(shù)的種子數(shù)*/ snake.di

36、rection=1; /*方向向右*/ snake.x0=110;snake.y0=100; /*蛇頭坐標(biāo)初值*/ snake.x1=100;snake.y1=100; /*蛇身1節(jié)坐標(biāo)初值*/ snake.x2=90;snake.y2=100; /*蛇身2節(jié)坐標(biāo)初值*/ snake.node=3; /*蛇節(jié)數(shù)初值*/ while(1) /*玩游戲死循環(huán),按esc鍵或蛇死時(shí)結(jié)束*/ while(!kbhit() /*在沒有按鍵的情況下,蛇自己移動(dòng)身體*/ if(food.yes=1) /*需要出現(xiàn)新蘋果*/ food.x=rand()%400+60; /*在墻內(nèi)隨機(jī)產(chǎn)生蘋果橫坐標(biāo)*/ food

37、.y=rand()%350+60; /*在墻內(nèi)隨機(jī)產(chǎn)生蘋果縱坐標(biāo)*/ /*事物隨機(jī)產(chǎn)生后必須讓蘋果能夠在整格上,這樣才能吃到*/ while(food.x%10!=0) food.x+; while(food.y%10!=0) food.y+; food.yes=0; /*畫面上有蘋果了*/ if(food.yes=0) /*畫面上有蘋果就要畫出來*/ setcolor(GREEN); setfillstyle(SOLID_FILL,GREEN); circle(food.x,food.y,5); fillellipse(food.x,food.y,5,5); setfillstyle(1,B

38、LUE); bar(475,18,590,35); /*畫出顯示分?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.xi=snake.xi-1; snake

39、.yi=snake.yi-1; /*1、2、3、4表示右、左、上、下四個(gè)方向,通過這個(gè)判斷來移動(dòng)蛇頭*/ switch(snake.direction) case 1:snake.x0+=10;break; case 2:snake.x0-=10;break; case 3:snake.y0-=10;break; case 4:snake.y0+=10;break; /*判斷蛇是否撞到墻*/ if(snake.x0<55|snake.x0>595|snake.y0<45|snake.y0>445) snake.life=1; /*置蛇死標(biāo)志*/ break; /*從蛇的

40、第四節(jié)開始判斷是否撞到自己,*/ for(i=3;i<snake.node;i+) if(snake.xi=snake.x0&&snake.yi=snake.y0) snake.life=1; /*置蛇死標(biāo)志*/ break; if(snake.life=1) /*以上兩種判斷以后,如果蛇死就跳出內(nèi)循環(huán)*/ break; /*跳出while(!kbhit)*/ if(snake.x0=food.x&&snake.y0=food.y) /*吃到蘋果以后*/ setcolor(BLACK); /*把畫面上的蘋果擦除*/ circle(food.x,food.y

41、,5); snake.node+; /*蛇的身體長(zhǎng)一節(jié)*/ food.yes=1; /*畫面上需要出現(xiàn)新的蘋果*/ score+=10; /*沒吃一個(gè)蘋果增加10分*/ if(score%50=0) /*吃夠5個(gè)蘋果進(jìn)入下一關(guān)*/ level+=1; /*關(guān)數(shù)加1*/ gamespeed-=60; /*控制速度的值減少60,以便加快速度*/ setcolor(RED); /*畫出紅色蛇的循環(huán)*/ setfillstyle(SOLID_FILL,RED); /*用圓畫出紅色蛇頭*/ fillellipse(snake.x0,snake.y0,5,5); setcolor(GREEN); setf

42、illstyle(SOLID_LINE,GREEN); circle(snake.x0,snake.y0,1); /*對(duì)蛇頭填充綠色小圓作為眼睛*/ setcolor(RED); setfillstyle(SOLID_FILL,BLUE); for(i=1;i<snake.node;i+) /*用圓畫出紅色蛇身*/ setcolor(RED); setfillstyle(SOLID_FILL,BLUE); fillellipse(snake.xi,snake.yi,5,5); /*對(duì)每節(jié)蛇身用藍(lán)色填充*/ setcolor(CYAN); circle(snake.xi,snake.yi,

43、1); /*用青色小圓畫在每節(jié)蛇身上*/ delay(gamespeed); /*延遲gamespeed毫秒,以便控制蛇的爬行速度*/ setcolor(BLACK); /*用背景色黑色去除蛇的最后一節(jié)*/ circle(snake.xsnake.node-1,snake.ysnake.node-1,5) ; setfillstyle(SOLID_FILL,BLACK); fillellipse(snake.xsnake.node-1,snake.ysnake.node-1,5,5); if(snake.life=1) break; /*如果蛇死就跳出循環(huán)*/ key=bioskey(0);

44、/*接收按鍵*/ if(key=esc) break; /*按esc鍵退出*/ /*判斷是否往相反的方向運(yùn)動(dòng)*/ else if(key=up&&snake.direction!=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=down&&snake.direction!=3) sna

45、ke.direction=4; /*endwhile(1)*/ /*結(jié)束游戲*/ /*讀取文件操作函數(shù)*/void readfiles() FILE * fpread; /*如果文件不存在,則創(chuàng)建1個(gè)空文件,否則打開該文件*/ if(fpread=fopen(filename,"ab+")=NULL) printf("cant't open the file person.dat! "); exit(0); if(fgetc(fpread)=EOF) /*如果文件內(nèi)容為空*/ initscorefiles(); /*調(diào)用函數(shù)進(jìn)行記錄初始化工作*/

46、 rewind(fpread); /*重新復(fù)位文件位置指針*/ fread(per,sizeof(struct person),5,fpread); fclose(fpread); /*關(guān)閉排行榜文件*/*寫入文件操作函數(shù)*/void writefiles(struct person *tmp) FILE * fpwrite;/*以讀寫方式打開文件,文件內(nèi)原有的數(shù)據(jù)將被清空*/ if(fpwrite=fopen(filename,"wb+")=NULL) printf("cant't open the file person.dat! "); e

47、xit(0); fwrite(tmp,sizeof(struct person),5,fpwrite); fclose(fpwrite); /*初始化記錄函數(shù)*/void initscorefiles() int i; struct person a5; for(i=0;i<5;i+) ai.score=0; /*5人的分?jǐn)?shù)為0*/ strcpy(,"nobody"); /*5人的名為nobody*/ writefiles(a); /*調(diào)用記錄寫入函數(shù)*/ /* 排序函數(shù),如果玩家分?jǐn)?shù)超過最低記錄,則將玩家分?jǐn)?shù)插入到合適的位置,同時(shí)刪除原先的最低記錄 *

48、/void comparescore(struct person des)int i,j; for(i=0;1<5;i+) if(des.score>=peri.score)if(i<5) for(j=4;j>=i+1;j-) perj=perj-1; peri=des; break; /*顯示排行榜信息*/void paihb() int i; char string10; readfiles(); /* 調(diào)用讀取文件中存在的記錄函數(shù) */ setfillstyle(1,9); bar(482,227,599,239); /*/ outtextxy(490,230,&

49、quot;highest board "); /*輸出此文本*/ setcolor(15); rectangle(480,255,600,240); /*畫矩形*/ setcolor(8); rectangle(481,226,601,241); /*畫矩形*/ setfillstyle(1,7); bar(475,257,610,426); /*畫矩形線*/ setcolor(15); line(475,257,610,257); /*畫線*/ line(475,257,475,426); setcolor(8); line(475,426,610,426); line(610,257,610,426); setcolor(1); outtextxy(480,265,"name score"); /*輸出此文本*/ for(i=0;i<5;i+) /*循環(huán)顯示5

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論