版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
貪吃蛇試驗(yàn)匯報(bào)21143049信計(jì)1212許圣
概述本次課程設(shè)計(jì)我運(yùn)用MFC制作了一種貪吃蛇游戲,顧客可以通過上下左右控制蛇的移動方向,游戲會根據(jù)貪吃蛇身體的長度自動增長難度。在游戲過程中,會記錄運(yùn)行時(shí)間和所得分?jǐn)?shù),我還添加了bmp格式的圖片作為游戲背景。功能描述2.1設(shè)計(jì)思緒本軟件重要由三個模塊構(gòu)成,它們分別是蛇運(yùn)行模塊,初始化處理模塊和顯示模塊。它們的作用分別是,初始化處理:初始化蛇頭位置與第一種點(diǎn)位置;蛇運(yùn)行模塊:控制蛇的上下左右運(yùn)行,并對蛇的運(yùn)行狀態(tài)進(jìn)行判斷,根據(jù)(吃點(diǎn)、未吃點(diǎn)、死亡等)狀態(tài)進(jìn)行不一樣的子程序模塊處理以及游戲者與否能晉級的判斷;顯示模塊:根據(jù)對蛇和點(diǎn)子的目前狀態(tài)進(jìn)行動畫顯示。重要有如下環(huán)節(jié):定義蛇類和食物類,初始化貪吃蛇各項(xiàng)組員變量,包括圖像的出目前屏幕的初始位置,長度,以及蛇的行走方向。食物類的定義包括出現(xiàn)的初始位置,以及食物與否被吃掉的判斷。用數(shù)組初始化長度為4的貪吃蛇,并且默認(rèn)出現(xiàn)一種食物。在CView類上運(yùn)用MFC提供的Windows消息中WM_TIMER消息,運(yùn)用OnTimer()函數(shù)讓系統(tǒng)提供一種時(shí)鐘節(jié)拍,更新游戲詳細(xì)游戲?qū)崿F(xiàn),包括蛇撞到自已和圍墻都將使游戲結(jié)束,判斷吃豆等,其中還包括根據(jù)蛇的長度來進(jìn)行游戲難度的變化。詳細(xì)鍵盤游戲操作運(yùn)用到Windows消息響應(yīng)中的WM_KEYDOWN,用OnKeyDown()來響應(yīng)玩家的實(shí)際操作。添加了bmp格式的圖片作為游戲背景。整體流程圖如下圖1。
設(shè)置自動移動定期器和增長食物定期器設(shè)置自動移動定期器和增長食物定期器游戲開始桌面初始化初始化蛇頭和蛇移動方向隨機(jī)初始化一種食物到桌面蛇移動蛇吃食?蛇增長繼續(xù)?蛇死亡?桌面上隨機(jī)生成食物退出程序是是否否圖1:系統(tǒng)流程圖
2.2功能簡介運(yùn)行程序,出現(xiàn)圍墻界面,一條蛇在密閉的圍墻內(nèi),在圍墻內(nèi)隨機(jī)出現(xiàn)一種食物,出現(xiàn)bmp格式圖片的背景。點(diǎn)擊“游戲->游戲開始”,游戲開始。還可暫停游戲繼續(xù)游戲開始後,界面右下角會同步游戲得分。通過四個方向鍵控制蛇的運(yùn)動方向,吃掉隨機(jī)出現(xiàn)的豆子,若不小心碰到墻壁或者與自身相交,則該輪游戲結(jié)束。游戲會根據(jù)蛇身的長度自動調(diào)整難易程度。詳細(xì)設(shè)計(jì)3.1重要函數(shù)voidCSnakeView::OnDraw(CDC*pDC)//顯示背景圖片voidCSnakeView::OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)//按照顧客的按鍵來控制蛇的移動voidCSnakeView::OnTimer(UINTnIDEvent)//根據(jù)蛇的長度來進(jìn)行SetTimer()函數(shù)的定義,可以根據(jù)長度來進(jìn)行游戲難度的設(shè)定。//撞界判斷//蛇身相撞判斷//抹掉蛇行走的痕跡//判斷吃豆的條件,撞到就吃//假如食物被吃了就生成voidCSnakeView::oninit()//進(jìn)行貪吃蛇外觀的初始化voidCSnakeView::OnGameStart()//開始游戲voidCSnakeView::IniAim()//初始化目的的位置voidCSnakeView::IniGame()//初始化游戲voidCSnakeView::ReDisplay(CPointpPoint)boolCSnakeView::ReadBmp(char*bmpName)3.2重要功能簡介:3.2.1背景圖片加載:定義變量和函數(shù)用于讀取bmp圖片做準(zhǔn)備:BITMAPINFOHEADERhead; unsignedchar*pBmpBuf; boolReadBmp(char*bmpName);定義ReadBmp函數(shù)用于讀取bmp格式的圖片,在初始化的時(shí)候調(diào)用該函數(shù)ReadBmp("BootPic.bmp"),來讀取背景圖片。在OnDraw函數(shù)中實(shí)現(xiàn)對圖片的刷新:CRectrec; GetClientRect(&rec); SetStretchBltMode(pDC->m_hDC,HALFTONE); SetBrushOrgEx(pDC->m_hDC,0,0,NULL); StretchDIBits(pDC->m_hDC,rec.left,rec.top,rec.Width(),rec.Height(),0,0,head.biWidth,head.biHeight,pBmpBuf,(BITMAPINFO*)&head,DIB_RGB_COLORS,SRCCOPY);3.2.2初始化游戲:重要初始化蛇的初始化位置,實(shí)物的初始化位置:voidCSnakeView::IniGame(){ m_nLeft=20; m_nTop=20; m_nWidth=40; m_nHeight=30; m_nSize=10; m_nGameStatus=0; m_nDirect=1; m_nCount=0; m_aBody.RemoveAll(); m_aBody.Add(CPoint(2,7)); m_aBody.Add(CPoint(2,6)); m_aBody.Add(CPoint(2,5)); m_aBody.Add(CPoint(2,4)); m_nTime=0; m_nTime1=0; IniAim();}3.2.3控制游戲操作:鍵盤消息是顧客通過鍵盤發(fā)出的消息,是用來控制蛇的爬行方向。這個消息將會用到OnKeyDown()函數(shù)。OnKeyDown()函數(shù)根據(jù)顧客按下的按鍵執(zhí)行對應(yīng)的語句塊,即通過if判斷語句來實(shí)現(xiàn)。下面以RIGHT鍵為例進(jìn)行闡明。當(dāng)按下RIGHT鍵後,函數(shù)執(zhí)行第一種if分支,在該分支中,首先判斷蛇與否是向左走的,假如蛇是向左走的,則按右鍵無效,由于蛇不能“穿過”自已的身體。在滿足蛇不是向左走的條件後,進(jìn)入該分支,啟動與該方向?qū)?yīng)的時(shí)鐘函數(shù)SetTimer,SetTimer()通過不一樣的ID號來執(zhí)行OnTimer的不一樣分支,同步殺死其他時(shí)鐘函數(shù),并對蛇的運(yùn)行方向做重新標(biāo)識。voidCSnakeView::OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags){ //TODO:Addyourmessagehandlercodehereand/orcalldefault switch(nChar) { case38: m_nDirect=4; break; case40: m_nDirect=3; break; case37: m_nDirect=2; break; case39: m_nDirect=1; break; } CView::OnKeyDown(nChar,nRepCnt,nFlags);}voidCSnakeView::OnTimer(UINTnIDEvent){ //TODO:Addyourmessagehandlercodehereand/orcalldefault m_nTime1++; if(m_nTime1==10) { m_nTime++; m_nTime1=0; Invalidate(); } CPointuPoint=m_aBody.GetAt(0); intuTag=0; switch(m_nDirect) { case1: uPoint.y++; if(uPoint.y>=m_nWidth) uTag=1; break; case2: uPoint.y--; if(uPoint.y<0) uTag=1; break; case3: uPoint.x++; if(uPoint.x>=m_nHeight) uTag=1; break; case4: uPoint.x--; if(uPoint.x<0) uTag=1; break; } if(uTag==0) { for(inti=0;i<=m_aBody.GetUpperBound();i++) { CPointuPoint1=m_aBody.GetAt(i); if(uPoint1.x==uPoint.x&&uPoint1.y==uPoint.y) { uTag=1; break; } } } if(uTag==0) { m_aBody.InsertAt(0,uPoint); ReDisplay(uPoint); if(uPoint.x==m_pAim.x&&uPoint.y==m_pAim.y) { m_nCount++; IniAim(); Invalidate(); } else { CPointuPoint1=m_aBody.GetAt(m_aBody.GetUpperBound()); m_aBody.RemoveAt(m_aBody.GetUpperBound()); ReDisplay(uPoint1); } } else { KillTimer(1); AfxMessageBox("Fail!!!"); } CView::OnTimer(nIDEvent);}試驗(yàn)成果貪吃蛇進(jìn)入界面如下圖所示貪吃蛇的玩法如圖數(shù)字鍵盤下的方向鍵分別為上下左右,進(jìn)行控制,使蛇頭觸碰到食物。游戲結(jié)束界面如上圖所示,游戲結(jié)束後,會顯示游戲的最終得分??偨Y(jié)這次課程設(shè)計(jì),我選擇用MFC編寫一種貪食蛇的程序。在編寫程序之前,我只有很少的有關(guān)MFC的程序設(shè)計(jì)知識,因此,在剛開始,我碰到了諸多困難。為此,我在網(wǎng)上看了許多有關(guān)貪食蛇的算法,測試他人的代碼==,并學(xué)以致用。才開始寫我的貪食蛇,整合學(xué)習(xí)的東西并且加了諸多附加功能。這次課程設(shè)計(jì)鍛煉了我的動手能力。通過完畢貪食蛇游戲的程序設(shè)計(jì),累積了我的實(shí)際編程經(jīng)驗(yàn),也提高了我獨(dú)立處理問題的能力。由于所學(xué)有限,經(jīng)驗(yàn)局限性,代碼常常出現(xiàn)錯誤,最終終于可以對的的運(yùn)行。但在過程中碰到了不少問題。例如在貪吃蛇行進(jìn)中急轉(zhuǎn)死亡的bug。食物生成不出來的問題食物長在蛇的身上--。。。,界面優(yōu)化插入圖片當(dāng)做背景的問題,最終通過查閱資料、請教他人修改了參數(shù)才得以處理。此
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 豪華大廈租賃合同三篇
- 五彩繽紛的成長路幼兒園工作總結(jié)
- 電競行業(yè)服務(wù)員工作總結(jié)
- 表達(dá)能力培養(yǎng)方案計(jì)劃
- 學(xué)會如何有效地分配學(xué)習(xí)時(shí)間
- 二零二五年度海洋資源項(xiàng)目融資合作協(xié)議書3篇
- 金融行業(yè)顧問工作總結(jié)
- 紡織行業(yè)安全隱患排查
- 二零二五年度個人抵押貸款風(fēng)險(xiǎn)評估合同
- 二零二五個人分紅協(xié)議范本適用于互聯(lián)網(wǎng)平臺分紅合作2篇
- 現(xiàn)代科學(xué)技術(shù)概論智慧樹知到期末考試答案章節(jié)答案2024年成都師范學(xué)院
- 軟件模塊化設(shè)計(jì)與開發(fā)標(biāo)準(zhǔn)與規(guī)范
- 網(wǎng)絡(luò)安全基礎(chǔ)知識入門教程
- AI智慧物流園區(qū)整體建設(shè)方案
- 2024年遼寧鐵道職業(yè)技術(shù)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫含答案解析
- 無痛人工流產(chǎn)術(shù)課件
- 有機(jī)農(nóng)業(yè)種植模式
- 勞務(wù)派遣招標(biāo)文件
- 法醫(yī)病理學(xué)課件
- 介紹uppc技術(shù)特點(diǎn)
- 采空區(qū)穩(wěn)定性可靠度分析
評論
0/150
提交評論