MFC貪吃蛇.doc_第1頁
MFC貪吃蛇.doc_第2頁
MFC貪吃蛇.doc_第3頁
MFC貪吃蛇.doc_第4頁
MFC貪吃蛇.doc_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

Windows程序設(shè)計(jì)課程考核報(bào)告班 級(jí): 09軟件(1) 學(xué) 號(hào): 20090307148 姓 名: 楊昇昇 得 分: 2011年12月 13日目錄1. 課程設(shè)計(jì)目的及要求.31.1設(shè)計(jì)目的及問題描述.31.2設(shè)計(jì)要求.3 1.3軟件、硬件環(huán)境.32. 課程設(shè)計(jì)步驟.33. 課程設(shè)計(jì)內(nèi)容.4 3.1 概要設(shè)計(jì).43.1.1 程序總體框架描述.4 3.1.2程序常用類聲明.6 3.2主要技術(shù).6 3.3系統(tǒng)設(shè)計(jì)結(jié)果 (界面截圖、操作流程).74.課程設(shè)計(jì)總結(jié).15 4.1遇到的問題及如何解決.154.2參考文獻(xiàn).151. 課程設(shè)計(jì)目的及要求 1.1設(shè)計(jì)目的及問題描述貪食蛇是一個(gè)深受大眾喜愛的簡單游戲,玩家通過按鍵上的四個(gè)光標(biāo)控制蛇的上下左右四個(gè)方向移動(dòng),蛇頭碰撞到食物則表示食物被蛇吃掉,這時(shí)蛇的身長長一節(jié),接著出現(xiàn)食物,等待被蛇吃掉,如果蛇在移動(dòng)過程中,撞到墻壁或者身體交叉蛇頭撞到自己的身體游戲結(jié)束。1.2設(shè)計(jì)要求利用Microsoft Visual C+制作一個(gè)貪吃蛇的小游戲,要求:(1) 應(yīng)用MFC單文檔制作(2) 能夠記錄游戲成績(3) 可暫停/繼續(xù)并在玩家不愿游戲時(shí)停止游戲(4) 蛇的身體能夠隨著蛇吃的豆子數(shù)變化(5) 有說明文檔1.3軟件、硬件環(huán)境 設(shè)計(jì)環(huán)境:Microsoft Windows 7開發(fā)工具:Visual C+ 6.0游戲運(yùn)行環(huán)境:Microsoft Windows XP及以上版本2.課程設(shè)計(jì)步驟 (1)建立工程(2)添加控件(3)添加相關(guān)成員變量(4)寫入代碼(5)美化界面,修改錯(cuò)誤3.課程設(shè)計(jì)內(nèi)容 3.1 概要設(shè)計(jì) 在數(shù)據(jù)結(jié)構(gòu)上,用數(shù)組存儲(chǔ)蛇以及蛇的運(yùn)動(dòng)區(qū)域。在數(shù)組中,每個(gè)元素有四個(gè)方向,分別為RIGHT,LEFT,UP,DOWN.在沒有蛇身的區(qū)域,數(shù)組的元素值為0。在蛇身的每個(gè)節(jié)點(diǎn),用一個(gè)數(shù)組元素存儲(chǔ)當(dāng)前蛇節(jié)點(diǎn)的運(yùn)動(dòng)方向。通過改變數(shù)組中元素的值來表示蛇身的移動(dòng)。在程序中運(yùn)用定時(shí)器來保證蛇的持續(xù)移動(dòng)。每個(gè)一定的時(shí)間間隔,蛇移動(dòng)一格。在設(shè)計(jì)界面時(shí),在Visual C+ 6.0的環(huán)境下,建立基于單文檔的工程,在工程下設(shè)計(jì)游戲界面,實(shí)現(xiàn)貪食蛇運(yùn)行算法。在大矩形中,用20x20的像素單位表示每一個(gè)蛇的節(jié)點(diǎn)。當(dāng)數(shù)組節(jié)點(diǎn)的值不為0的時(shí)候,在大矩形中畫出相應(yīng)的蛇的節(jié)點(diǎn)矩形。并在蛇每移動(dòng)一小格的時(shí)候,重繪整個(gè)窗口。在對蛇身進(jìn)行繪畫時(shí)。通過數(shù)組元素的值將蛇身在矩形中顯示出來。在蛇身運(yùn)動(dòng)時(shí),首先在蛇頭位置蛇身增長一個(gè)節(jié)點(diǎn),然后判斷蛇頭是否到達(dá)食物所在位置,若在食物所在位置,則蛇尾不減一,蛇身繼續(xù)移動(dòng),若蛇頭不在食物位置,則蛇尾減一,蛇身繼續(xù)移動(dòng)。若蛇頭越界或者蛇頭與蛇身重疊,則游戲結(jié)束。3.1.1 程序總體框架描述 開始游戲暫停游戲退出游戲繼續(xù)游戲游戲控制模塊圖(1)如果蛇的頭部與isfood重合將isfood添加到蛇身中并產(chǎn)生新的isfood出界與自身相交移動(dòng)一格YNNN結(jié)束更新運(yùn)動(dòng)方向繼續(xù)圖(2)3.1.2程序常用類聲明1. CMenu:菜單 2. CView:視圖,負(fù)責(zé)內(nèi)存數(shù)據(jù)與用戶的交互。包括數(shù)據(jù)的顯示、用戶操作的響應(yīng)(如菜單的選取、鼠標(biāo)的響應(yīng))。最重要的是OnDraw(重畫窗口),通常用CWnd:Invalidate()來啟動(dòng)它。另外,它通過消息映射表處理菜單、工具條、快捷鍵和其他用戶消息。你自己的許多功能都要加在里面,你打交道最多的就是它3. CDC:設(shè)備文本。無論是顯示器還是打印機(jī),都是畫圖給用戶看。這圖就抽象為CDC。CDC與其他GDI(圖形設(shè)備接口)一起,完成文字和圖形、圖像的顯示工作。把CDC想象成一張紙,每個(gè)窗口都有一個(gè)CDC相聯(lián)系,負(fù)責(zé)畫窗口。CDC有個(gè)常用子類CClientDC(窗口客戶區(qū)),畫圖通常通過CClientDC完成4. CBrush:刷子,填充 5. CString:字符串。封裝了C中的字符數(shù)組,非常實(shí)用。 6. CPoint:點(diǎn),就是(x,y)對 7. CRect:矩形,就是(left,top,right,bottom)8. SetTime:計(jì)時(shí)器,在MFC程序中SetTimer被封裝在CWnd類中,調(diào)用就不用指定窗口句柄了 3.2主要技術(shù)(1) CView類中的消息響應(yīng)(2) 控件的消息響應(yīng)(3) 基于CView類內(nèi)的具體游戲?qū)崿F(xiàn)(4) 數(shù)組(5) 游戲圖形的實(shí)現(xiàn)用CDC類實(shí)現(xiàn)。3.3系統(tǒng)設(shè)計(jì)結(jié)果 (界面截圖、操作流程)所有添加的函數(shù):步驟:1.首先在文件開頭處分別定義 蛇 和食物 的全局變量struct Snakeint x,y;int len;int direct;Snake50;struct Foodint x;int y;int isfood;Food;2.設(shè)定蛇的長度,初始坐標(biāo),食物void CMy7148View:OnInitialUpdate() CView:OnInitialUpdate();Snake0.x=10;Snake0.y=10;Snake1.x=11;Snake1.y=10;Snake2.x=12;Snake2.y=10;Snake0.direct=3;Snake0.len=3;Food.isfood=1;/ TODO: Add your specialized code here and/or call the base class3. 對OnKeyDown()具體添加代碼,Snake0代表的是蛇頭,我們對蛇頭的方向Snake0.direct進(jìn)行判斷。void CMy7148View:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) / TODO: Add your message handler code here and/or call defaultswitch(nChar)case VK_UP:if(Snake0.direct!=2)Snake0.direct=1;break;case VK_DOWN:if(Snake0.direct!=1)Snake0.direct=2;break;case VK_LEFT:if(Snake0.direct!=4)Snake0.direct=3;break;case VK_RIGHT:if(Snake0.direct!=3)Snake0.direct=4;break;CView:OnKeyDown(nChar, nRepCnt, nFlags);4.對oninit()添加代碼,利用Windows給我們提供的CDC類來進(jìn)行畫圖,我們首先用一個(gè)指向CDC類的指針去接受與該窗口相關(guān)聯(lián)的DC句柄,然后用定義畫刷一個(gè)DrawBrush對象,并且畫刷初始化顏色。并且用SelectObject(&DrawBrush);函數(shù)把對象畫刷選入到設(shè)備描述表中,用for循環(huán)依次把貪吃蛇的3個(gè)節(jié)點(diǎn)畫出來。void CMy7148View:oninit()CDC *pDC=GetDC();CBrush DrawBrush=(RGB(0,100,0);CBrush *Drawbrush=pDC-SelectObject(&DrawBrush);for(int i=0;iRectangle(Snakei.x*20,Snakei.y*20,(Snakei.x+1)*20,(Snakei.y+1)*20);pDC-SelectObject(DrawBrush);5.控件添加代碼void CMy7148View:OnStart() SetTimer(1,3000,NULL);AfxMessageBox(3秒后開始游戲);/ TODO: Add your command handler code herevoid CMy7148View:OnPause() KillTimer(1);AfxMessageBox(暫停游戲);/ TODO: Add your command handler code herevoid CMy7148View:OnContinue() SetTimer(1,10,NULL);/ TODO: Add your command handler code herevoid CMy7148View:OnExit() AfxMessageBox(退出游戲); exit (0);/ TODO: Add your command handler code here6. 對OnDraw()的添加代碼,用畫刷畫一個(gè)背景,并且畫出3個(gè)矩形區(qū)域void CMy7148View:OnDraw(CDC* pDC)CMy7148Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);CBrush backBrush(RGB(0,0,0);CBrush* pOldBrush=pDC-SelectObject(&backBrush);CRect rect;pDC-GetClipBox(&rect);pDC-PatBlt(rect.left,rect.top,rect.Width(),rect.Height(),PATCOPY);pDC-SelectObject(pOldBrush);pDC-Rectangle(19,19,501,501);oninit();/ TODO: add draw code for native data here7. 對OnTime()的添加代碼void CMy7148View:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call defaultCDC *pDC=GetDC();CString soure;if(Snake0.len=2)SetTimer(1,370,NULL);if(Snake0.len=3)SetTimer(1,270,NULL);if(Snake0.len=6)SetTimer(1,200,NULL);if(Snake0.len=9)SetTimer(1,100,NULL);soure.Format(游戲結(jié)束!n得分:%d,(Snake0.len-3)*1); /撞界判斷if(Snake0.x*20=37|Snake0.y*20=462|Snake0.y*20=462)KillTimer(1);AfxMessageBox(soure);/蛇身相撞判斷if(Snake0.len3)for(int sn=Snake0.len-1;sn0;sn-)if(Snake0.x*20=Snakesn.x*20&Snake0.y*20=Snakesn.y*20)KillTimer(1);AfxMessageBox(soure);pDC-SelectStockObject(WHITE_PEN);pDC-Rectangle(SnakeSnake0.len-1.x*20,SnakeSnake0.len-1.y*20,(SnakeSnake0.len-1.x+1)*20,(SnakeSnake0.len-1.y+1)*20);for(int i=Snake0.len-1;i0;i-)Snakei.x=Snakei-1.x;Snakei.y=Snakei-1.y;/行走方向判斷if(Snake0.direct=1)Snake0.y-; if(Snake0.direct=2)Snake0.y+;if(Snake0.direct=3)Snake0.x-;if(Snake0.direct=4)Snake0.x+;pDC-SelectStockObject(BLACK_PEN);CBrush DrawBrush=(RGB(0,100,0);CBrush *Drawbrush=pDC-SelectObject(&DrawBrush);pDC-Rectangle(Snake0.x*20,Snake0.y*20,(Snake0.x+1)*20,(Snake0.y+1)*20);pDC-SelectObject(DrawBrush); /判斷吃豆的條件,撞到就吃if(Snake0.x*20=Food.x*20&Snake0.y*20=Food.y*20)Snake0.len+;Food.isfood=1;SnakeSnake0.len-1.x=SnakeSnake0.len-2.x;SnakeSnake0.len-1.y=SnakeSnake0.len-2.y;/如果食物被吃了 就生成if(Food.isfood=1)srand(unsigned)time(NULL);dofor(int isfo=Snake0.len-1;isfo=0;isfo-)if(Snake0.x*20=Snakeisfo.x*20&Snake0.y*20=Snakeisfo.y*20)Food.x=rand()%25;Food.y=rand()%25;while(Food.x*2070|Food.y*20470|Food.y*20470);pDC-Rectangle (Food.x*20,Food.y*20,(Food.x+1)*20,(Food.y+1)*20);Food.isfood=0;CView:OnTimer(nIDEvent);游戲運(yùn)行界面:游戲說明:游戲開始:游戲結(jié)束:游戲暫停:4.課程設(shè)計(jì)總結(jié) 4.1遇到的問題及如何解決課程設(shè)計(jì)時(shí)遇到很多問題,絕大部分都已經(jīng)解決了,比如(1)退出單文檔時(shí),應(yīng)該是exit(0);而不是exit 0;(2)if(Snake0.direct!=2)Snake0

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論