c++課程設(shè)計(jì)貪吃蛇1_第1頁(yè)
c++課程設(shè)計(jì)貪吃蛇1_第2頁(yè)
c++課程設(shè)計(jì)貪吃蛇1_第3頁(yè)
c++課程設(shè)計(jì)貪吃蛇1_第4頁(yè)
c++課程設(shè)計(jì)貪吃蛇1_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、C+課程設(shè)計(jì):貪吃蛇1C+課程設(shè)計(jì):貪吃蛇1課程設(shè)計(jì)報(bào)告課程名稱:面向?qū)ο蟪绦蛟O(shè)計(jì) C+設(shè)計(jì)題目:貪吃蛇專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)姓名:學(xué)號(hào):指導(dǎo)教師:李曉虹2015年1月10日1需求分析1.1系統(tǒng)需求 操作系統(tǒng):由于貪吃蛇游戲運(yùn)行在 windows操作系統(tǒng)上,所以要求計(jì)算 機(jī)硬件至少能夠運(yùn)行 windows XP及以上的版本的 windows 操作系統(tǒng)。軟件需求:貪吃蛇游戲使用控制臺(tái)以字符的方式來(lái)顯示畫(huà)面,控制已經(jīng) 集成于操作系統(tǒng)中,無(wú)需額外的軟件支持。硬件需求:貪吃蛇游戲需要鍵盤(pán)作為控制命令的輸入,需要顯示器作為 結(jié)果輸生,因此需要計(jì)算機(jī)至少具備一個(gè)包含光標(biāo)鍵的鍵 盤(pán),一個(gè)顯示分辨率在 800

2、*600以上的顯示器。1.2功能需求 根據(jù)游戲的一般玩法,游戲應(yīng)該有如圖1-1 所示的功能:圖1-1界面繪制:包括顯示游戲初始界面,顯示游戲結(jié)束畫(huà)面,顯示游戲運(yùn)行 畫(huà)面三個(gè)主要繪制的界面,其中以游戲運(yùn)行畫(huà)面顯示得最為 頻繁。按鍵響應(yīng):應(yīng)該響應(yīng)兩個(gè)部分的按鍵。一是接受用戶的按鍵操作來(lái)控制蛇的運(yùn)動(dòng)方向,包括上下左右四個(gè)光標(biāo)鍵。二是游戲控制按鍵,包括 ESC退由游戲,SPACE開(kāi)始游 戲。吃食判定:是對(duì)隨機(jī)在游戲區(qū)域內(nèi)產(chǎn)生的食物與蛇頭重合否的判斷。如果蛇頭位置與食物位置重合,則判斷蛇吃到食物,其身 體增長(zhǎng)一格,繼而食物消失并產(chǎn)生新的食物,如果沒(méi)有吃掉 當(dāng)前已經(jīng)存在的食物將不會(huì)有新的食物產(chǎn)生。死亡判定

3、:即游戲失敗判定。按照一般規(guī)則,當(dāng)蛇頭碰到游戲區(qū)域的邊界或是自身身體那么就判定游戲失敗,整個(gè)游戲?qū)⒔Y(jié)束。2總體設(shè)計(jì)2.1邏輯設(shè)計(jì) 控制臺(tái)設(shè)置:由于客戶機(jī)在默認(rèn)情況下的設(shè)置是不符合程序的一些假設(shè)的,所以需要進(jìn)行一些必要的設(shè)置。為使界面顯示正常,應(yīng)該將控制臺(tái)的編碼頁(yè)更換為437 ,這樣才能使用ASCII碼的擴(kuò)展字符。同時(shí)應(yīng)該設(shè)置顯示的字符字號(hào),減小字號(hào)有利于顯示效果。在屏幕的頻繁刷新中控制臺(tái)顯示會(huì)由現(xiàn)閃爍的情況,應(yīng)該使用緩沖,一次性輸生以避免閃爍的由現(xiàn)。游戲界面:由于使用控制臺(tái)輸由界面,則界面必然只能使用字符來(lái)模擬位圖的顯示。游戲的初始界面與結(jié)束界面均使用字符拼成,游戲運(yùn)行時(shí)的畫(huà)面則通過(guò)使用擴(kuò)展

4、ASCII碼表中的擴(kuò)展字符來(lái)實(shí)現(xiàn)。蛇體結(jié)構(gòu):使用一個(gè)自定義的結(jié)構(gòu)體,具包含X,Y兩個(gè)坐標(biāo)位置,兩個(gè)這個(gè)結(jié)構(gòu)體的指針,分別指向前一節(jié)點(diǎn)與后一節(jié)點(diǎn)。通過(guò)鏈表來(lái)實(shí)現(xiàn)蛇體的存儲(chǔ)。并在全局變量中存儲(chǔ)蛇體的開(kāi)始與結(jié)尾。繪制時(shí)依次遍歷并按坐標(biāo)繪制即可。2.2系統(tǒng)流程 游戲的流程如圖 2-1所示,有以下幾個(gè)步 驟。初始化:將全局變量初始化,初始化蛇體鏈表,初始化控制臺(tái)。等待開(kāi)始:進(jìn)入循環(huán),等待用戶按下開(kāi)始鍵,如果用戶沒(méi)有按下開(kāi)始建, 那么就繪制游戲初始界面,提示用戶需按下開(kāi)始鍵才能游戲。如果用戶按下了開(kāi)始鍵,就繪制游戲區(qū)域邊界并跳由當(dāng)前 的循環(huán)。游戲循環(huán):等待用戶按下方向控制鍵,如果用戶并沒(méi)有按下方向控制鍵,

5、那么當(dāng)前的蛇體按照預(yù)設(shè)的方向前進(jìn)一格。否者就按照用戶按下的方向前進(jìn),同時(shí)將全局變量中的方 向指示變量的值由原來(lái)的值更改為用戶選定的方向的值;接 著判斷蛇頭的坐標(biāo)是否與邊界或者是自己的身體坐標(biāo)重合, 如果重合則說(shuō)明游戲失敗,將跳由當(dāng)前循環(huán)。如果沒(méi)有重合則接著判斷是否與食物坐標(biāo)重合,如果重合 代表吃到食物,計(jì)分加一,蛇長(zhǎng)加一,否則為沒(méi)有吃到食物, 不進(jìn)行任何操作。接著就應(yīng)該將蛇畫(huà)在界面上,然后進(jìn)行下一次游戲循環(huán)。游戲結(jié)束:如果上面死亡判定通過(guò)將會(huì)進(jìn)入這一個(gè)步驟,先繪制游戲結(jié)束畫(huà)面,然后顯示游戲得分。游戲變結(jié)束了。圖2-1除了正常的游戲結(jié)束外, 還能夠通過(guò)按下 ESC鍵 退由游戲,流程如圖 2-2所

6、示。游戲退由:在游戲循環(huán)中如果用戶按下了ESC鍵,那么游戲?qū)⒅苯訌挠螒蛑型松?,不?huì)顯示游戲結(jié)束畫(huà)面也不會(huì)顯示得分。游戲重置:用戶以除按 ESC退由游戲的方式外的正常結(jié)束將經(jīng)過(guò)重置 后重新進(jìn)入等待開(kāi)始步驟。圖2-2 3詳細(xì)設(shè)計(jì)3.1類設(shè)計(jì) 整個(gè)游戲有三個(gè)主要的類與幾個(gè)全局變量分別如圖3-1,圖3-2所示。Control 類:主要實(shí)現(xiàn)初始化控制臺(tái)設(shè)置,構(gòu)建緩沖,按鍵監(jiān)聽(tīng),死亡檢測(cè),吃食檢測(cè),生成食物,輸由緩沖到屏幕,獲取控制狀態(tài), 清空屏幕,重置等等功能。UI類:主要實(shí)現(xiàn)界面的繪制,包括游戲初始界面,游戲結(jié)束界面和邊界的繪制使用DrawStart ()、DrawEnd ()、DrawBorder(

7、)三個(gè)函數(shù)實(shí)現(xiàn)。這里的繪制并不是直接向屏幕繪制,而是向緩沖繪制。Snake 類:主要實(shí)現(xiàn)蛇的運(yùn)動(dòng),自身的初始化,重置的功能。圖3-1全局變量文件:如圖3-2所示,它有定義的一個(gè)文件包含標(biāo)志_GLO_,因?yàn)槊總€(gè)類文件都有一些變量在全局文件中被定義,但是多重引用會(huì)導(dǎo)致重定義,使用包含標(biāo)志符可以確保文件只會(huì)被引用 一次,從而避免重定義的沖突由現(xiàn)。SetConsolFont是一個(gè)未在源文件中公開(kāi)的 Win API函數(shù), 使用它之前需要提前定義,之后再在使用的時(shí)候直接從系統(tǒng) dll中獲取入口點(diǎn)。四個(gè)方向的定義,分別是上下左右四個(gè)鍵值,用于響應(yīng) 用戶按下鍵盤(pán)上的光標(biāo)鍵后的賦值與比較。Buffer是一個(gè)屏幕

8、緩沖指針,它將指向一個(gè)和游戲顯示區(qū) 域大小一致的內(nèi)存區(qū)域,所有對(duì)屏幕的寫(xiě)操作將先寫(xiě)入這個(gè) 緩沖然后再一次性輸生到屏幕。Width和height指明屏幕大小,用來(lái)初始化buffer的大小, 繪制圖像時(shí)也需要通過(guò)這些數(shù)據(jù)由屏幕上的二維坐標(biāo)轉(zhuǎn)換 到buffer中的一維線性位置。Length是蛇長(zhǎng)度,依據(jù)長(zhǎng)度可決定繪制蛇的時(shí)候循環(huán)的 次數(shù)。Direction是方向變量,存儲(chǔ)用戶當(dāng)前按下的方向鍵的鍵 值。Getfood是獲得的分?jǐn)?shù),也可稱作吃到食物的次數(shù),最終 得分是該數(shù)與一百的乘積。waitEat是游戲區(qū)域內(nèi)已有食物總數(shù),只是0或者1. Head、tail。Seq分別是指向蛇的頭、尾和遍歷變量的指針G

9、ameStart口、GameOver分別是指向開(kāi)始與結(jié)束畫(huà)面字符的指針數(shù)組。圖3-2 3.2關(guān)鍵代碼實(shí)現(xiàn) Control類在初始化中對(duì)控制臺(tái) 的設(shè)置:buffer = new charwidth*height; memset(buffer, , width*height*sizeof(char); /開(kāi)辟內(nèi)存地址存放緩沖,并將緩 沖內(nèi)容全部置為空格 HMODULE hKernel32 = GetModuleHandle(L “kernel32 ");SetConsoleFont = (PROCSETCONSOLEFONT)GetProcAddress(hKernel32,“ SetC

10、onsoleFont 從)kernel 句柄處獲得 SetConsolFont 函數(shù) 的入口地址 SetConsoleOutputCP(437); 設(shè)置控制臺(tái)文字頁(yè) 為 437 std二ostringstream sst; std:string str =" “ ; sst y*width +head->x=char(186) return true; 碰到左右邊界,將死亡 else if(bufferhead->y*width + head->x=char(187)return true; / 碰到右上角邊界, 將死亡 else if(bufferhead->

11、;y*width + head->x=char(188)return true; / 碰到右下角邊界,將死 亡else if (bufferhead->y*width +head->x=char(200)return true;/ 碰到左下角邊界,將死亡 else if (bufferhead->y*width + head->x=char(201)return true; / 碰到左上角邊界,將死亡 else if (bufferhead->y*width + head->x=char(205)return true; / 碰到上下邊界,將死亡 el

12、se if (bufferhead->y*width + head->x=char(254)returntrue; 碰到I蛇身體,將死亡 else return false; /說(shuō)明遇到的是空格字符,是安全的。按鍵檢測(cè),由于蛇在向一個(gè)方向運(yùn)動(dòng)的時(shí)候是不能夠再 向反方向運(yùn)動(dòng)的,所以必須有一定的處理:if (GetAsyncKeyState(VK_DOWN) / 按下了 工 且上一次按 下的不是T,那么就更改方向值為當(dāng)前值 if (GetAsyncKeyState(VK_UP) / 按下了 T,且上一次按下的不 是那么就更改方向值為當(dāng)前值 if (GetAsyncKeyState(VK

13、_LEFT) 按下了 一,且上一次按下 的不是,那么就更改方向值為當(dāng)前值 if (GetAsyncKeyState(VK_RIGHT) / 按下了 f,且上一次按下 的不是一,那么就更改方向值為當(dāng)前值Main函數(shù)中,在游戲結(jié)束的時(shí)候需要顯示玩家的得分,這里使用對(duì)話框的形式 給由。由于使用MessageBox函數(shù)顯示分?jǐn)?shù)需要顯示由int轉(zhuǎn)換成 字符的分?jǐn)?shù),所以使用了CString類,這里需要 #include“afxwin.h。 “char sc4; / 轉(zhuǎn)換的分?jǐn)?shù)存放數(shù)組 _itoa_s(getFood, sc, 10); 將 int 轉(zhuǎn)換為 char口 CString ff(sc); / 由

14、 char轉(zhuǎn)換為 CString , 方便后面作字符拼接 MessageBox(NULL,ds+ff+so,L "游戲結(jié) 束! ",MB_OK); 顯示拼接的分?jǐn)?shù)字符結(jié)果 4系統(tǒng)調(diào)試 在 調(diào)試的時(shí)候編譯階段就由現(xiàn)了錯(cuò)誤, 錯(cuò)誤提示如圖4-1所示。其原因是使用 CString類所導(dǎo)入的afxwin.h文件引起的。它要求必須有_AFXDLL的定義或者是運(yùn)行在 MD模式下, 這里在項(xiàng)目設(shè)置中更改調(diào)試模式為MD即可。圖4-1在沒(méi)有對(duì)蛇頭與蛇身體作檢測(cè)的時(shí)候會(huì)由現(xiàn)問(wèn)題,如圖4-2所示,蛇能夠穿過(guò)自己的身體,這與游戲規(guī)則 是不相符的。所以需要對(duì)蛇頭與蛇身的重合作檢測(cè)。同樣的在蛇與游戲區(qū)

15、域邊界沒(méi)有作檢測(cè)的時(shí)候,如圖4-3所示,蛇的字符將會(huì)覆蓋邊界的字符,隨著蛇離開(kāi)后將會(huì)被 變成空格符,所以也許要對(duì)蛇和邊界作重合檢測(cè),如果重合 后則直接判定為死亡,接著就退由游戲。圖4-2圖4-3 5結(jié)果分析經(jīng)調(diào)試后的運(yùn)行結(jié)果如圖5-1、圖5-2、圖5-3所示。游戲開(kāi)始畫(huà)面如圖5-1所示:圖5-1游戲畫(huà)面如圖5-2所示:圖5-2游戲結(jié)束畫(huà)面如圖 5-3所示 圖5-3 6總結(jié) 經(jīng)過(guò)幾 日的開(kāi)發(fā)與調(diào)試,貪吃蛇游戲最終開(kāi)發(fā)完成了,這次個(gè)游戲 實(shí)現(xiàn)了在控制臺(tái)上接受用戶按鍵操縱蛇在游戲區(qū)域內(nèi)移動(dòng), 觸碰到自己或是邊界的時(shí)候結(jié)束游戲,吃到食物則增加蛇的 長(zhǎng)度和得分,直到游戲結(jié)束就顯示得分。雖然成功的實(shí)現(xiàn)了游

16、戲的基本功能,但是由于時(shí)間的緣 故,沒(méi)有實(shí)現(xiàn)游戲相關(guān)參數(shù)的自定義設(shè)置,比如自定義窗口 的寬與高,設(shè)定初始蛇的長(zhǎng)度,設(shè)定最大同時(shí)由現(xiàn)食物的長(zhǎng) 度等等,還沒(méi)有實(shí)現(xiàn)得分排行榜,游戲闖關(guān)模式,穿墻功能 等等特殊的游戲特性。即使有遺憾,但是通過(guò)親手寫(xiě)代碼,查資料,對(duì) C+的 使用與 Windows API的理解有了進(jìn)一步的加深,收獲頗豐。附件程序源碼:全局變量:#include “windows.h #define _GLO_ ; #define Left 0;#define Right 1; #define Up 2; #define Down 3; typedef BOOL(WINAPI *PROC

17、SETCONSOLEFONT)(HANDLE, DWORD); PROCSETCONSOLEFONT SetConsoleFont; static char * buffer; int width; int height; int length; int direction; int getFood; int waitEat; struct SnakeSection int x; int y; SnakeSection* pre; SnakeSection* next; ; SnakeSection * head; SnakeSection * tail; SnakeSection * seq

18、; char * GameOver =" “ “ “ # HH# # GS9 XBSXGX3SA“ MX3GiriirssssssssrS “ BHB1 .:;SAh,:.G #HBX,:,5BHBB. 3HXMHr93X#MBB#BMSS9#B:. iSS1 XS .rHB88S#B:.3A:;:G9 . ;8h99S . 3#B111. 89 . ,8X39995SXs . i#B: . rhhi :hhs. 3B93X#B.8#HX519HS5AMM898BA8GG8G8888G GGG88HH88888G#A88888X#MG88888B #MG8GG88BA8GGGGGGGGG888888888G AH95iiG#,“ A51GM# # #M# #X9XGr1ssrii;rsssssssssr A8irrir1sssssssss11sG“ #M#BBBi:i1115;,GBBM3 ,M#M9H5;#B,.,:,.SMMMM#M:.89.:#MHH85.3#MB#M:. 89 . ;MA8H#5. i#B:.GBX83X

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論