版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> VC課程設(shè)計(jì)報(bào)告</b></p><p><b> 設(shè)計(jì)題目:貪吃蛇</b></p><p><b> 目錄</b></p><p> 第一章 引言- 1 -</p><p> 1.1關(guān)于題目- 1 -</p><p
2、> 1.1.1題目要求- 1 -</p><p> 1.1.2選題背景- 1 -</p><p> 1.2關(guān)于編譯軟件- 1 -</p><p> 1.3關(guān)于兼容性- 1 -</p><p> 第二章 概要設(shè)計(jì)- 2 -</p><p> 2.1軟件主要功能設(shè)計(jì)- 2 -</p>
3、;<p> 2.1.1程序結(jié)構(gòu)- 2 -</p><p> 2.1.2程序流程- 2 -</p><p> 第三章 軟件實(shí)現(xiàn)- 4 -</p><p> 3.1變量函數(shù)及資源的聲明- 4 -</p><p> 3.1.1函數(shù)聲明- 4 -</p><p> 3.1.2變量聲明- 4
4、 -</p><p> 3.1.3資源- 5 -</p><p> 3.2主要功能的實(shí)現(xiàn)- 5 -</p><p> 3.2.1游戲界面- 5 -</p><p> 3.2.2初始化食物- 6 -</p><p> 3.2.3開始游戲- 7 -</p><p> 3.2.4
5、英雄榜- 9 -</p><p> 3.2.5游戲設(shè)置- 9 -</p><p> 第四章 結(jié)果與討論- 10 -</p><p> 4.1程序運(yùn)行- 10 -</p><p> 4.2錯(cuò)誤調(diào)試與分析- 12 -</p><p><b> 第一章 引言</b></p>
6、;<p><b> 1.1關(guān)于題目</b></p><p><b> 1.1.1題目要求</b></p><p> 利用Microsoft Visual C++制作一個(gè)貪吃蛇的小游戲,要求:</p><p> 應(yīng)用MFC單文檔制作</p><p> 能夠記錄游戲時(shí)間,游戲成績(jī)
7、</p><p> 可暫停/繼續(xù)并在玩家不愿游戲時(shí)停止游戲</p><p> 蛇的身體能夠隨著蛇的長(zhǎng)度變色</p><p><b> 能夠顯示英雄榜</b></p><p><b> 有背景音樂(lè)和音效</b></p><p><b> 1.1.2選題背景&
8、lt;/b></p><p> 貪吃蛇是家喻戶曉的益智類小游戲,選擇這個(gè)題目一是為了將自己的所學(xué)知識(shí)加以運(yùn)用,二是一直以來(lái)貪吃蛇這個(gè)游戲就深深地吸引著我,它的制作方法對(duì)于以前的我而言都是很神秘的。我希望通過(guò)自己的所學(xué)知識(shí)把它剖析開來(lái),真真正正的了解它的本質(zhì)和精髓。雖然我的編程能力不是很強(qiáng),但是我有信心,在這次學(xué)習(xí)中我將從實(shí)踐和實(shí)際的項(xiàng)目中提高自己的編程能力。因此我選定了這個(gè)題目。</p>&
9、lt;p><b> 1.2關(guān)于編譯軟件</b></p><p> 本程序采用Microsoft Visual C++6.0的英文版本進(jìn)行編譯。VisualC++6.0是Microsoft公司推出的基于Windows操作系統(tǒng)的可視化C++編程工具,盡管Microsoft公司推出了.NET平臺(tái)的集成開發(fā)環(huán)境,但由于其良好的界面和可操作性,加上支持標(biāo)準(zhǔn)C/C++規(guī)范,但仍有相當(dāng)多的編程人
10、員使用VisualC++6.0進(jìn)行應(yīng)用系統(tǒng)的開發(fā)。</p><p><b> 1.3關(guān)于兼容性</b></p><p> 本程序經(jīng)過(guò)調(diào)試,可以在XP系統(tǒng)下編譯運(yùn)行,也可以在Vista下運(yùn)行,界面稍有不同,但不影響運(yùn)行結(jié)果。</p><p><b> 第二章 概要設(shè)計(jì)</b></p><p>
11、 2.1軟件主要功能設(shè)計(jì)</p><p><b> 2.1.1程序結(jié)構(gòu)</b></p><p> 根據(jù)分析,貪吃蛇這個(gè)程序一共要實(shí)現(xiàn)如下幾個(gè)功能,包括游戲方面開始游戲、暫停游戲以及停止游戲,音樂(lè)音效的添加與控制,游戲幫助提示與英雄榜的顯示等等。具體的程序結(jié)構(gòu)如下面的圖1-1所示。</p><p> 圖2-1 貪吃蛇結(jié)構(gòu)圖</p>
12、;<p><b> 2.1.2程序流程</b></p><p> 根據(jù)分析后的貪吃蛇結(jié)構(gòu)設(shè)計(jì)出相應(yīng)的貪吃蛇流程。貪吃蛇的內(nèi)容主要包括: 游戲開始,隨機(jī)出現(xiàn)食物;按下ToolBar中的暫停按鈕或Space鍵可以實(shí)現(xiàn)暫停功能;按下幫助鍵或ToolBar中的“?”鍵可獲得游戲幫助說(shuō)明;可播放背景音樂(lè)和音效并可通過(guò)菜單以及ToolBar控制其播放或停止等等。</p>
13、<p> 圖2-2 貪吃蛇流程圖</p><p><b> 第三章 軟件實(shí)現(xiàn)</b></p><p> 3.1變量函數(shù)及資源的聲明</p><p> 根據(jù)程序的結(jié)構(gòu),將貪吃蛇需要實(shí)現(xiàn)的功能細(xì)化成為相應(yīng)的函數(shù)。</p><p><b> 3.1.1函數(shù)聲明</b></p>
14、;<p> void CYuShuoView::OnDraw(CDC* pDC) </p><p> //在OnDraw函數(shù)中繪制游戲背景、游戲文字以及控制蛇的樣式顏色。</p><p> void CYuShuoView::YsInitFood() //初始化貪吃蛇的食物,使其隨機(jī)生成</p><p> vo
15、id CYuShuoView::YsInitGame() //初始化貪吃蛇游戲參數(shù)</p><p> void CYuShuoView::YsReDisplay(CPoint ysPoint) //重繪游戲窗口</p><p> void CYuShuoView::OnYsBegin() //開始游戲(菜單響應(yīng)消息)
16、</p><p> void CYuShuoView::OnYsPause() //暫停游戲(菜單響應(yīng)消息)</p><p> void CYuShuoView::OnYsStop() //停止游戲(菜單響應(yīng)消息)</p><p> void CYuShuoView::OnYsExit()
17、 //退出游戲(菜單響應(yīng)消息)</p><p> void CYuShuoView::OnYsEffect() //控制游戲音效</p><p> void CYuShuoView::OnYsMusicbkg() //控制游戲背景音樂(lè)</p><p> void CYuShu
18、oView::OnYsLevel1() //控制游戲等級(jí)為初級(jí)</p><p> void CYuShuoView::OnYsLevel2() //控制游戲等級(jí)為中級(jí)</p><p> void CYuShuoView::OnYsLevel3() //控制游戲等級(jí)為高級(jí)</p>&l
19、t;p> void CYuShuoView::OnYsHelpgame() //游戲幫助</p><p> void CYuShuoView::OnYsBest() //英雄榜的顯示</p><p><b> 3.1.2變量聲明</b></p><p> CArray<
20、;CPoint,CPoint> m_ysBody; //定義點(diǎn)數(shù)組作為蛇的身體</p><p> CPoint m_ysFood; //食物出現(xiàn)的點(diǎn)</p><p> int m_ysTime; //顯示時(shí)間</p>
21、<p> int m_ysTime1; //滿10則進(jìn)一位使時(shí)間增加1秒</p><p> int m_ysDirect; //方向控制變量</p><p> int m_ysScore;
22、 //玩家成績(jī)變量</p><p> int m_yspausectrl; //暫??刂谱兞?lt;/p><p> int m_yslevelctrl; //等級(jí)控制變量</p><p> CString m_ysPlayer;
23、 //玩家姓名</p><p> int m_yseffectctrl; //音效控制變量</p><p> int m_ysmusicctrl; //背景音樂(lè)控制變量</p><p><b> 3.1
24、.3資源</b></p><p><b> 1、對(duì)話框</b></p><p> IDD_YS_HELPGAME //游戲幫助說(shuō)明</p><p> IDD_YS_BEST //英雄榜</p><p>
25、; IDD_YS_RETRY //停止游戲確認(rèn)</p><p> IDD_ABOUTBOX //關(guān)于游戲版本</p><p><b> 2、音樂(lè)</b></p><p> IDR_YS_BKGMUSIC
26、 //游戲背景音樂(lè)</p><p> IDR_YS_EAT //貪吃蛇吃到食物的音樂(lè)</p><p> IDR_YS_LOWSCORE //游戲結(jié)束后得低分音樂(lè)</p><p> IDR_YS_HIGHSCORE
27、 //游戲結(jié)束后得高分音樂(lè)</p><p><b> 3、位圖</b></p><p> IDB_YS_BITMAP //游戲背景圖</p><p><b> 4、菜單/工具欄</b></p><p> IDR_MAINF
28、RAME //系統(tǒng)自帶菜單</p><p> IDR_YS_TOOLBAR //自己創(chuàng)建的工具條</p><p><b> 頭文件</b></p><p> mmsystem.h //播
29、放音樂(lè)的相應(yīng)文件 </p><p> fstream.h //文件流文件 </p><p> 3.2主要功能的實(shí)現(xiàn)</p><p><b> 3.2.1游戲界面</b></p><p> 貪吃蛇游戲的游戲界面包括背景圖片、蛇身體的繪制、蛇
30、移動(dòng)范圍的繪制等等。其中貪吃蛇的身體用什么方法繪制,才可以使得其在游戲過(guò)程中可以實(shí)現(xiàn)“吃”的功能是很重要的。因此在游戲界面的初始繪制時(shí)就必須考慮到游戲時(shí)可能遇到的問(wèn)題。</p><p> 本程序采用點(diǎn)數(shù)組CArray<CPoint,CPoint> m_ysBody來(lái)存儲(chǔ)貪吃蛇,點(diǎn)數(shù)組的功能很強(qiáng)大,可以添加點(diǎn),同時(shí)可以獲得蛇的長(zhǎng)度,對(duì)于而后進(jìn)行游戲中控制蛇的顏色以及音效的播放等都有很大的幫助。<
31、/p><p> 導(dǎo)入位圖以及菜單工具條后,游戲未開始前(XP系統(tǒng)下)的界面顯示如圖3-1所示</p><p> 圖3-1 游戲初始界面顯示</p><p> 3.2.2初始化食物</p><p> 確定用點(diǎn)數(shù)組存儲(chǔ)貪吃蛇以后,貪吃蛇的食物如何達(dá)到隨機(jī)出現(xiàn),并且能夠按照網(wǎng)格式與蛇頭無(wú)偏差相接就是一個(gè)亟待解決的問(wèn)題。</p>&
32、lt;p> 隨機(jī)出現(xiàn)應(yīng)采用rand()函數(shù)來(lái)實(shí)現(xiàn),而食物與蛇頭無(wú)偏差相接則利用坐標(biāo)來(lái)解決。設(shè)置兩個(gè)整型變量m_ysX,m_ysY作為食物出現(xiàn)的點(diǎn)的坐標(biāo),令m_ysX= rand()%30, ,m_ysY= rand()%40即可。使隨機(jī)出現(xiàn)的點(diǎn)能夠整除最小網(wǎng)格,也就是使食物與蛇頭無(wú)偏差相接。</p><p> 再由食物坐標(biāo)(m_ysX,m_ysY)與蛇頭坐標(biāo)是否相同判斷蛇是否“吃”到了食物,設(shè)置判斷標(biāo)簽
33、ysTag,如果吃到了,ysTag為1,則再出現(xiàn)下一個(gè)食物,反之,如果沒(méi)吃到,則不出現(xiàn)食物直到標(biāo)簽為1為止。</p><p> 最后,再將(m_ysX,m_ysY)賦給m_ysFood作為食物坐標(biāo),以便在其他函數(shù)中調(diào)用。在下面的圖3-2中,我們可以看到,蛇的身體是與出現(xiàn)的食物在一條直線上的,完全可以達(dá)到相接的目的。</p><p> 圖3-2 蛇與食物的相接</p>&l
34、t;p><b> 3.2.3開始游戲</b></p><p> 開始游戲后的重點(diǎn)是如何用鍵盤來(lái)控制蛇的移動(dòng)并傳遞到OnTimer(UINT nIDEvent)函數(shù)中去以及判斷蛇是否死亡。首先說(shuō)明鍵盤與蛇的響應(yīng),設(shè)置一個(gè)方向控制變量m_ysDirect,再添加OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)函數(shù)來(lái)實(shí)現(xiàn)鍵盤消息的傳遞,按下
35、不同的鍵盤按鍵,m_ysDirect會(huì)相應(yīng)的改變,再利用switch語(yǔ)句在OnTimer(UINT nIDEvent)函數(shù)中對(duì)坐標(biāo)進(jìn)行相應(yīng)改變即可。如圖3-3所示。 </p><p> ?。?)左 (2)下 (3)右 (4)上</p><p> 圖3-3 鍵盤的上下左右鍵的效果</p><p
36、> 其次來(lái)解釋一下如何判斷蛇的死亡,由于蛇的身體是由點(diǎn)坐標(biāo)數(shù)組構(gòu)成的,因此判斷蛇是否死亡其本質(zhì)就是判斷蛇頭的坐標(biāo)是否與游戲邊框相同或者蛇頭坐標(biāo)是否與蛇自己的身體相同。該過(guò)程也在OnTimer(UINT nIDEvent)函數(shù)中寫入即可,設(shè)置一個(gè)判斷死亡變量ysTag1,當(dāng)按下向下鍵時(shí),蛇縱坐標(biāo)不斷自加,此處僅以向下為例,具體程序如下:</p><p> switch(m_ysDirect)
37、 //根據(jù)鍵盤按下鍵來(lái)選擇蛇移動(dòng)的方向</p><p><b> {</b></p><p> case 1: //方向變量向下</p><p> ysPoint2.y++; //點(diǎn)縱坐標(biāo)自加</p>
38、;<p> if(ysPoint2.y>=40) //如果縱坐標(biāo)多于最下端邊框</p><p><b> {</b></p><p> ysTag1=1; //變量為1,判斷死亡</p><p><b> }</b><
39、;/p><p><b> break;</b></p><p><b> }</b></p><p> 如果ysTag1為1,則說(shuō)明蛇已經(jīng)死亡,應(yīng)當(dāng)彈出對(duì)話框提示死亡,輸出得分(如圖3-4),同時(shí)還可以根據(jù)玩家的得分?jǐn)?shù)相應(yīng)的改變對(duì)話框中的話語(yǔ)(XP系統(tǒng)下)。</p><p> 圖3-4 貪吃蛇的
40、死亡</p><p> 我們看到圖3-4的蛇身體的顏色發(fā)生了變化,不再是初始狀態(tài)的綠色,而是變?yōu)榱怂{(lán)色,這是在OnDraw(CDC* pDC)函數(shù)中設(shè)置的,設(shè)置變量獲取蛇身長(zhǎng)度,隨著長(zhǎng)度的增加,蛇的顏色發(fā)生相應(yīng)改變,最終會(huì)變?yōu)楸硎疚kU(xiǎn)的紅色。</p><p> 并且伴隨著貪吃蛇掛掉,播放不同的音樂(lè),如果高于70分,則放帶有掌聲鼓勵(lì)的高分音樂(lè)的IDR_YS_HIGHSCORE,反之,則播
41、放蛇被撞死的電子音樂(lè)IDR_YS_LOWSCORE。</p><p> 播放音樂(lè)的函數(shù)用包含在頭文件mmsystem.h中的PlaySound函數(shù)。此外,游戲開始還需要計(jì)時(shí)、計(jì)分以及暫停等功能。這些功能都比較簡(jiǎn)單,游戲時(shí)間和分?jǐn)?shù)分別用兩個(gè)變量m_ysTime和m_ysScore來(lái)記錄,應(yīng)用pDC->TextOut函數(shù)來(lái)輸出即可。至于暫停和繼續(xù)的功能實(shí)現(xiàn),只需要暫停和恢復(fù)計(jì)時(shí)器就可以了,實(shí)現(xiàn)暫停功能即Kil
42、lTimer(1)并同時(shí)令控制暫停變量為m_yspausectrl為0即可。</p><p><b> 3.2.4英雄榜</b></p><p> 很多游戲都有英雄榜這一個(gè)功能。貪吃蛇這個(gè)游戲也不例外,為了下一次開始新游戲的玩家也能夠看到別人的成績(jī),所以采用文件來(lái)存儲(chǔ)游戲記錄。</p><p> 首先加入頭文件fstream.h包含文件寫
43、入讀出函數(shù)ifstream、ofstream。定義文件及變量存儲(chǔ)成績(jī),將對(duì)話框中EditBox的變量設(shè)置成為對(duì)應(yīng)類型。例如:</p><p> CYsBestRecord dlg;</p><p> dlg.m_ysbestscore1=m_1bestscore;</p><p> 上面所寫的就是變量的傳遞,傳遞完畢后,對(duì)話框控件中就有了初值,可以正常顯示分?jǐn)?shù)
44、。而后進(jìn)行游戲相應(yīng)等級(jí)的玩家成績(jī)判斷,如果玩家成績(jī)與英雄榜成績(jī)相同,則根據(jù)時(shí)間來(lái)判斷,若游戲時(shí)間短,則進(jìn)入英雄榜。判斷條件如下:</p><p> (m_ysScore>m_1bestscore||m_ysScore==m_1bestscore&&m_ysTime<m_1besttime)&&m_yslevelctrl==1</p><p>
45、 本程序默認(rèn)游戲結(jié)束即顯示英雄榜,但玩家如果想在沒(méi)有游戲時(shí)查看也可以點(diǎn)擊菜單“幫助—〉英雄榜”查看。</p><p><b> 3.2.5游戲設(shè)置</b></p><p> 這里的游戲設(shè)置主要是指游戲的等級(jí)以及音效音樂(lè)的播放控制。前面在變量聲明中已經(jīng)看到,關(guān)于這三個(gè)量,我們已經(jīng)予以了定義,只需要在按下相應(yīng)鍵盤或鼠標(biāo)消息的時(shí)候,將變量值進(jìn)行改變,再利用這些值控制相應(yīng)
46、功能的運(yùn)行。以游戲音效為例,在按下菜單中的“游戲設(shè)置—〉音樂(lè)—〉音效開/關(guān)” 后(即菜單消息void CYuShuoView::OnYsEffect()),代碼如下:</p><p> switch(m_yseffectctrl) //根據(jù)音效控制變量選擇</p><p><b> {</b></p><p> case 1:
47、 //音效選擇開</p><p> m_yseffectctrl=0; //將音效控制變量改為0</p><p><b> break;</b></p><p> case 0: //音效選擇關(guān)</p><p> m_yseffectctrl=1;
48、 //將音效控制變量改為1 </p><p><b> break;</b></p><p><b> }</b></p><p> 其中在構(gòu)造函數(shù)CYuShuoView::CYuShuoView()中已經(jīng)將m_yseffectctrl的初值設(shè)置為1。</p><p><b>
49、 第四章 結(jié)果與討論</b></p><p><b> 4.1程序運(yùn)行</b></p><p> 程序開始運(yùn)行后會(huì)進(jìn)入游戲界面,但是不會(huì)立即進(jìn)行游戲,單擊菜單的“開始”才會(huì)開始游戲。在游戲開始前,玩家可以根據(jù)自己的喜好,通過(guò)菜單或者工具欄設(shè)置游戲等級(jí)等。</p><p> 在游戲過(guò)程中,按下Space鍵就會(huì)暫停游戲,再按下S
50、pace鍵則會(huì)繼續(xù)游戲。圖4-1所顯示的是XP系統(tǒng)下菜單的樣式,以及單擊菜單開始。</p><p> ?。?)帶有子菜單的菜單樣式</p><p><b> (2)單擊開始菜單</b></p><p> 圖4-1 菜單樣式及單擊開始游戲</p><p> 開始游戲了,小蛇越來(lái)越長(zhǎng),顏色也有所不同了。顏色的改變預(yù)示著
51、游戲的難度加大了,并且,不同的最終得分會(huì)產(chǎn)生不同的死亡評(píng)語(yǔ)。</p><p> 在前面的圖3-4中顯示了貪吃蛇死亡的樣子,其中因?yàn)樵摼钟螒虻梅直容^低,因此得到的評(píng)語(yǔ)是“你才得了這么兩分!”,而如果得分較高,就會(huì)得到更好的評(píng)語(yǔ),最好的評(píng)語(yǔ)是“牛!”。</p><p> 圖4-2所顯示的是游戲開始后隨著蛇長(zhǎng)度的增加而變的顏色。</p><p> 黃色
52、 (2)紅色</p><p><b> 圖4-2 蛇變顏色</b></p><p> 如果不太會(huì)玩貪吃蛇這款游戲,那么可以單擊菜單“幫助—〉游戲說(shuō)明”,或者單擊工具條上的,尋求幫助。如圖4-2所示。</p><p><b> 圖4-3 游戲說(shuō)明</b></p
53、><p> 如果你覺得自己實(shí)力很強(qiáng)想看看別人的成績(jī),那么可以單擊英雄榜看看什么樣。</p><p> 圖4-4 英雄榜樣式</p><p> 4.2錯(cuò)誤調(diào)試與分析</p><p> 本程序由于經(jīng)常調(diào)用Invalidate()函數(shù)重繪窗口,因此在游戲過(guò)程中頻閃的非常嚴(yán)重。查閱了很多資料,雙緩沖技術(shù)可以解決這個(gè)問(wèn)題,但是如果采用雙緩沖技術(shù),暫
溫馨提示
- 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ù)僅提供信息存儲(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)論