




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、武漢理工大學(xué)可視化編程課程設(shè)計(jì)說明書目錄1.概述及課設(shè)要求21.1基于MFC的貪吃蛇游戲設(shè)計(jì)與實(shí)現(xiàn)21.2概述22.簡單的操作及功能說明33.MFC具體設(shè)計(jì)過程及相應(yīng)模塊的功能43.1創(chuàng)建工程43.2添加消息,成員函數(shù),控件.43.3定義全局變量并確定貪吃蛇的基本大小43.4響應(yīng)鍵盤操作的消息63.5對OnRButtonDown()具體添加代碼73.6對貪吃蛇初始化(畫圖)73.7對相關(guān)控件的的功能設(shè)定83.8用畫刷畫一個(gè)背景,并畫3個(gè)矩形區(qū)域.103.9貪吃蛇的前行中的具體的算法和判斷.114.游戲運(yùn)行的界面及相關(guān)的截圖145系統(tǒng)設(shè)計(jì)過程中自己所遇到的問題及相應(yīng)的解決方法和解決過程。166結(jié)
2、束語187參考文獻(xiàn):19本科課程論文評分標(biāo)準(zhǔn)201.概述及課設(shè)要求1.1基于MFC的貪吃蛇游戲設(shè)計(jì)與實(shí)現(xiàn)1.游戲界面設(shè)計(jì)2.食物的初始化3.游戲開始以及具體實(shí)現(xiàn)1.2概述 此次課程設(shè)計(jì)我利用MFC編寫了一個(gè)貪吃蛇游戲,游戲擁有結(jié)束時(shí)計(jì)分,開始,暫停,繼續(xù),退出,重新開始等功能,并且隨著貪吃蛇的長度的增加,刷新的速度(移動(dòng)的速度)也會(huì)變快.2.簡單的操作及功能說明1 運(yùn)行程序,游戲界面打開。2 點(diǎn)擊“游戲->游戲開始”,出現(xiàn)圍墻界面,一條蛇在密閉的白色矩形內(nèi),在圍墻內(nèi)隨機(jī)出現(xiàn)一個(gè)食物,游戲開始。 3 通過四個(gè)方向鍵控制蛇的運(yùn)動(dòng)方向,吃掉隨機(jī)出現(xiàn)的豆子,若不小心碰到墻壁或者與自身相交,則該輪
3、游戲結(jié)束。4 點(diǎn)擊“游戲->游戲暫?!?,暫停游戲。5 點(diǎn)擊“游戲->游戲繼續(xù)”,繼續(xù)游戲。6 點(diǎn)擊“游戲->游戲退出”,退出游戲。7 點(diǎn)擊“游戲->重新開始”,重新開始。8 游戲會(huì)根據(jù)蛇身的長度自動(dòng)調(diào)節(jié)難易程度。3.MFC具體設(shè)計(jì)過程及相應(yīng)模塊的功能 3.1創(chuàng)建工程 打開VisualC+新建一個(gè)MFC AppWizard單文檔工程,取名snake 3.2添加消息,成員函數(shù),控件. 首先在已有工程下的“ClassView”中右鍵CView類添加以下Windows信息1 WM_KEYDOWN2 WM_RBUTTONDOWN3 WM_TIMER右鍵CView類選擇“ADD V
4、irtual Funciton”選OnInitialUpdate()這里的OnInitialUpdate()是對視圖的初始化.后再在csnakeview類中添加一個(gè)成員函數(shù)oninit()用來對貪吃蛇的外觀進(jìn)行初始化. “ResourceView”進(jìn)行控件的具體設(shè)計(jì),這里我們在Menu文件夾中把“IDR_MAINFRAME”中默認(rèn)的控件全部刪除,后自己添加控件并建立類向?qū)?如下圖所示;3.3定義全局變量并確定貪吃蛇的基本大小struct Snakeint x,y;int len;int direct;Snake50; struct Food int x;int y; int isfood;Fo
5、od;void CSnakeView: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 class我們假設(shè)貪吃蛇開始有3個(gè)節(jié)點(diǎn),食物則是認(rèn)為1無0有.3.4響應(yīng)鍵盤操作的消息void CSnakeView:OnKe
6、yDown(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:i
7、f(Snake0.direct!=3)Snake0.direct=4;break; CView:OnKeyDown(nChar, nRepCnt, nFlags);CView:OnKeyDown(nChar, nRepCnt, nFlags);分別對上下左右的消息進(jìn)行響應(yīng),snake0.direct表示的時(shí)蛇頭方向.而case VK_UP:if(Snake0.direct!=2)Snake0.direct=1;break; 意思就是當(dāng)Snake0.direct的方向此時(shí)并不等于“下”的時(shí)候,才能做出“上”的操作動(dòng)作,同理其他的代碼亦是相同的意思.3.5對OnRButtonDown()具體添加代
8、碼 void CSnakeView:OnRButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCString str;str.Format("%d,%d",point.x,point.y);AfxMessageBox(str);CView:OnRButtonDown(nFlags, point);CView:OnRButtonDown(nFlags, point);CView:OnRButtonDown(nFlags, poin
9、t);這個(gè)函數(shù)用于當(dāng)你用鼠標(biāo)右鍵屏幕,就會(huì)馬上顯示當(dāng)前位置的坐標(biāo)信息。其實(shí)這個(gè)函數(shù)可有可無,但是我在后面的的確定初始化窗口的大小很有作用,于是我在當(dāng)時(shí)決定將其加進(jìn)去.3.6對貪吃蛇初始化(畫圖) void CSnakeView:Oninit() CDC *pDC=GetDC(); CBrush DrawBrush=(RGB(100,0,0); CBrush *Drawbrush=pDC->SelectObject(&DrawBrush); for(int i=0;i<=Snake0.len-1;i+) pDC->Rectangle(Snakei.x*20,Snakei
10、.y*20,(Snakei.x+1)*20,(Snakei.y+1)*20); pDC->SelectObject(DrawBrush); 利用Windows給我們提供的CDC類來進(jìn)行畫圖,我們首先用一個(gè)指向CDC類的指針去接受與該窗口相關(guān)聯(lián)的DC句柄,然后用定義畫刷一個(gè)DrawBrush對象,并且用RGB(100,100,100)來給畫刷初始化顏色。并且用SelectObject(&DrawBrush);函數(shù)把對象畫刷選入到設(shè)備描述表中,用for循環(huán)依次把貪吃蛇的3個(gè)節(jié)點(diǎn)畫出來。 3.7對相關(guān)控件的的功能設(shè)定 void CSnakeView:OnPause() / TODO:
11、Add your command handler code here KillTimer(1); void CSnakeView:OnContinue() / TODO: Add your command handler code hereSetTimer(1,10,NULL);void CSnakeView:OnExit() / TODO: Add your command handler code here exit (0);void CSnakeView:OnStart() / TODO: Add your command handler code hereSetTimer(1,30,N
12、ULL); SetTimer(m_hWnd,1,1000,NULL); /一個(gè)1秒觸發(fā)一次的定時(shí)器在MFC程序中SetTimer被封裝在CWnd類中,所以我在調(diào)用就不用指定窗口句柄了,并且找資料得到SetTimer API函數(shù)的原型UINT_PTR SetTimer(HWND hWnd, / 窗口句柄UINT_PTR nIDEvent, / 定時(shí)器ID,多個(gè)定時(shí)器時(shí),可以通過該ID判斷是哪個(gè)定時(shí)器UINT uElapse, / 時(shí)間間隔,單位為毫秒TIMERPROC lpTimerFunc / 回調(diào)函數(shù));因此更加容易的理解了settime的使用及原理.3.8用畫刷畫一個(gè)背景,并畫3個(gè)矩形區(qū)域
13、. void CSnakeView:OnDraw(CDC* pDC)CSnakeDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereCBrush backBrush(RGB(100,100,100);CBrush* pOldBrush = pDC->SelectObject(&backBrush);CRect rect;pDC->GetClipBox(&rect);pDC->PatBlt(rect.left, rect.top, rect.
14、Width(), rect.Height(),PATCOPY);pDC->SelectObject(pOldBrush);pDC->Rectangle(19,19,501,501);Oninit(); OnDraw()函數(shù)眾所周知視圖類中的輸出.視圖類的輸出基本上都是在視圖類的OnDraw函數(shù)中處理的,系統(tǒng)會(huì)準(zhǔn)備好入?yún)?,然后調(diào)用OnDraw函數(shù)3.9貪吃蛇的前行中的具體的算法和判斷. void CSnakeView:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call defaul
15、tCDC *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("得分:%d!",(Snake0.len-3)*10); /撞界判斷if(Snake0.x*20<=37|Snake0.y*20<=37|Snake0.x*20>=462|Sn
16、ake0.y*20>=462)KillTimer(1);AfxMessageBox(soure);/ s=0;/蛇身相撞判斷if(Snake0.len>3)for(int sn=Snake0.len-1;sn>0;sn-)if(Snake0.x*20=Snakesn.x*20&&Snake0.y*20=Snakesn.y*20)KillTimer(1);AfxMessageBox(soure);/ s=0;/pDC->SelectStockObject(WHITE_PEN);pDC->Rectangle(SnakeSnake0.len-1.x*20
17、,SnakeSnake0.len-1.y*20,(SnakeSnake0.len-1.x+1)*20,(SnakeSnake0.len-1.y+1)*20);for(int i=Snake0.len-1;i>0;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
18、(BLACK_PEN);CBrush DrawBrush=(RGB(100,100,100);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.isfoo
19、d=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*20&
20、lt;70|Food.y*20<70|Food.x*20>430|Food.y*20>430);pDC->Rectangle(Food.x*20,Food.y*20,(Food.x+1)*20,(Food.y+1)*20);Food.isfood=0;CView:OnTimer(nIDEvent);4.游戲運(yùn)行的界面及相關(guān)的截圖 5系統(tǒng)設(shè)計(jì)過程中自己所遇到的問題及相應(yīng)的解決方法和解決過程。(1) 在設(shè)計(jì)重新開始時(shí),貪吃蛇出現(xiàn)了重疊的現(xiàn)象,即出現(xiàn)了多條的貪吃蛇如下圖 解決方法;之所以會(huì)出現(xiàn)重疊,可能是在再次調(diào)用onstart函數(shù)時(shí)界面沒有被重新的清理干凈,所以在調(diào)用開始函
21、數(shù)前寫了一段刷新界面的代碼(即再次填充原本整個(gè)背景的顏色如下: CDC *pDC=GetDC();CBrush backBrush(RGB(100,100,100);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
22、(19,19,501,501);使得問題得到解決,先嘗試自己能想到的的可能的原因.(2)修改窗口初始的大小,一開始默認(rèn)的窗口比例不協(xié)調(diào),看上去不舒服,.于是查詢資料(網(wǎng)絡(luò))得到修改的方法;BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs) if( !CFrameWnd:PreCreateWindow(cs) ) return FALSE; / TODO: Modify the Window class or styles here by modifying / the CREATESTRUCT cs cs.cx = 100; cs.cy = 100; return TRUE;(3)同時(shí)在寫程序時(shí)一些細(xì)節(jié)亦要注意,經(jīng)檢查僅僅只是大小寫的問而已,有時(shí)還會(huì)浪費(fèi)一定的時(shí)間.(4)一開始我的貪吃蛇的移動(dòng)速度是不變的,寫完后我在想能不能隨著游戲的進(jìn)行而變的更難,于是我嘗試了很多方法,調(diào)用各種函數(shù),最后還是在看程序想起自己編程時(shí)的settimer,于是就查相關(guān)的東西,最后寫出: if(Snake0.len=2)SetTimer(1,370,NULL);if(Snake0.len=3)SetTimer(1,
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高校微課程設(shè)計(jì)與應(yīng)用學(xué)習(xí)心得體會(huì)
- 以天津音樂學(xué)院為例探索音樂藝術(shù)院校大學(xué)生心理健康教育路徑
- 以境啟思:高中思想政治課貫穿式情境教學(xué)的深度探究與實(shí)踐
- 以圖啟智:初中地理教學(xué)中地圖對學(xué)生智能培養(yǎng)的深度探究
- 工業(yè)自動(dòng)化設(shè)備維護(hù)專業(yè)實(shí)習(xí)總結(jié)范文
- 重慶市西北狼教育聯(lián)盟2024-2025學(xué)年高一上學(xué)期入學(xué)考試物理試題
- 道路環(huán)保工程施工合同書范文
- 政務(wù)服務(wù)審批辦理流程
- 港口建設(shè)危大工程清單及安全管理措施
- 東華大學(xué)自主招生健康體魄自薦信范文
- 【MOOC】移動(dòng)通信-河海大學(xué) 中國大學(xué)慕課MOOC答案
- 危險(xiǎn)廢物焚燒運(yùn)營管理培訓(xùn)考核試卷
- 無人機(jī)裝調(diào)檢修工理論知識考試題庫及答案
- 充電設(shè)施運(yùn)營管理制度
- 幼兒園大班數(shù)學(xué)《特別的尺子》微課件
- 雅馬哈RX-V365使用說明書
- 照相館管理制度
- IECQ QC 080000:2017 第四版標(biāo)準(zhǔn)(中文版)
- 醫(yī)用耗材管控中的難點(diǎn)及對策研究
- 2024屆杭州市濱江區(qū)小升初考試數(shù)學(xué)試卷含解析
- 羽毛球教案18課時(shí)完整版
評論
0/150
提交評論