C語言課程設計報告——貪吃蛇源程序--精選文檔_第1頁
C語言課程設計報告——貪吃蛇源程序--精選文檔_第2頁
免費預覽已結束,剩余21頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

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

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

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

8、著,畫出第二層模塊??傮w模塊結構如圖6-1所示。 主 控 模 板退出結束處理游戲過程畫主界面 圖形驅動動畫音樂排行榜寫入文件成績排序讀取記錄3.1.1. 主控模塊。3.1.2. 動畫音樂模塊3.1.3. 畫主界面模塊3.1.4. 游戲過程模塊3.1.5. 游戲結束處理模塊3.1.6. 讀取記錄模塊3.1.7. 成績排序模塊3.1.8. 寫入文件模塊3.1.9. 排行榜模塊3.1.10. 退出3.2 總體數據結構設計 設計思路:測序的關鍵在于表示蛇的圖形及蛇的移動。用一個小局限性方塊表示蛇的一節(jié)身體,身體每長一節(jié),增加一個矩形塊,蛇頭業(yè)用同樣的一節(jié)小矩形方塊表示移動時必須從蛇可以上向前爬行,檔案

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

10、一個食物,所以設定YES表示是否需要出現(xiàn)食物。YES=1表示沒有食物或食物已經被蛇吃掉,需要畫出食物。放置食物后,置YES=0。蛇的一節(jié)身體為一個矩形塊,表示矩形塊只需左上角點坐標(X,Y)。由于在游戲過程中蛇的身體不斷增長,需用數組存放每節(jié)坐標,最大設定為N=200,NODE表示當前節(jié)數。DIRECTION是保存蛇的移動方向的變量,其值可為1、2、3、4之一,分別表示右、左、上、下的方向。LIFE是表示生命的變量,LIFE=0表示蛇活著,一旦LIFE=1,一旦LIFE=1,表示蛇死,結束游戲。#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)勝者的數據結構排行榜主要記錄優(yōu)勝者的姓名和成績。為了存放排行榜信息,可定義如下的結構體類型,其中字符數組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 符號常量的宏定義#define LEFT 0x4b00;

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

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

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

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

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

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

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

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

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

21、595| snake.y0<55| snake.y0>455)修改后的程序運行結果與預期的結果一致。5.2.2 蛇頭闖到蛇身 預期的結果:當蛇得頭部與蛇身相撞時,游戲應當結束。 實際運行效果:蛇頭撞到蛇身時,程序并不終止。 錯誤分析:在蛇的運行判斷的程序出錯,其代碼如下 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; 修改后的結果與預期結果一致。5.3 終止循環(huán) 經過

22、對各個模塊的調試和單元測試并修改了錯誤后,將各個模塊組裝成一個系統(tǒng),并進行集成測試。在集成的過程中發(fā)現(xiàn)了一些錯誤,比如全局變量重復定義、函數重復聲明等,分別進行了改正。最后連續(xù)運行了5次,以便測試該游戲程序的功能、性能是否達到了預期的目標,并根據所使用的具體機器對蛇的爬行速度進行適當的調整。測試內容包括蛇的運行、分數、關數、排行榜及排序、文件存儲、音樂動畫等功能,情況均正常。六. 結論通過2周的課程設計,在開發(fā)小組共同的努力下,終于完成了貪吃蛇游戲程序的開發(fā)任務。該游戲程序實現(xiàn)了用方向鍵控制蛇在圍墻內爬行、隨機產生食物、控制蛇吃掉食物并加分、控制游戲中闖關的數目和蛇的運行速度、實時顯示得分和關

23、數、結束時處理和顯示排行榜等功能。該游戲程序具有界面友好、操作方便、控制準確和容錯能力強等特點。這個貪吃蛇游戲還存在一些缺陷,還應該在如下幾個方面加以改進。1) 進入游戲后,到蛇死亡,只能玩一次就會退出程序。應加入多次游戲的控制能力。2) 蛇的樣子不美觀,應將蛇頭、蛇尾和蛇身進一步美化,使其更像真實的蛇。3) 當分數達到400分時,蛇的速度變得非常快,一下子就撞到圍墻上了,應適當控制蛇的速度和關數,以便使游戲更具有吸引力。七.結束語 貪吃蛇游戲的編程練習思考數據結構:定義食物的坐標來控制它出現(xiàn)的位置,用一系列的函數時進行表示,比如用函數rectangle來畫出矩形,用life變量的值表示蛇的生

24、命,用direction變量的值表示蛇移動的方向等,還有用數組來存放蛇身各節(jié)的坐標,這些都讓我們熟悉了對數組的操作,此外還熟悉了各種函數的應用。 貪吃蛇的設計有很多幫助,學習編寫貪吃蛇的游戲對掌握C語言的知識有很大的幫助。通過編程實踐,還能拓展思路,讓我們去尋找需要調用那些函數,怎樣提高程序的質量等。要寫出好的程序,需要我們有扎實的基礎,這樣遇到一些基本算法的時候就會游刃有余了。在編程時我們要有豐富的想象力,不要拘泥與固定的思維方式,遇到問題的時侯要多想幾種解決問題的方案。豐富的想象力是建立在豐富的知識基礎上,所以我們要通過多個途徑來幫助自己建立較豐富的知識結構。在編程是我們碰倒了很多的困難,

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

26、我們指點迷津,幫助我們開拓研究思路,精心點撥、熱心鼓勵。老師一絲不茍的工作作風,嚴謹求實的態(tài)度,踏踏實實的精神,不僅受我以文,而且教我做人,給以終生受益無窮之道。我還要感謝我們開發(fā)小組的其他同學,在設計中他們給我很大的幫助。正是由于我們團結協(xié)作,才順利的完成了課程設計任務。八.程 序 清 單/*貪吃蛇游戲程序清單*/#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é)數*/#define left 0x4b00 /*左移方向鍵*/#define right 0x4d00 /*右移放向鍵*/#define down 0x5000 /*下移方向鍵*/#define up 0x4800 /*上移方向鍵*/ /*排行榜結構體*/struct person int score

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

29、榜函數*/*輸出歡迎詞并播放聲音函數*/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);/*使揚聲器以括號內的頻率發(fā)聲*/*下雪的動畫并同步播放音樂函數*/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);/*在堆中申請200字節(jié)空間*/ getimage(0,0,10,10,save);/*將雪花位圖保存到save中*/ cleardevice();/*清屏*/ randomize();/*設置隨機種子數*/ for(i=0;i<62;i+) sxi=(i+2)*10/*計算雪花位置的橫坐標數組*/ /*以下的鍵控while循環(huán)控制播放音樂和下雪動畫*/ while(!kbhit()/*如果未

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

32、r(); /*調用Pr函數輸出歡迎詞并播放聲音*/ if(snownum !=100) snownum+; setfillstyle(SOLID_FILL,15);for(i=0;i<snownum;i+) /*循環(huán)畫出snownum個雪花*/ 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(); /*關閉揚聲器*/cleardevice();/*

33、清屏*/*圖像系統(tǒng)初始化函數*/void init(void) int gd=DETECT,gm; initgraph(&gd,&gm,"c:tc3BGI"); cleardevice(); /*清屏*/*游戲開始界面,左上角坐標為(50,40),右下角坐標(610,460)的圍墻*/void drawk(void) int i; setcolor(BLUE); setlinestyle(SOLID_LINE,0,THICK_WIDTH); /*設置線性*/ 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表示蘋果已經存在,1表示需要出現(xiàn)新蘋果*/ snake.life=0; /*蛇活著*/ int level=1; /*記錄游戲等級*/ char buffer10; /*字符數組用于轉換整形數據*/ randomize(); /*設置隨機數的種子數*/ snake.di

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

37、.y=rand()%350+60; /*在墻內隨機產生蘋果縱坐標*/ /*事物隨機產生后必須讓蘋果能夠在整格上,這樣才能吃到*/ 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); /*畫出顯示分數及關數藍色矩形條*/ setcolor(WHITE); itoa(score,buffer,10); /*將整形數據分數轉換成字符串*/ outtextxy(480,20,buffer); /*輸出分數*/ itoa(level,buffer,10); /*將整形數據關數轉換成字符串*/ outtextxy(560,20,buffer); /*輸出關數*/ /*循環(huán)使蛇的每一節(jié)往前移動,這是貪吃蛇的“關鍵算法”*/ for(i=snake.node-1;i>0;i-) snake.xi=snake.xi-1; snake

39、.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-=10;break; case 4:snake.y0+=10;break; /*判斷蛇是否撞到墻*/ if(snake.x0<55|snake.x0>595|snake.y0<45|snake.y0>445) snake.life=1; /*置蛇死標志*/ break; /*從蛇的

40、第四節(jié)開始判斷是否撞到自己,*/ for(i=3;i<snake.node;i+) if(snake.xi=snake.x0&&snake.yi=snake.y0) snake.life=1; /*置蛇死標志*/ break; if(snake.life=1) /*以上兩種判斷以后,如果蛇死就跳出內循環(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+; /*蛇的身體長一節(jié)*/ food.yes=1; /*畫面上需要出現(xiàn)新的蘋果*/ score+=10; /*沒吃一個蘋果增加10分*/ if(score%50=0) /*吃夠5個蘋果進入下一關*/ level+=1; /*關數加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); /*對蛇頭填充綠色小圓作為眼睛*/ 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); /*對每節(jié)蛇身用藍色填充*/ 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鍵退出*/ /*判斷是否往相反的方向運動*/ 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)*/ /*結束游戲*/ /*讀取文件操作函數*/void readfiles() FILE * fpread; /*如果文件不存在,則創(chuàng)建1個空文件,否則打開該文件*/ if(fpread=fopen(filename,"ab+")=NULL) printf("cant't open the file person.dat! "); exit(0); if(fgetc(fpread)=EOF) /*如果文件內容為空*/ initscorefiles(); /*調用函數進行記錄初始化工作*/

46、 rewind(fpread); /*重新復位文件位置指針*/ fread(per,sizeof(struct person),5,fpread); fclose(fpread); /*關閉排行榜文件*/*寫入文件操作函數*/void writefiles(struct person *tmp) FILE * fpwrite;/*以讀寫方式打開文件,文件內原有的數據將被清空*/ 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); /*初始化記錄函數*/void initscorefiles() int i; struct person a5; for(i=0;i<5;i+) ai.score=0; /*5人的分數為0*/ strcpy(,"nobody"); /*5人的名為nobody*/ writefiles(a); /*調用記錄寫入函數*/ /* 排序函數,如果玩家分數超過最低記錄,則將玩家分數插入到合適的位置,同時刪除原先的最低記錄 *

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(); /* 調用讀取文件中存在的記錄函數 */ 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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論