




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、C+課程設計:貪吃蛇1C+課程設計:貪吃蛇1課程設計報告課程名稱:面向?qū)ο蟪绦蛟O計 C+設計題目:貪吃蛇專業(yè):計算機科學與技術姓名:學號:指導教師:李曉虹2015年1月10日1需求分析1.1系統(tǒng)需求 操作系統(tǒng):由于貪吃蛇游戲運行在 windows操作系統(tǒng)上,所以要求計算 機硬件至少能夠運行 windows XP及以上的版本的 windows 操作系統(tǒng)。軟件需求:貪吃蛇游戲使用控制臺以字符的方式來顯示畫面,控制已經(jīng) 集成于操作系統(tǒng)中,無需額外的軟件支持。硬件需求:貪吃蛇游戲需要鍵盤作為控制命令的輸入,需要顯示器作為 結果輸生,因此需要計算機至少具備一個包含光標鍵的鍵 盤,一個顯示分辨率在 800
2、*600以上的顯示器。1.2功能需求 根據(jù)游戲的一般玩法,游戲應該有如圖1-1 所示的功能:圖1-1界面繪制:包括顯示游戲初始界面,顯示游戲結束畫面,顯示游戲運行 畫面三個主要繪制的界面,其中以游戲運行畫面顯示得最為 頻繁。按鍵響應:應該響應兩個部分的按鍵。一是接受用戶的按鍵操作來控制蛇的運動方向,包括上下左右四個光標鍵。二是游戲控制按鍵,包括 ESC退由游戲,SPACE開始游 戲。吃食判定:是對隨機在游戲區(qū)域內(nèi)產(chǎn)生的食物與蛇頭重合否的判斷。如果蛇頭位置與食物位置重合,則判斷蛇吃到食物,其身 體增長一格,繼而食物消失并產(chǎn)生新的食物,如果沒有吃掉 當前已經(jīng)存在的食物將不會有新的食物產(chǎn)生。死亡判定
3、:即游戲失敗判定。按照一般規(guī)則,當蛇頭碰到游戲區(qū)域的邊界或是自身身體那么就判定游戲失敗,整個游戲?qū)⒔Y束。2總體設計2.1邏輯設計 控制臺設置:由于客戶機在默認情況下的設置是不符合程序的一些假設的,所以需要進行一些必要的設置。為使界面顯示正常,應該將控制臺的編碼頁更換為437 ,這樣才能使用ASCII碼的擴展字符。同時應該設置顯示的字符字號,減小字號有利于顯示效果。在屏幕的頻繁刷新中控制臺顯示會由現(xiàn)閃爍的情況,應該使用緩沖,一次性輸生以避免閃爍的由現(xiàn)。游戲界面:由于使用控制臺輸由界面,則界面必然只能使用字符來模擬位圖的顯示。游戲的初始界面與結束界面均使用字符拼成,游戲運行時的畫面則通過使用擴展
4、ASCII碼表中的擴展字符來實現(xiàn)。蛇體結構:使用一個自定義的結構體,具包含X,Y兩個坐標位置,兩個這個結構體的指針,分別指向前一節(jié)點與后一節(jié)點。通過鏈表來實現(xiàn)蛇體的存儲。并在全局變量中存儲蛇體的開始與結尾。繪制時依次遍歷并按坐標繪制即可。2.2系統(tǒng)流程 游戲的流程如圖 2-1所示,有以下幾個步 驟。初始化:將全局變量初始化,初始化蛇體鏈表,初始化控制臺。等待開始:進入循環(huán),等待用戶按下開始鍵,如果用戶沒有按下開始建, 那么就繪制游戲初始界面,提示用戶需按下開始鍵才能游戲。如果用戶按下了開始鍵,就繪制游戲區(qū)域邊界并跳由當前 的循環(huán)。游戲循環(huán):等待用戶按下方向控制鍵,如果用戶并沒有按下方向控制鍵,
5、那么當前的蛇體按照預設的方向前進一格。否者就按照用戶按下的方向前進,同時將全局變量中的方 向指示變量的值由原來的值更改為用戶選定的方向的值;接 著判斷蛇頭的坐標是否與邊界或者是自己的身體坐標重合, 如果重合則說明游戲失敗,將跳由當前循環(huán)。如果沒有重合則接著判斷是否與食物坐標重合,如果重合 代表吃到食物,計分加一,蛇長加一,否則為沒有吃到食物, 不進行任何操作。接著就應該將蛇畫在界面上,然后進行下一次游戲循環(huán)。游戲結束:如果上面死亡判定通過將會進入這一個步驟,先繪制游戲結束畫面,然后顯示游戲得分。游戲變結束了。圖2-1除了正常的游戲結束外, 還能夠通過按下 ESC鍵 退由游戲,流程如圖 2-2所
6、示。游戲退由:在游戲循環(huán)中如果用戶按下了ESC鍵,那么游戲?qū)⒅苯訌挠螒蛑型松粫@示游戲結束畫面也不會顯示得分。游戲重置:用戶以除按 ESC退由游戲的方式外的正常結束將經(jīng)過重置 后重新進入等待開始步驟。圖2-2 3詳細設計3.1類設計 整個游戲有三個主要的類與幾個全局變量分別如圖3-1,圖3-2所示。Control 類:主要實現(xiàn)初始化控制臺設置,構建緩沖,按鍵監(jiān)聽,死亡檢測,吃食檢測,生成食物,輸由緩沖到屏幕,獲取控制狀態(tài), 清空屏幕,重置等等功能。UI類:主要實現(xiàn)界面的繪制,包括游戲初始界面,游戲結束界面和邊界的繪制使用DrawStart ()、DrawEnd ()、DrawBorder(
7、)三個函數(shù)實現(xiàn)。這里的繪制并不是直接向屏幕繪制,而是向緩沖繪制。Snake 類:主要實現(xiàn)蛇的運動,自身的初始化,重置的功能。圖3-1全局變量文件:如圖3-2所示,它有定義的一個文件包含標志_GLO_,因為每個類文件都有一些變量在全局文件中被定義,但是多重引用會導致重定義,使用包含標志符可以確保文件只會被引用 一次,從而避免重定義的沖突由現(xiàn)。SetConsolFont是一個未在源文件中公開的 Win API函數(shù), 使用它之前需要提前定義,之后再在使用的時候直接從系統(tǒng) dll中獲取入口點。四個方向的定義,分別是上下左右四個鍵值,用于響應 用戶按下鍵盤上的光標鍵后的賦值與比較。Buffer是一個屏幕
8、緩沖指針,它將指向一個和游戲顯示區(qū) 域大小一致的內(nèi)存區(qū)域,所有對屏幕的寫操作將先寫入這個 緩沖然后再一次性輸生到屏幕。Width和height指明屏幕大小,用來初始化buffer的大小, 繪制圖像時也需要通過這些數(shù)據(jù)由屏幕上的二維坐標轉(zhuǎn)換 到buffer中的一維線性位置。Length是蛇長度,依據(jù)長度可決定繪制蛇的時候循環(huán)的 次數(shù)。Direction是方向變量,存儲用戶當前按下的方向鍵的鍵 值。Getfood是獲得的分數(shù),也可稱作吃到食物的次數(shù),最終 得分是該數(shù)與一百的乘積。waitEat是游戲區(qū)域內(nèi)已有食物總數(shù),只是0或者1. Head、tail。Seq分別是指向蛇的頭、尾和遍歷變量的指針G
9、ameStart口、GameOver分別是指向開始與結束畫面字符的指針數(shù)組。圖3-2 3.2關鍵代碼實現(xiàn) Control類在初始化中對控制臺 的設置:buffer = new charwidth*height; memset(buffer, , width*height*sizeof(char); /開辟內(nèi)存地址存放緩沖,并將緩 沖內(nèi)容全部置為空格 HMODULE hKernel32 = GetModuleHandle(L “kernel32 ");SetConsoleFont = (PROCSETCONSOLEFONT)GetProcAddress(hKernel32,“ SetC
10、onsoleFont 從)kernel 句柄處獲得 SetConsolFont 函數(shù) 的入口地址 SetConsoleOutputCP(437); 設置控制臺文字頁 為 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; /說明遇到的是空格字符,是安全的。按鍵檢測,由于蛇在向一個方向運動的時候是不能夠再 向反方向運動的,所以必須有一定的處理:if (GetAsyncKeyState(VK_DOWN) / 按下了 工 且上一次按 下的不是T,那么就更改方向值為當前值 if (GetAsyncKeyState(VK_UP) / 按下了 T,且上一次按下的不 是那么就更改方向值為當前值 if (GetAsyncKeyState(VK
13、_LEFT) 按下了 一,且上一次按下 的不是,那么就更改方向值為當前值 if (GetAsyncKeyState(VK_RIGHT) / 按下了 f,且上一次按下 的不是一,那么就更改方向值為當前值Main函數(shù)中,在游戲結束的時候需要顯示玩家的得分,這里使用對話框的形式 給由。由于使用MessageBox函數(shù)顯示分數(shù)需要顯示由int轉(zhuǎn)換成 字符的分數(shù),所以使用了CString類,這里需要 #include“afxwin.h。 “char sc4; / 轉(zhuǎ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 "游戲結 束! ",MB_OK); 顯示拼接的分數(shù)字符結果 4系統(tǒng)調(diào)試 在 調(diào)試的時候編譯階段就由現(xiàn)了錯誤, 錯誤提示如圖4-1所示。其原因是使用 CString類所導入的afxwin.h文件引起的。它要求必須有_AFXDLL的定義或者是運行在 MD模式下, 這里在項目設置中更改調(diào)試模式為MD即可。圖4-1在沒有對蛇頭與蛇身體作檢測的時候會由現(xiàn)問題,如圖4-2所示,蛇能夠穿過自己的身體,這與游戲規(guī)則 是不相符的。所以需要對蛇頭與蛇身的重合作檢測。同樣的在蛇與游戲區(qū)
15、域邊界沒有作檢測的時候,如圖4-3所示,蛇的字符將會覆蓋邊界的字符,隨著蛇離開后將會被 變成空格符,所以也許要對蛇和邊界作重合檢測,如果重合 后則直接判定為死亡,接著就退由游戲。圖4-2圖4-3 5結果分析經(jīng)調(diào)試后的運行結果如圖5-1、圖5-2、圖5-3所示。游戲開始畫面如圖5-1所示:圖5-1游戲畫面如圖5-2所示:圖5-2游戲結束畫面如圖 5-3所示 圖5-3 6總結 經(jīng)過幾 日的開發(fā)與調(diào)試,貪吃蛇游戲最終開發(fā)完成了,這次個游戲 實現(xiàn)了在控制臺上接受用戶按鍵操縱蛇在游戲區(qū)域內(nèi)移動, 觸碰到自己或是邊界的時候結束游戲,吃到食物則增加蛇的 長度和得分,直到游戲結束就顯示得分。雖然成功的實現(xiàn)了游
16、戲的基本功能,但是由于時間的緣 故,沒有實現(xiàn)游戲相關參數(shù)的自定義設置,比如自定義窗口 的寬與高,設定初始蛇的長度,設定最大同時由現(xiàn)食物的長 度等等,還沒有實現(xiàn)得分排行榜,游戲闖關模式,穿墻功能 等等特殊的游戲特性。即使有遺憾,但是通過親手寫代碼,查資料,對 C+的 使用與 Windows API的理解有了進一步的加深,收獲頗豐。附件程序源碼:全局變量:#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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《2025年版商業(yè)店鋪租賃合同》
- 學校安全穩(wěn)定隱患排查專項整治工作方案范文
- 2025煤礦企業(yè)承包的合作合同
- 2025翻譯服務合同
- 精神疾病的康復醫(yī)學進展考核試卷
- 網(wǎng)絡安全防護在智能安防的入侵報警系統(tǒng)評估考核試卷
- 2025大連市商品混凝土銷售合同協(xié)議書樣本
- 娃娃玩具的安全生產(chǎn)事故案例分析考核試卷
- 2025文具用品購銷合同
- 2025安撫巾采購合同
- 焊接高級技師培訓教材(電子束焊)
- 三進制計算機
- 色溫-XY-UV色坐標換算公式
- 易制爆化學品(劇毒品)防盜搶、防破壞應急預案
- 紀檢監(jiān)察工作使用表格目錄
- 超聲醫(yī)學簡答題(完全版)
- 2023年河南工業(yè)和信息化職業(yè)學院單招面試題庫及答案解析
- JJG 700-2016氣相色譜儀
- JJG 168-2018立式金屬罐容量
- GB/T 788-1999圖書和雜志開本及其幅面尺寸
- GB/T 756-2010旋轉(zhuǎn)電機圓柱形軸伸
評論
0/150
提交評論