基于mfc的貪吃蛇程序設(shè)計(jì)課程設(shè)計(jì)_第1頁
已閱讀1頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

評(píng)論

0/150

提交評(píng)論