![](https://static.zsdocx.com/FlexPaper/FileRoot/2019-6/5/22/6ba01d93-bcee-4e9f-9355-bcb0fd22c9d3/6ba01d93-bcee-4e9f-9355-bcb0fd22c9d3pic.jpg)
![基于mfc的貪吃蛇程序設(shè)計(jì)課程設(shè)計(jì)_第1頁](https://static.zsdocx.com/FlexPaper/FileRoot/2019-6/5/22/6ba01d93-bcee-4e9f-9355-bcb0fd22c9d3/6ba01d93-bcee-4e9f-9355-bcb0fd22c9d31.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 《MFC應(yīng)用程序設(shè)計(jì)》</p><p><b> 課程設(shè)計(jì)報(bào)告</b></p><p> 題 目: </p><p> 學(xué) 院: </p><p> 專 業(yè): </p><p&g
2、t; 班 級(jí): </p><p> 姓 名: </p><p> 學(xué) 號(hào): </p><p> 指導(dǎo)教師: </p><p><b> 評(píng)閱成績:</b></p>&
3、lt;p> 二0 年 月 日</p><p><b> 目錄</b></p><p> 概述 …………………………………………………………………3</p><p> 設(shè)計(jì)目的………………………………………………………3</p><p> 功能描述………………………………………………………3&
4、lt;/p><p> 大體思想………………………………………………………3</p><p> 程序框圖………………………………………………………4</p><p> 主要知識(shí)點(diǎn)……………………………………………………5</p><p> 重要的MFC ……………………………………………………5</p><p>
5、數(shù)據(jù)結(jié)構(gòu)………………………………………………………6</p><p> 主要函數(shù)………………………………………………………7</p><p> 代碼實(shí)現(xiàn)………………………………………………………7</p><p> 運(yùn)行界面………………………………………………………18</p><p> 總結(jié)………………………………………………………
6、……19</p><p> 參考文獻(xiàn)………………………………………………………20</p><p><b> 概述</b></p><p> 此次課程設(shè)計(jì)我利用MFC制作了一個(gè)貪吃蛇游戲,運(yùn)行程序時(shí)窗口會(huì)自動(dòng)最大化,游戲會(huì)根據(jù)貪吃蛇身體的長度自動(dòng)增加難度,而且單機(jī)右鍵可以出現(xiàn)坐標(biāo)。我還添加了bmp格式的圖片作為游戲背景。</p>
7、;<p><b> 1 設(shè)計(jì)目的</b></p><p> 通過實(shí)踐進(jìn)一步領(lǐng)會(huì)程序設(shè)計(jì)的特點(diǎn)和應(yīng)用,提高運(yùn)用C++ 以及面向?qū)ο笾R(shí)解決實(shí)際問題的能力,初步掌握MFC變成的基本功能。</p><p> 通過實(shí)踐加強(qiáng)對(duì)程序設(shè)計(jì)語言課程知識(shí)點(diǎn)的理解和掌握,培養(yǎng)對(duì)課程知識(shí)綜合運(yùn)用能力、實(shí)際分析問題能力及編程能力,養(yǎng)成良好的編程習(xí)慣。</p>
8、<p> 通過實(shí)踐掌握用C++ 編寫面向?qū)ο蟮膶?shí)用程序的設(shè)計(jì)方法,對(duì)面向?qū)ο蠓椒ê退枷朐黾痈行缘恼J(rèn)識(shí);學(xué)會(huì)利用C++程序設(shè)計(jì)語言編寫出一些短小、可靠的Windows實(shí)用程序,切實(shí)提高面向?qū)ο蟮某绦蛟O(shè)計(jì)能力,為后續(xù)的相關(guān)課程的學(xué)習(xí)打下基礎(chǔ)。</p><p><b> 2 功能描述</b></p><p> 運(yùn)行程序,窗口會(huì)自動(dòng)最大化,出現(xiàn)bmp格式圖片
9、的背景。</p><p> 點(diǎn)擊“游戲->游戲開始”,出現(xiàn)圍墻界面,一條蛇在密閉的圍墻內(nèi),在圍墻內(nèi)隨機(jī)出現(xiàn)一個(gè)食物,游戲開始。</p><p> 游戲開始后,界面右下角會(huì)出現(xiàn)游戲規(guī)則。</p><p> 游戲開始后,界面右下角會(huì)同步游戲得分。</p><p> 通過四個(gè)方向鍵控制蛇的運(yùn)動(dòng)方向,吃掉隨機(jī)出現(xiàn)的豆子,若不小心碰到墻壁
10、或者與自身相交,則該輪游戲結(jié)束。</p><p> 點(diǎn)擊“游戲->游戲暫?!?,暫停游戲。</p><p> 點(diǎn)擊“游戲->游戲繼續(xù)”,繼續(xù)游戲。</p><p> 游戲會(huì)根據(jù)蛇身的長度自動(dòng)調(diào)節(jié)難易程度。</p><p> 點(diǎn)擊“游戲->游戲退出”,退出游戲。</p><p> 在界面中右鍵單
11、擊鼠標(biāo)可以顯示光標(biāo)的當(dāng)前坐標(biāo)。</p><p> 單擊幫助->游戲規(guī)則查看游戲規(guī)則。</p><p><b> 3 大體思想</b></p><p> 定義蛇類和食物類,初始化貪吃蛇各項(xiàng)成員變量,包括圖像的出現(xiàn)在屏幕的初始位置,長度,以及蛇的行走方向。食物類的定義包括出現(xiàn)的初始位置,以及食物是否被吃掉的判斷。</p>
12、<p> 用數(shù)組初始化長度為3的貪吃蛇,并且默認(rèn)食物未出現(xiàn)</p><p> 在CView類上運(yùn)用MFC提供的Windows消息中WM_TIMER消息,運(yùn)用OnTimer()函數(shù)讓系統(tǒng)提供一個(gè)時(shí)鐘節(jié)拍,更新游戲</p><p> 具體游戲?qū)崿F(xiàn),包括蛇撞到自己和圍墻都將使游戲結(jié)束,判斷吃豆等,其中還包括根據(jù)蛇的長度來進(jìn)行游戲難度的改變。</p><p&g
13、t; 具體鍵盤游戲操作運(yùn)用到Windows消息響應(yīng)中的WM_KEYDOWN,用OnKeyDown()來響應(yīng)玩家的實(shí)際操作。</p><p><b> 界面會(huì)自動(dòng)最大化</b></p><p> 而且單擊右鍵可以出現(xiàn)坐標(biāo)</p><p> 添加了bmp格式的圖片作為游戲背景。</p><p><b>
14、4 程序框圖</b></p><p><b> 4.1 整體框架圖</b></p><p> 4.2 游戲控制模塊框架圖</p><p><b> 5 主要知識(shí)點(diǎn)</b></p><p> CView類中的消息響應(yīng)</p><p><b> 控
15、件的消息響應(yīng)</b></p><p> 基于CView類內(nèi)的具體游戲?qū)崿F(xiàn)</p><p><b> 數(shù)組</b></p><p> 游戲圖形的實(shí)現(xiàn)用CDC類實(shí)現(xiàn)</p><p> SDI界面窗口樣式的設(shè)計(jì)</p><p><b> 文本的顯示</b>&l
16、t;/p><p><b> 6 重要的MFC</b></p><p> CWnd:窗口,它是大多數(shù)“看得見的東西”的父類(Windows里幾乎所有看得見的東西都是一個(gè)窗口,大窗口里有許多小窗口),比如視圖CView、框架窗口CFrameWnd、工具條CToolBar、對(duì)話框CDialog、按鈕CButton,etc;一個(gè)例外是菜單(CMenu)不是從窗口派生的。該類很
17、大,一開始也不必學(xué),知道就行了。 </p><p> CDocument文檔,負(fù)責(zé)內(nèi)存數(shù)據(jù)與磁盤的交互。最重要的是OnOpenDocument(讀入),OnSaveDocument(寫盤),Serialize(讀寫) </p><p> CView視圖,負(fù)責(zé)內(nèi)存數(shù)據(jù)與用戶的交互。包括數(shù)據(jù)的顯示、用戶操作的響應(yīng)(如菜單的選取、鼠標(biāo)的響應(yīng))。最重要的是OnDraw(重畫窗口),通常用CWn
18、d::Invalidate()來啟動(dòng)它。另外,它通過消息映射表處理菜單、工具條、快捷鍵和其他用戶消息。你自己的許多功能都要加在里面,你打交道最多的就是它。 </p><p> CDC設(shè)備文本。無論是顯示器還是打印機(jī),都是畫圖給用戶看。這圖就抽象為CDC。CDC與其他GDI(圖形設(shè)備接口)一起,完成文字和圖形、圖像的顯示工作。把CDC想象成一張紙,每個(gè)窗口都有一個(gè)CDC相聯(lián)系,負(fù)責(zé)畫窗口。CDC有個(gè)常用子類CCl
19、ientDC(窗口客戶區(qū)),畫圖通常通過CClientDC完成。 </p><p> CDialog對(duì)話框 </p><p> CWinApp應(yīng)用程序類。似于C中的main函數(shù),是程序執(zhí)行的入口和管理者,負(fù)責(zé)程序建立、消滅,主窗口和文檔模板的建立。最常用函數(shù)InitInstance():初始化。 </p><p> CGdiObject及子類,用于向設(shè)備文本畫
20、圖。它們都需要在使用前選進(jìn)DC </p><p><b> CPen筆,畫線 </b></p><p> CBrush刷子,填充 </p><p> CFont字體,控制文字輸出的字體 </p><p> CBitmap位圖 </p><p> CPalette調(diào)色板 </p>
21、;<p> CRgn區(qū)域,指定一塊區(qū)域可以用于做特殊處理。 </p><p> CFile文件。最重要的不外是Open(打開),Read(讀入),Write</p><p> CString字符串。封裝了C中的字符數(shù)組,非常實(shí)用。 </p><p> CPoint點(diǎn),就是(x,y)</p><p> CRect矩形,就
22、是(left,top,right,bottom) </p><p><b> 7 數(shù)據(jù)結(jié)構(gòu)</b></p><p> 7.1 蛇的全局變量</p><p> struct Snake</p><p><b> {</b></p><p><b> int
23、x,y;</b></p><p><b> int len;</b></p><p> int direct;</p><p> }Snake[50];</p><p> 7.2 食物的全局變量</p><p> struct Food</p><p>
24、;<b> {</b></p><p><b> int x;</b></p><p><b> int y;</b></p><p> int isfood;</p><p><b> }Food;</b></p><p&g
25、t;<b> 8 主要函數(shù)</b></p><p> void CMFCexp8_4View::OnDraw(CDC* pDC)//顯示背景圖片</p><p> void CMFCexp8_4View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)//按照用戶的按鍵來控制蛇的移動(dòng)</p><
26、;p> void CMFCexp8_4View::OnRButtonDown(UINT nFlags, CPoint point)//用鼠標(biāo)右鍵屏幕,就會(huì)馬上顯示當(dāng)前位置的坐標(biāo)信息</p><p> void CMFCexp8_4View::OnTimer(UINT nIDEvent)//根據(jù)蛇的長度來進(jìn)行SetTimer()函數(shù)的定義,可以根據(jù)長度來進(jìn)行游戲難度的設(shè)定。//撞界判斷//蛇身相撞判斷//
27、抹掉蛇行走的痕跡//判斷吃豆的條件,撞到就吃//如果食物被吃了 就生成</p><p> void CMFCexp8_4View::oninit()//進(jìn)行貪吃蛇外觀的初始化</p><p> void CMFCexp8_4View::OnStart()//開始游戲</p><p> void CMFCexp8_4View::OnPause()//游戲暫停&l
28、t;/p><p> void CMFCexp8_4View::OnContinue()//繼續(xù)游戲</p><p> void CMFCexp8_4View::OnExit()//退出游戲</p><p> void CMFCexp8_4View::OnInitialUpdate()//初始化蛇的位置</p><p> void CMFC
29、exp8_4View::OnDrawNew()//第二層白色正方形背景以及右下角的文字</p><p><b> 9 代碼實(shí)現(xiàn)</b></p><p> 9.1 添加Windows信息</p><p> ?、旁谝延泄こ滔碌摹癈lassView”中右鍵CView類添加以下Windows信息</p><p> WM_K
30、EYDOWN</p><p> WM_RBUTTONDOWN</p><p><b> WM_TIMER</b></p><p> ?、朴益ICView類選擇 “ADD Virtual Funciton”選OnInitialUpdate(),再者還要添加一個(gè)成員函數(shù)oninit()進(jìn)行貪吃蛇外觀的初始化</p><p>
31、;<b> 9.2 控件的設(shè)計(jì)</b></p><p> ⑴ 我們可以點(diǎn)擊“工作空間”的“ResourceView”進(jìn)行控件的具體設(shè)計(jì),設(shè)計(jì)游戲的一些控件來控制“游戲開始” “游戲結(jié)束” 和“游戲暫停”。</p><p> ?、?右鍵其中的標(biāo)題欄,點(diǎn)擊屬性,會(huì)得到一個(gè)菜單欄標(biāo)題,我們建立“游戲”菜單欄標(biāo)題。</p><p> ?、?點(diǎn)擊并且
32、在已有控件中的列表中點(diǎn)擊屬性,進(jìn)行“菜單項(xiàng)目屬性”的設(shè)置。分別建立的屬性“標(biāo)明”與對(duì)應(yīng)的ID有</p><p> 游戲開始 IDM_START</p><p> 游戲暫?! DM_PAUSE</p><p> 游戲繼續(xù) IDM_CONTINUE</p><p> 游戲退出 IDM_EXIT</p><
33、;p> ?、?成功設(shè)置ID之后,分別單擊右鍵各項(xiàng)屬性進(jìn)行消息響應(yīng)處理函數(shù)的生成,具體方法操作例子如下:</p><p> 右鍵“游戲開始”》點(diǎn)擊“類向?qū)Ыⅰ薄吩贛essage Maps頁面,在要進(jìn)行消息響應(yīng)的控件ID列表Object IDs中上選擇對(duì)應(yīng)的ID, 這里我們選擇IDM_START,具體實(shí)現(xiàn)的環(huán)境是CView類,所以我們必須把“Class name”的默認(rèn)“CMainFrame”改為“CVie
34、w類”,并且在“Messages”類型設(shè)置中,用“COMMAND”設(shè)置為其為命令消息。其余各項(xiàng)也按照同理進(jìn)行設(shè)置。</p><p> 9.3 具體實(shí)現(xiàn)游戲</p><p> 9.3.1 在文件開頭處分別定義蛇和食物 的全局變量</p><p> //定義蛇的全局變量</p><p> struct Snake</p>&
35、lt;p><b> {</b></p><p><b> int x,y;</b></p><p><b> int len;</b></p><p> int direct;</p><p> }Snake[50];</p><p>
36、 //定義食物的全局變量</p><p> struct Food</p><p><b> {</b></p><p><b> int x;</b></p><p><b> int y;</b></p><p> int isfood;&
37、lt;/p><p><b> }Food;</b></p><p> 9.3.2 初始化蛇的位置</p><p> void CMFCexp8_4View::OnInitialUpdate() </p><p><b> {</b></p><p> CView::On
38、InitialUpdate();</p><p> Snake[0].x=10;//初始化起點(diǎn)坐標(biāo)</p><p> Snake[0].y=10;</p><p> Snake[1].x=11;</p><p> Snake[1].y=10;</p><p> Snake[2].x=12;</p>
39、<p> Snake[2].y=10;</p><p> Snake[0].direct=3;//初始化貪吃蛇起初有3個(gè)節(jié)點(diǎn),長度為3</p><p> Snake[0].len=3;</p><p> Food.isfood=1;//食物默認(rèn)為1無0有</p><p><b> }</b><
40、;/p><p> OnInitialUpdate()的功能如下:</p><p> 視圖窗口完全建立后第一個(gè)被框架調(diào)用的函數(shù)。框架在第一次調(diào)用OnDraw前會(huì)調(diào)用OnInitialUpdate,因此OnInitialUpdate是設(shè)置滾動(dòng)視圖的邏輯尺寸和映射模式的最合適的地方。</p><p> 時(shí)間上,兩者先后順序不同,構(gòu)造函數(shù)生成本類的對(duì)象,但沒有產(chǎn)生窗口,O
41、nCreate后窗口產(chǎn)生,然后才是視圖的OnInitialUpDate,一般在這里對(duì)視圖的顯示做初始化。簡單點(diǎn),就是ONCREATE只是產(chǎn)生VIEW的基本結(jié)構(gòu)和變量而在OnInitialUpDate()中,主要初始化視圖中控件等。對(duì)各個(gè)變量進(jìn)行初始化操作,所以我們要用這個(gè)函數(shù)來進(jìn)行貪吃蛇的初始化工作。</p><p> 9.3.3 對(duì)OnKeyDown()具體添加代碼</p><p>
42、 void CMFCexp8_4View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) </p><p><b> {</b></p><p> switch(nChar)</p><p><b> {</b></p><p> //Sn
43、ake[0]代表的是蛇頭,對(duì)蛇頭的方向Snake[0].direct進(jìn)行判斷</p><p> case VK_UP:if(Snake[0].direct!=2)Snake[0].direct=1;break;</p><p> //蛇頭不等于“下”的時(shí)候,才能做出“上”的操作動(dòng)作,否則則忽略用戶“向上”的操作按鍵效果</p><p> case VK_DOW
44、N:if(Snake[0].direct!=1)Snake[0].direct=2;break;</p><p> //蛇頭不等于“上”的時(shí)候,才能做出“下”的操作動(dòng)作,否則則忽略用戶“向下”的操作按鍵效果</p><p> case VK_LEFT:if(Snake[0].direct!=4)Snake[0].direct=3;break;</p><p>
45、 //蛇頭不等于“右”的時(shí)候,才能做出“左”的操作動(dòng)作,否則則忽略用戶“向左”的操作按鍵效果</p><p> case VK_RIGHT:if(Snake[0].direct!=3)Snake[0].direct=4;break; </p><p> //蛇頭不等于“左”的時(shí)候,才能做出“右”的操作動(dòng)作,否則則忽略用戶“向右”的操作按鍵效果</p><p>&
46、lt;b> }</b></p><p> CView::OnKeyDown(nChar, nRepCnt, nFlags);</p><p><b> }</b></p><p> 9.3.4 對(duì)OnRButtonDown()具體添加代碼</p><p> void CMFCexp8_4Vie
47、w::OnRButtonDown(UINT nFlags, CPoint point) </p><p> //這個(gè)函數(shù)功能是:用鼠標(biāo)右鍵屏幕,就會(huì)馬上顯示當(dāng)前位置的坐標(biāo)信息</p><p><b> {</b></p><p> CString str;</p><p> str.Format("%d
48、,%d",point.x,point.y);</p><p> AfxMessageBox(str);</p><p> CView::OnRButtonDown(nFlags, point);</p><p><b> }</b></p><p> 代碼說明:這個(gè)函數(shù)并不是本游戲中必要添加的函數(shù),只是
49、為了在后面游戲頁面的設(shè)計(jì)的時(shí)候可以用鼠標(biāo)右鍵屏幕了解大概的屏幕坐標(biāo)信息,才特地做的。這個(gè)設(shè)備坐標(biāo)系以用戶區(qū)窗口左上角為(0 , 0)原點(diǎn),X坐標(biāo)向右為正,Y坐標(biāo)向下為正。</p><p> 9.3.5 對(duì)oninit()具體添加代碼</p><p> //畫一個(gè)矩形,用當(dāng)前的畫筆畫矩形輪廓,用當(dāng)前畫刷進(jìn)行填充</p><p><b> {</b
50、></p><p> CDC *pDC=GetDC();</p><p> CBrush DrawBrush=(RGB(100,100,100));</p><p> CBrush *Drawbrush=pDC->SelectObject(&DrawBrush);</p><p> for(int i=0;i<
51、;=Snake[0].len-1;i++)</p><p> pDC->Rectangle(Snake[i].x*20,Snake[i].y*20,(Snake[i].x+1)*20,(Snake[i].y+1)*20);</p><p> pDC->SelectObject(DrawBrush);</p><p><b> }</
52、b></p><p> 代碼說明:利用Windows給我們提供的CDC類來進(jìn)行畫圖,我們首先用一個(gè)指向CDC類的指針去接受與該窗口相關(guān)聯(lián)的DC句柄,然后用定義畫刷一個(gè)DrawBrush對(duì)象,并且用RGB(100,100,100)來給畫刷初始化顏色。并且用SelectObject(&DrawBrush);函數(shù)把對(duì)象畫刷選入到設(shè)備描述表中,用for循環(huán)依次把貪吃蛇的3個(gè)節(jié)點(diǎn)畫出來。</p>
53、<p> void CMFCexp8_4View::oninit()</p><p> 9.3.6 對(duì)控件添加具體代碼</p><p> void CMFCexp8_4View::OnStart() </p><p><b> {</b></p><p> CMFCexp8_4View::OnDr
54、awNew();</p><p> SetTimer(1,3000,NULL);</p><p> //定時(shí)器。3000是3000毫秒,即3秒</p><p> AfxMessageBox("3秒后開始游戲!");</p><p><b> }</b></p><p>
55、 void CMFCexp8_4View::OnPause() </p><p><b> {</b></p><p> KillTimer(1);</p><p> AfxMessageBox("暫停游戲...");</p><p><b> }</b></p&
56、gt;<p> void CMFCexp8_4View::OnContinue() </p><p><b> {</b></p><p> SetTimer(1,10,NULL);</p><p><b> }</b></p><p> void CMFCexp8_4Vie
57、w::OnExit() </p><p><b> {</b></p><p> AfxMessageBox("退出游戲...");</p><p><b> exit(0);</b></p><p><b> }</b></p>&l
58、t;p> 代碼說明:由于之前我們設(shè)定了WM_TIMER消息,我們能運(yùn)用計(jì)時(shí)器功能。用WM_TIMER來設(shè)置定時(shí)器,SetTimer(m_hWnd,1,1000,NULL)是一個(gè)1秒觸發(fā)一次的定時(shí)器,在MFC程序中SetTimer被封裝在CWnd類中,調(diào)用就不用指定窗口句柄了,所以我們這里可以只去后3個(gè)參數(shù)寫成SetTimer(1,10,NULL);其中1000為1秒。</p><p> 9.3.7 對(duì)O
59、nDraw()添加具體代碼,實(shí)現(xiàn)出現(xiàn)背景圖片</p><p> ⑴ 在“Resource.h”中添加“#define IDB_MY_BITMAP 130”</p><p> ?、?在“Res”中添加“qiche.bmp”</p><p> ?、?在“MFCexp8—4.cpp”中添加“IDB_MY_BITMAP BITMAP D
60、ISCARDABLE "res\\qiche.bmp"”</p><p><b> ⑷添加以下代碼:</b></p><p> void CMFCexp8_4View::OnDraw(CDC* pDC)</p><p> //以res文件夾中的bmp格式圖片為背景</p><p><
61、;b> {</b></p><p> CMFCexp8_4Doc* pDoc = GetDocument();</p><p> ASSERT_VALID(pDoc);</p><p> CDC MemDC;</p><p> MemDC.CreateCompatibleDC(NULL);</p>&
62、lt;p> MemDC.SelectObject(pDoc->m_Bitmap);</p><p> pDC->BitBlt(0,0,pDoc->m_nWidth,pDoc->m_nHeight,&MemDC,0,0,SRCCOPY);</p><p><b> }</b></p><p> 9.3
63、.8 對(duì)OnDrawNew()添加具體代碼</p><p> ?、?在添加代碼之前,在“MFCexp8_4View.h”中添加:</p><p> class CMFCexp8_4View : public CView</p><p><b> {</b></p><p> protected: // create
64、 from serialization only</p><p> CMFCexp8_4View();</p><p> DECLARE_DYNCREATE(CMFCexp8_4View)</p><p> // Attributes</p><p><b> public:</b></p><
65、;p> CMFCexp8_4Doc* GetDocument();</p><p> CClientDC* myDC;</p><p> CClientDC* my2DC;</p><p> // Operations</p><p><b> ……</b></p><p><
66、;b> }</b></p><p> ⑵ 對(duì)“CClientDC* myDC”和“CClientDC* my2DC”建立類向?qū)?lt;/p><p> int CMFCexp8_4View::OnCreate(LPCREATESTRUCT lpCreateStruct) </p><p><b> {</b></p&
67、gt;<p> if (CView::OnCreate(lpCreateStruct) == -1)</p><p> return -1;</p><p> // TODO: Add your specialized creation code here</p><p> myDC =new CClientDC(this);</p>
68、;<p> my2DC =new CClientDC(this);</p><p><b> return 0;</b></p><p><b> }</b></p><p> ⑶ void CMFCexp8_4View::OnDrawNew()</p><p><b&g
69、t; {</b></p><p> RECT Rect;</p><p> Rect.left=Rect.top=20;</p><p> Rect.right=Rect.bottom =500;</p><p> CBrush Brush(RGB(255,255,255));</p><p>
70、 myDC->FillRect (&Rect,&Brush);</p><p> //畫出第二層背景,一個(gè)白色正方形</p><p> my2DC->SetBkColor(RGB(0,0,0));</p><p> my2DC->SetTextColor(RGB(255,255,255));</p><p&
71、gt; my2DC->TextOut(750,400,"單擊“游戲”,選擇“開始游戲”");</p><p> my2DC->SetTextColor(RGB(255,0,255));</p><p> my2DC->TextOut(800,430,"請不要咬到自己或撞到圍墻!");</p><p>
72、 //在界面右下角分別出現(xiàn)三行背景色為黑色的彩色文本</p><p><b> }</b></p><p> 9.3.9 對(duì)OnTimer(UINT nIDEvent)添加具體代碼</p><p> void CMFCexp8_4View::OnTimer(UINT nIDEvent) </p><p><b
73、> {</b></p><p> CDC *pDC=GetDC();</p><p> CString soure;</p><p> if(Snake[0].len==2)SetTimer(1,370,NULL);</p><p> if(Snake[0].len==3)SetTimer(1,270,NULL);
74、</p><p> if(Snake[0].len==6)SetTimer(1,200,NULL);</p><p> if(Snake[0].len==9)SetTimer(1,100,NULL);</p><p> //這段代碼的作用是根據(jù)蛇的長度來進(jìn)行SetTimer()函數(shù)的定義,可以根據(jù)長度來進(jìn)行游戲難度的設(shè)定</p><p>
75、; //如上代碼分別370ms 270ms 200ms 100ms進(jìn)行一次新的移動(dòng)。</p><p> soure.Format("當(dāng)前得分:%d!",(Snake[0].len-3)*10); </p><p> my2DC->SetTextColor(RGB(0,255,0));</p><p> my2DC->TextO
76、ut(800,460,soure);</p><p><b> //撞界判斷</b></p><p> if(Snake[0].x*20<=37||Snake[0].y*20<=37||Snake[0].x*20>=462||Snake[0].y*20>=462)</p><p><b> {</b
77、></p><p> KillTimer(1);</p><p> AfxMessageBox(soure);</p><p> CMFCexp8_4View::OnExit();</p><p><b> }</b></p><p><b> //蛇身相撞判斷</
78、b></p><p> if(Snake[0].len>3)</p><p> for(int sn=Snake[0].len-1;sn>0;sn--)</p><p> //根據(jù)蛇長sn,進(jìn)行sn次for sn-1次循環(huán),判斷蛇自己是否咬到了自己</p><p><b> {</b></
79、p><p> if(Snake[0].x*20==Snake[sn].x*20&&Snake[0].y*20==Snake[sn].y*20)</p><p><b> {</b></p><p> KillTimer(1);</p><p> //止計(jì)時(shí)器,和之前的SetTimer()對(duì)應(yīng)</
80、p><p> AfxMessageBox(soure);</p><p> CMFCexp8_4View::OnExit();</p><p><b> }</b></p><p><b> }</b></p><p> ////////////////////////
81、///////////////////////////////////////////////////</p><p> pDC->SelectStockObject(WHITE_PEN);</p><p> //把白色的“PEN”選入設(shè)備進(jìn)行畫圖</p><p> pDC->Rectangle(Snake[Snake[0].len-1].x*20
82、,Snake[Snake[0].len-1].y*20,(Snake[Snake[0].len-1].x+1)*20,(Snake[Snake[0].len-1].y+1)*20);</p><p> //讓它去畫最后一個(gè)節(jié)點(diǎn)</p><p> for(int i=Snake[0].len-1;i>0;i--)</p><p> //貪吃蛇的蛇身移動(dòng)&l
83、t;/p><p><b> {</b></p><p> Snake[i].x=Snake[i-1].x;</p><p> Snake[i].y=Snake[i-1].y;</p><p><b> }</b></p><p><b> //行走方向判斷&l
84、t;/b></p><p> if(Snake[0].direct==1)Snake[0].y--;</p><p> if(Snake[0].direct==2)Snake[0].y++;</p><p> if(Snake[0].direct==3)Snake[0].x--;</p><p> if(Snake[0].dir
85、ect==4)Snake[0].x++;</p><p> //“1234”本別代表“上下左右” x++,y++進(jìn)行移動(dòng)</p><p> //然后用選定畫刷畫出一個(gè)新節(jié)點(diǎn)的矩形作為頭結(jié)點(diǎn)</p><p> pDC->SelectStockObject(BLACK_PEN);</p><p> CBrush DrawBrush=
86、(RGB(255,0,0));//控制蛇和食物的顏色</p><p> CBrush *Drawbrush=pDC->SelectObject(&DrawBrush);</p><p> pDC->Rectangle(Snake[0].x*20,Snake[0].y*20,(Snake[0].x+1)*20,(Snake[0].y+1)*20);</p>
87、<p> pDC->SelectObject(DrawBrush);</p><p> //判斷吃豆的條件,撞到就吃</p><p> if(Snake[0].x*20==Food.x*20&&Snake[0].y*20==Food.y*20)</p><p><b> {</b></p>
88、<p> Snake[0].len++;</p><p> Food.isfood=1;</p><p> Snake[Snake[0].len-1].x=Snake[Snake[0].len-2].x;</p><p> Snake[Snake[0].len-1].y=Snake[Snake[0].len-2].y;</p>&
89、lt;p><b> }</b></p><p> //如果食物被吃了 就生成</p><p> if(Food.isfood==1)</p><p><b> {</b></p><p> srand((unsigned)time(NULL));</p><p&g
90、t; //當(dāng)食物被吃了,指定食物在小于70 和大于430的矩形區(qū)域內(nèi)出現(xiàn)</p><p><b> do</b></p><p><b> {</b></p><p> for(int isfo=Snake[0].len-1;isfo>=0;isfo--)</p><p> if(S
91、nake[0].x*20==Snake[isfo].x*20&&Snake[0].y*20==Snake[isfo].y*20)</p><p><b> {</b></p><p> Food.x=rand()%25;</p><p> Food.y=rand()%25;</p><p><
92、b> }</b></p><p><b> }</b></p><p> while(Food.x*20<70||Food.y*20<70||Food.x*20>430||Food.y*20>430);</p><p> pDC->Rectangle(Food.x*20,Food.y*20
93、,(Food.x+1)*20,(Food.y+1)*20);</p><p> Food.isfood=0;</p><p> //把食物的屬性更改為“存在”</p><p><b> }</b></p><p> CView::OnTimer(nIDEvent);</p><p><
94、;b> }</b></p><p><b> 10 運(yùn)行界面</b></p><p><b> 運(yùn)行程序后</b></p><p><b> ?、崎_始游戲時(shí)</b></p><p><b> 11 總結(jié)</b></p>
95、<p> 這次課程設(shè)計(jì),我選擇用MFC編寫一個(gè)貪食蛇的程序。在編寫程序之前,我只有很少的關(guān)于MFC的程序設(shè)計(jì)知識(shí),因此,在剛開始,我遇到了很多困難。為此,我查閱了許多關(guān)于貪食蛇的資料,也在網(wǎng)上看了許多關(guān)于貪食蛇的算法。做好了準(zhǔn)備之后,才開始寫我的貪食蛇,并且加了很多附加功能。這次課程設(shè)計(jì)鍛煉了我的動(dòng)手能力。通過完成貪食蛇游戲的程序設(shè)計(jì),累積了我的實(shí)際編程經(jīng)驗(yàn),也提高了我獨(dú)立解決問題的能力。</p><
96、p><b> 12 參考文獻(xiàn)</b></p><p> [1]. 歐陽志宏,MFC程序設(shè)計(jì)輕松入門,人民郵電出版社,北京,2009-4-1</p><p> [2]. 姚領(lǐng)田,MFC窗口程序設(shè)計(jì),水利水電出版社,北京,2007-5-1</p><p> [3]. 侯俊杰,深入淺出MFC(第2版), 華中科技大學(xué)出版社,武漢,200
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 貪吃蛇java課程設(shè)計(jì)--貪吃蛇程序設(shè)計(jì)
- 課程設(shè)計(jì)--- 貪吃蛇小游戲程序設(shè)計(jì)
- c語言程序設(shè)計(jì)課程設(shè)計(jì)(論文)-貪吃蛇
- 貪吃蛇課程設(shè)計(jì)
- vc可視化課程設(shè)計(jì)mfc貪吃蛇
- 貪吃蛇課程設(shè)計(jì)
- 貪吃蛇課程設(shè)計(jì)
- 貪吃蛇c語言程序設(shè)計(jì)
- 貪吃蛇課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)貪吃蛇
- java課程設(shè)計(jì)--貪吃蛇
- 貪吃蛇課程設(shè)計(jì)報(bào)告
- 貪吃蛇課程設(shè)計(jì)報(bào)告
- 貪吃蛇vc課程設(shè)計(jì)
- 貪吃蛇課程設(shè)計(jì)報(bào)告
- android貪吃蛇課程設(shè)計(jì)報(bào)告
- java貪吃蛇游戲 課程設(shè)計(jì)
- java貪吃蛇課程設(shè)計(jì)報(bào)告
- java-課程設(shè)計(jì)--貪吃蛇
- 貪吃蛇游戲的實(shí)現(xiàn)課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論