C語言課程設(shè)計報告-貪吃蛇源程序Word版_第1頁
C語言課程設(shè)計報告-貪吃蛇源程序Word版_第2頁
C語言課程設(shè)計報告-貪吃蛇源程序Word版_第3頁
C語言課程設(shè)計報告-貪吃蛇源程序Word版_第4頁
C語言課程設(shè)計報告-貪吃蛇源程序Word版_第5頁
已閱讀5頁,還剩25頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

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

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

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

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

6、如下: 程序運行后顯示動畫,音樂,按ESC鍵退出游戲界面后,左邊有一個矩形區(qū),外游戲區(qū)域,在矩形區(qū)中有食物和貪食蛇,上方有統(tǒng)計分?jǐn)?shù)及關(guān)數(shù)顯示區(qū)域。 蛇在封閉圍墻利用綠色矩形表示,圍墻里隨機(jī)的出現(xiàn)一個食物,通過按鍵盤四個光標(biāo)鍵控制蛇向上,下,左右四個方向移動,蛇頭撞到食物,則食物被吃掉,蛇身體長一節(jié),接著又出現(xiàn)食物,等待蛇來吃。食物用一個點表示,并且每次食物的位置都是隨機(jī)出現(xiàn)的。游戲中要使貪吃蛇盡可能的長,但是不能使貪吃蛇撞到四周的墻壁,而且蛇的身體不能撞到一起,否則游戲結(jié)束。游戲中每吃掉一個食物要有積分,隨著分?jǐn)?shù)的增加可進(jìn)入下一關(guān),即使速度會加快。游戲結(jié)束時,如果分?jǐn)?shù)進(jìn)入前5名則重新排榜并存儲

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

8、畫主界面,游戲過程,結(jié)束處理,退出等第6個主要功能;接著,畫出第二層模塊。總體模塊結(jié)構(gòu)如圖6-1所示。 主 控 模 板退出結(jié)束處理游戲過程畫主界面 圖形驅(qū)動動畫音樂排行榜寫入文件成績排序讀取記錄3.1.1. 主控模塊。3.1.2. 動畫音樂模塊3.1.3. 畫主界面模塊3.1.4. 游戲過程模塊3.1.5. 游戲結(jié)束處理模塊3.1.6. 讀取記錄模塊3.1.7. 成績排序模塊3.1.8. 寫入文件模塊3.1.9. 排行榜模塊3.1.10. 退出3.2 總體數(shù)據(jù)結(jié)構(gòu)設(shè)計 設(shè)計思路:測序的關(guān)鍵在于表示蛇的圖形及蛇的移動。用一個小局限性方塊表示蛇的一節(jié)身體,身體每長一節(jié),增加一個矩形塊,蛇頭業(yè)用同樣

9、的一節(jié)小矩形方塊表示移動時必須從蛇可以上向前爬行,檔案下有效方向鍵后,應(yīng)先確定蛇頭的位置,而后蛇的身體雖蛇頭移動,圖形的實現(xiàn)是從身體新位置開始畫出蛇。這時,由于未清屏的原因,原來的蛇的位置和新蛇的位置差一節(jié)蛇身,即看起來蛇多一節(jié)身體,所以將蛇的最后一節(jié)用背景色覆蓋。食物的出現(xiàn)與消失意識畫矩形塊和覆蓋矩形塊。為了便于理解,定義兩個結(jié)構(gòu)體:食物與蛇。下面介紹貪吃蛇游戲程序的主要數(shù)據(jù)結(jié)構(gòu)。3.2.1 食物與蛇的數(shù)據(jù)結(jié)構(gòu) 表示食物與蛇的矩形塊設(shè)計為10*10個像素單位,食物的基本數(shù)據(jù)域為它所出現(xiàn)的位置,用X和Y坐標(biāo)表示,則矩形塊用函數(shù)RECTANGLE(X,Y,X+10,Y+10)或RECTANGLE

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

11、d int x; int y; Int yes;food;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)勝者的姓名和成績。為了存放排行榜信息,可定義如下的結(jié)構(gòu)體類型,其中字符數(shù)組name成員存放優(yōu)勝者的姓名,整型變量score成員存放優(yōu)勝者的成績。Struct person char name20; Int score;3.2.3 其他全局變量的定義Struct person per5;Int score=0;Int gamespeed=400;3.2.4 符

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

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

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

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

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

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

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

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

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

21、修改后的程序運行結(jié)果與預(yù)期的結(jié)果一致。5.2.2 蛇頭闖到蛇身 預(yù)期的結(jié)果:當(dāng)蛇得頭部與蛇身相撞時,游戲應(yīng)當(dāng)結(jié)束。 實際運行效果:蛇頭撞到蛇身時,程序并不終止。 錯誤分析:在蛇的運行判斷的程序出錯,其代碼如下 Fori=3;isnake.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)過對各個模塊的調(diào)試和單元測試并修改了錯誤后,將各個模塊組裝成一個系統(tǒng),并進(jìn)行集成測試。在集成的過程中發(fā)

22、現(xiàn)了一些錯誤,比如全局變量重復(fù)定義、函數(shù)重復(fù)聲明等,分別進(jìn)行了改正。最后連續(xù)運行了5次,以便測試該游戲程序的功能、性能是否達(dá)到了預(yù)期的目標(biāo),并根據(jù)所使用的具體機(jī)器對蛇的爬行速度進(jìn)行適當(dāng)?shù)恼{(diào)整。測試內(nèi)容包括蛇的運行、分?jǐn)?shù)、關(guān)數(shù)、排行榜及排序、文件存儲、音樂動畫等功能,情況均正常。六. 結(jié)論通過2周的課程設(shè)計,在開發(fā)小組共同的努力下,終于完成了貪吃蛇游戲程序的開發(fā)任務(wù)。該游戲程序?qū)崿F(xiàn)了用方向鍵控制蛇在圍墻內(nèi)爬行、隨機(jī)產(chǎn)生食物、控制蛇吃掉食物并加分、控制游戲中闖關(guān)的數(shù)目和蛇的運行速度、實時顯示得分和關(guān)數(shù)、結(jié)束時處理和顯示排行榜等功能。該游戲程序具有界面友好、操作方便、控制準(zhǔn)確和容錯能力強等特點。這個

23、貪吃蛇游戲還存在一些缺陷,還應(yīng)該在如下幾個方面加以改進(jìn)。1) 進(jìn)入游戲后,到蛇死亡,只能玩一次就會退出程序。應(yīng)加入多次游戲的控制能力。2) 蛇的樣子不美觀,應(yīng)將蛇頭、蛇尾和蛇身進(jìn)一步美化,使其更像真實的蛇。3) 當(dāng)分?jǐn)?shù)達(dá)到400分時,蛇的速度變得非???,一下子就撞到圍墻上了,應(yīng)適當(dāng)控制蛇的速度和關(guān)數(shù),以便使游戲更具有吸引力。七.結(jié)束語 貪吃蛇游戲的編程練習(xí)思考數(shù)據(jù)結(jié)構(gòu):定義食物的坐標(biāo)來控制它出現(xiàn)的位置,用一系列的函數(shù)時進(jìn)行表示,比如用函數(shù)rectangle來畫出矩形,用life變量的值表示蛇的生命,用direction變量的值表示蛇移動的方向等,還有用數(shù)組來存放蛇身各節(jié)的坐標(biāo),這些都讓我們熟悉

24、了對數(shù)組的操作,此外還熟悉了各種函數(shù)的應(yīng)用。 貪吃蛇的設(shè)計有很多幫助,學(xué)習(xí)編寫貪吃蛇的游戲?qū)φ莆誄語言的知識有很大的幫助。通過編程實踐,還能拓展思路,讓我們?nèi)ふ倚枰{(diào)用那些函數(shù),怎樣提高程序的質(zhì)量等。要寫出好的程序,需要我們有扎實的基礎(chǔ),這樣遇到一些基本算法的時候就會游刃有余了。在編程時我們要有豐富的想象力,不要拘泥與固定的思維方式,遇到問題的時侯要多想幾種解決問題的方案。豐富的想象力是建立在豐富的知識基礎(chǔ)上,所以我們要通過多個途徑來幫助自己建立較豐富的知識結(jié)構(gòu)。在編程是我們碰倒了很多的困難,這就需要我們多與別人交流。在編程的過程中,我們也發(fā)現(xiàn)有良好的編程風(fēng)格是十分重要的,至少在時間效率上就

25、體現(xiàn)了這一點。養(yǎng)成良好的習(xí)慣,代碼的縮進(jìn)編排,變量的命名規(guī)則要始終保持一致,這些都是提高我們編程能力的要點。 在進(jìn)行課程設(shè)計的過程中我們也學(xué)到了許多別的東西。首先,我們學(xué)會了合作,要以別人的眼光看看問題,也許這樣得到的會比各自得到的都要多;其次,我們學(xué)會了分工,分工是為了更好地合作,分工才能提高合作的效率;最后,我們學(xué)會了奮斗,我們相信,通過四年的學(xué)習(xí),我們一定能寫出更精彩的程序,將來會描繪出更精彩的人生。在這里,我們要感謝指導(dǎo)課程設(shè)計的張鳳君老師,給予我們悉心的指導(dǎo)。老師多次詢問編寫進(jìn)程,并為我們指點迷津,幫助我們開拓研究思路,精心點撥、熱心鼓勵。老師一絲不茍的工作作風(fēng),嚴(yán)謹(jǐn)求實的態(tài)度,踏踏

26、實實的精神,不僅受我以文,而且教我做人,給以終生受益無窮之道。我還要感謝我們開發(fā)小組的其他同學(xué),在設(shè)計中他們給我很大的幫助。正是由于我們團(tuán)結(jié)協(xié)作,才順利的完成了課程設(shè)計任務(wù)。八.程 序 清 單/*貪吃蛇游戲程序清單*/#include#include#include#include#include#include#include#include#define filename c:person.dat /*排行榜文件的文件全名*/#define esc 0x011b /*esc鍵*/#define n 200 /*蛇的最大節(jié)數(shù)*/#define left 0x4b00 /*左移方向鍵*/#de

27、fine right 0x4d00 /*右移放向鍵*/#define down 0x5000 /*下移方向鍵*/#define up 0x4800 /*上移方向鍵*/ /*排行榜結(jié)構(gòu)體*/struct person int score; /*游戲者分?jǐn)?shù)*/ char name20; /*游戲者姓名*/ per5; /*小蘑菇結(jié)構(gòu)體*/ /*自定義的函數(shù)聲明*/void drawmogu(); /*動畫音樂函數(shù)*/void readfiles(); /*從文件中讀取記錄信息*/void writefiles(struct person *) ; /*將紀(jì)錄寫入文件中*/void initscor

28、efiles(); /*初始化記錄文件*/void comparescore(struct person); /*排行榜按分?jǐn)?shù)進(jìn)行排序*/void endplay(); /*游戲結(jié)束處理函數(shù)*/void paihb(); /*繪制排行榜函數(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);/*輸出歡迎詞*/ s

29、ound(schange/10);/*使揚聲器以括號內(nèi)的頻率發(fā)聲*/*下雪的動畫并同步播放音樂函數(shù)*/void DrawSnow() int i; int sx62; selinestyle(SOLID_LINE,0,THICK_WIDTH); line(1,1,9,9);/*一次3行畫出白色雪花的3條線*/ line(0,5,10,5); line(9,1,1,9); save=malloc(200);/*在堆中申請200字節(jié)空間*/ getimage(0,0,10,10,save);/*將雪花位圖保存到save中*/ cleardevice();/*清屏*/ randomize();/*設(shè)

30、置隨機(jī)種子數(shù)*/ for(i=0;i62;i+) sxi=(i+2)*10/*計算雪花位置的橫坐標(biāo)數(shù)組*/ /*以下的鍵控while循環(huán)控制播放音樂和下雪動畫*/ while(!kbhit()/*如果未按鍵,執(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個雪花*/ for(i=0;isnownum

31、;i+) putimage(snowi.x,snowi.y,save,COPY_PUT); delay(100);/*延遲100ms以便看到雪花*/ cleardevice();/*清屏*/ Pr(); /*調(diào)用Pr函數(shù)輸出歡迎詞并播放聲音*/ if(snownum !=100) snownum+; setfillstyle(SOLID_FILL,15);for(i=0;i500)snowi.y=10-random(200);change+;if(change=140) change=10; nosound(); /*關(guān)閉揚聲器*/cleardevice();/*清屏*/*圖像系統(tǒng)初始化函數(shù)*

32、/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+1); circle(i,40,5); /*畫上邊*/ circle(i,45

33、1,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;i0;i-) snake.xi=snake.xi-1; snake.yi=snake.yi-1; /*1、2、3、4表示右、左、上、下四個方向,通過這個判斷來移動蛇頭*/ switch(snake.direction) case 1:snake.x0+=10;break; case 2:snake.x0-=10;break; case 3:snake.y0-

34、=10;break; case 4:snake.y0+=10;break; /*判斷蛇是否撞到墻*/ if(snake.x0595|snake.y0445) snake.life=1; /*置蛇死標(biāo)志*/ break; /*從蛇的第四節(jié)開始判斷是否撞到自己,*/ for(i=3;isnake.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(sn

35、ake.x0=food.x&snake.y0=food.y) /*吃到蘋果以后*/ setcolor(BLACK); /*把畫面上的蘋果擦除*/ circle(food.x,food.y,5); snake.node+; /*蛇的身體長一節(jié)*/ food.yes=1; /*畫面上需要出現(xiàn)新的蘋果*/ score+=10; /*沒吃一個蘋果增加10分*/ if(score%50=0) /*吃夠5個蘋果進(jìn)入下一關(guān)*/ level+=1; /*關(guān)數(shù)加1*/ gamespeed-=60; /*控制速度的值減少60,以便加快速度*/ setcolor(RED); /*畫出紅色蛇的循環(huán)*/ setfill

36、style(SOLID_FILL,RED); /*用圓畫出紅色蛇頭*/ fillellipse(snake.x0,snake.y0,5,5); setcolor(GREEN); setfillstyle(SOLID_LINE,GREEN); circle(snake.x0,snake.y0,1); /*對蛇頭填充綠色小圓作為眼睛*/ setcolor(RED); setfillstyle(SOLID_FILL,BLUE); for(i=1;isnake.node;i+) /*用圓畫出紅色蛇身*/ setcolor(RED); setfillstyle(SOLID_FILL,BLUE); fil

37、lellipse(snake.xi,snake.yi,5,5); /*對每節(jié)蛇身用藍(lán)色填充*/ setcolor(CYAN); circle(snake.xi,snake.yi,1); /*用青色小圓畫在每節(jié)蛇身上*/ delay(gamespeed); /*延遲gamespeed毫秒,以便控制蛇的爬行速度*/ setcolor(BLACK); /*用背景色黑色去除蛇的最后一節(jié)*/ circle(snake.xsnake.node-1,snake.ysnake.node-1,5) ; setfillstyle(SOLID_FILL,BLACK); fillellipse(snake.xsnak

38、e.node-1,snake.ysnake.node-1,5,5); if(snake.life=1) break; /*如果蛇死就跳出循環(huán)*/ key=bioskey(0); /*接收按鍵*/ if(key=esc) break; /*按esc鍵退出*/ /*判斷是否往相反的方向運動*/ 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.

39、direction=2; else if(key=down&snake.direction!=3) snake.direction=4; /*endwhile(1)*/ /*結(jié)束游戲*/ /*讀取文件操作函數(shù)*/void readfiles() FILE * fpread; /*如果文件不存在,則創(chuàng)建1個空文件,否則打開該文件*/ if(fpread=fopen(filename,ab+)=NULL) printf(cantt open the file person.dat! ); exit(0); if(fgetc(fpread)=EOF) /*如果文件內(nèi)容為空*/ initscorefi

40、les(); /*調(diào)用函數(shù)進(jìn)行記錄初始化工作*/ 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(cantt open the file person.dat! ); exit(0

41、); fwrite(tmp,sizeof(struct person),5,fpwrite); fclose(fpwrite); /*初始化記錄函數(shù)*/void initscorefiles() int i; struct person a5; for(i=0;i5;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ù)插入到合適的位置,同時刪除原先的最低記錄 */void comparescore(struct person des)int i,j; for(i=0;1=peri.score)if(i=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,highest board ); /*輸出此文本*/ setcolor(15); r

溫馨提示

  • 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

提交評論