




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
貪吃蛇程序程序設(shè)計匯報【1】游戲簡介產(chǎn)生一種固定大小有邊界的游戲區(qū)域,蛇從區(qū)域的中心開始,由玩家通過鍵盤控制蛇的運動方向,用蛇頭去吃隨機分布在游戲區(qū)域內(nèi)的食物;蛇的運動限制在游戲區(qū)域內(nèi),游戲區(qū)域有邊界,因此蛇在區(qū)域內(nèi)作循環(huán)運動;蛇的運動方向為直線運動,只走橫和豎的方向,不走斜線;蛇身體的長度從4開始每吃掉一份食物就增長一種長度;食物的出現(xiàn)安照隨機分布的原則,蛇吃掉一份后隨即在游戲區(qū)域內(nèi)放一份新的食物;每吃掉一份食物得分為1,游戲結(jié)束后記錄所有的得分;游戲結(jié)束的條件為:在控制蛇的過程中蛇頭碰到蛇的身體的任何部位或者碰到四壁?!?】基本概念,要點分析蛇的活動區(qū)域是由若干個小方格構(gòu)成的。當這些小方格展現(xiàn)灰色時,便顯示蛇身。設(shè)整個區(qū)域由由m×n個方格構(gòu)成,最左角上的方格坐標為(0,0),蛇由若干個相鄰的方格構(gòu)成的,將這些方格的坐標依蛇頭至蛇尾的次序存入到一種數(shù)組中便代表了蛇身。當蛇在游戲區(qū)域中游動一格時,所對應(yīng)的數(shù)組操作應(yīng)當是將新的位置坐標插入到數(shù)組頭部,同步將數(shù)組中最終一種元素刪除,這項工作可以用一種一般的數(shù)組來完畢,但當進行插入操作時需要自己移動數(shù)組中的元素;也可以使用CArray來完畢這些工作,CArray的組員函數(shù)提供了需要的操作,這樣做更簡樸某些。游戲使用四個方向鍵來控制它的前進方向,在OnKeyDown消息處理函數(shù)中,根據(jù)不一樣的方向鍵設(shè)置組員變量m_nDirect的值。當在菜單中選擇開始時,啟動了定期器,游戲開始,在定期器消息處理函數(shù)中,根據(jù)m_nDirect的值判斷出蛇的下個位置,假如沒有超過邊界或碰到自身,則它可以移到新的位置。假如吃到了食物,則在CArray中只插入而不刪除最終一種元素,蛇身長度增長。此外值得注意的是,當蛇移動一格時,只有蛇頭和蛇身的位置需要重繪,為此專門編寫了組員函數(shù)ReDisplay來刷新一種小格?!?】程序概要設(shè)計程序流程圖如下:游戲載入內(nèi)存并初始化界面游戲載入內(nèi)存并初始化界面判斷游戲與否開始單擊按鈕開始游戲沒有開始游戲,就返回初始界面貪吃蛇開始移動(初始方向向左)根據(jù)鍵盤消息判斷蛇頭的運動方向根據(jù)蛇頭的坐標和食物的坐標判斷蛇與否已經(jīng)得到食物假如已經(jīng)得到食物,則蛇的身體加長,積分器加一假如沒有得到食物,則蛇的身體不變,積分器不變根據(jù)蛇頭的坐標、蛇身體的坐標和墻壁的坐標判斷蛇與否已經(jīng)撞墻或者自己咬到自己假如沒有撞墻并且沒有自己咬到自己則程序繼續(xù)進行假如已經(jīng)撞墻或者自己咬到自己則程序終止貪吃蛇程序結(jié)束積分器開始計分【4】詳細設(shè)計過程:(1)新建工程Snake,在MFC的向?qū)У谝徊竭x擇SingleDocument,按Finishi結(jié)束。(2)選擇ResourceView窗口,打開菜單編輯器,在頂層菜單上添加一種名為“游戲”的彈出式菜單,該菜單下再添加一種名為“開始”的子菜單,其ID為ID_GAME_START,如下圖所示。(3)在ClassWizard中為剛剛編輯好的菜單添加消息處理函數(shù),打開ClassWizard,選中MessageMaps頁。在ClassName中選擇CSnakeView,在ObjectID中選擇ID_Game_START,在Messages中選擇COMMAND,添加消息處理函數(shù)。(4)在ClassWizard中添加鍵盤消息處理函數(shù)。打開ClassWizard,選中MessageMaps頁。在ClassName中選擇CSnakeView,在ObjectID中選擇CSnakeView,在Messages中選擇WM_KeyDown,添加消息處理函數(shù)。(5)在ClassWizard中添加定期器消息處理函數(shù)。打開ClassWizard,選中MessageMaps頁。在ClassName中選擇CSnakeView,在ObjectID中選擇CSnakeView,在Messages中選擇WM_Timer,添加消息處理函數(shù)。(6)編輯生成代碼,完畢程序?!?】運用MFC類向?qū)砑哟a環(huán)節(jié)如下:(1)選擇ClassView窗口,雙擊CSnakeView類,添加如下組員變量。并添加頭文獻:#include<Afxtempl.h>classCSnakeView:publicCView{private: voidReDispilay(CPointpPoint);voidIniAim(); voidIniGame(); intm_nLeft,m_nTop,m_nWidth,m_nHeight,m_nSize;//起始坐標,寬高(格數(shù)0),每格大小 intm_nDirect;//目前方向 CPointm_pAim;//目前坐標 CArray<CPoint,CPoint>m_aBody;//蛇身 intm_nGameStatus;//游戲狀態(tài):0-未開始,1-開始 intm_nCount;//吃掉目的數(shù) intm_nTime,m_nTime1;//用掉的時間protected://createfromserializationonly CSnakeView(); DECLARE_DYNCREATE(CSnakeView)//Attributespublic: CSnakeDoc*GetDocument();//Operationspublic://Overrides //ClassWizardgeneratedvirtualfunctionoverrides //{{AFX_VIRTUAL(CSnakeView) public: virtualvoidOnDraw(CDC*pDC);//overriddentodrawthisview virtualBOOLPreCreateWindow(CREATESTRUCT&cs); protected: virtualBOOLOnPreparePrinting(CPrintInfo*pInfo); virtualvoidOnBeginPrinting(CDC*pDC,CPrintInfo*pInfo); virtualvoidOnEndPrinting(CDC*pDC,CPrintInfo*pInfo); //}}AFX_VIRTUAL//Implementationpublic: virtual~CSnakeView();#ifdef_DEBUG virtualvoidAssertValid()const; virtualvoidDump(CDumpContext&dc)const;#endifprotected://Generatedmessagemapfunctionsprotected: //{{AFX_MSG(CSnakeView) afx_msgvoidOnGameStart(); afx_msgvoidOnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags); afx_msgvoidOnTimer(UINTnIDEvent); afx_msgvoidOnPaint(); //}}AFX_MSG DECLARE_MESSAGE_MAP()};(2)在CSnakeView.Cpp文獻中添加3個組員函數(shù)IniAim(),IniGame()和ReDisplay()://該函數(shù)隨機產(chǎn)生一種供蛇吃的目的,假如該目的碰巧與蛇身重疊,則重新產(chǎn)生一種voidCSnakeView::IniAim(){ intuX,uY;//目的位置 while(1) { uX=rand()%m_nHeight; uY=rand()%m_nWidth; intuTag=0; for(inti=0;i<=m_aBody.GetUpperBound();i++) { CPointuPoint=m_aBody.GetAt(i); if(uPoint.x==uX||uPoint.y==uY)//目的與蛇身重疊 { uTag=1; break; } } if(uTag==0) break; } m_pAim=CPoint(uX,uY);//產(chǎn)生的目的寄存在組員變量中}//該函數(shù)對游戲初始化,定義游戲的初始狀態(tài)voidCSnakeView::IniGame(){ //游戲區(qū)域 m_nLeft=20; m_nTop=20; m_nWidth=40; m_nHeight=30; m_nSize=10; //游戲初始狀態(tài) 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; //初始化隨機數(shù)發(fā)生器 srand((unsigned)time(NULL)); //產(chǎn)生一種目的 IniAim();}//刷新游戲區(qū)域中pPoint處的一種小方格voidCSnakeView::ReDisplay(CPointpPoint){ InvalidateRect(CRect(m_nLeft+pPoint.y*m_nSize,m_nTop+pPoint.x*m_nSize,m_nLeft+(pPoint.y+1)*m_nSize,m_nTop+(pPoint.x+1)*m_nSize));}(3)修改CSnakeView的構(gòu)造函數(shù),完畢游戲的初始化:CSnakeView::CSnakeView(){ //TODO:addconstructioncodehere IniGame();}(4)在OnDraw中加入代碼,顯示游戲界面:voidCSnakeView::OnDraw(CDC*pDC){ CSnakeDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); //TODO:adddrawcodefornativedatahere //畫游戲區(qū)域 pDC->SelectStockObject(WHITE_BRUSH); pDC->Rectangle(CRect(m_nLeft-1,m_nTop-1,m_nLeft+m_nWidth*m_nSize+1,m_nTop+m_nHeight*m_nSize+1)); //顯示目前用時 CStringuStr; uStr.Format("目前用時:%d",m_nTime); pDC->TextOut(m_nLeft+m_nWidth*m_nSize+30,40,uStr); //顯示目前得分 uStr.Format("目前得分:%d",m_nCount); pDC->TextOut(m_nLeft+m_nWidth*m_nSize+30,140,uStr); //顯示目的 pDC->SelectStockObject(LTGRAY_BRUSH); pDC->Rectangle(CRect(m_nLeft+m_pAim.y*m_nSize,m_nTop+m_pAim.x*m_nSize,m_nLeft+(m_pAim.y+1)*m_nSize,m_nTop+(m_pAim.x+1)*m_nSize)); //畫蛇 for(inti=0;i<=m_aBody.GetUpperBound();i++) { CPointuPoint=m_aBody.GetAt(i); pDC->Rectangle(CRect(m_nLeft+uPoint.y*m_nSize,m_nTop+uPoint.x*m_nSize,m_nLeft+(uPoint.y+1)*m_nSize,m_nTop+(uPoint.x+1)*m_nSize)); }}(5)為游戲菜單下的開始項的消息映射函數(shù)添加如下代碼:voidCSnakeView::OnGameStart(){//啟動游戲,啟動計時器 //TODO:Addyourcommandhandlercodehere IniGame(); m_nGameStatus=1; SetTimer(1,100,NULL); Invalidate(); }(6)為鍵盤消息處理函數(shù)添加如下代碼://根據(jù)按下的方向鍵設(shè)置代表不一樣方向的值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);}(7)為定期器消息處理函數(shù)添加代碼: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//游戲結(jié)束 { KillTimer(1); AfxMessageBox("Fail!"); } CView::OnTimer(nIDEvent);}【6】程序?qū)崿F(xiàn)的功能及運行成果:程序能實現(xiàn)如下功能:(1)畫
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中原地產(chǎn)手房買賣合同
- 學校采購校服合同
- 工地門窗安裝合同
- 建設(shè)工程勞務(wù)分包合同
- 場地汽車租賃合同
- 污水處理廠施工合同
- 漳州理工職業(yè)學院《飛機液壓與燃油系統(tǒng)》2023-2024學年第二學期期末試卷
- 漳州理工職業(yè)學院《室內(nèi)模型設(shè)計》2023-2024學年第二學期期末試卷
- 江西水利職業(yè)學院《現(xiàn)代儀器分析綜合實驗》2023-2024學年第二學期期末試卷
- 北京郵電大學世紀學院《物流管理》2023-2024學年第二學期期末試卷
- 道路建筑材料電子教案(全)
- 《一頁紙項目管理》中文模板
- 《淡水養(yǎng)殖基礎(chǔ)知識》
- 英語演講-機器人發(fā)展
- 黃河流域生態(tài)保護和高質(zhì)量發(fā)展知識競賽試題及答案(共52題)
- 1、1~36號元素電子排布式、排布圖
- advantrol-pro v2.70學習版系統(tǒng)組態(tài)使用手冊
- 職業(yè)院校技能大賽沙盤模擬企業(yè)經(jīng)營賽項規(guī)程
- 職業(yè)衛(wèi)生調(diào)查表
- GB/T 11982.1-2005聚氯乙烯卷材地板第1部分:帶基材的聚氯乙烯卷材地板
- GB/T 10046-2018銀釬料
評論
0/150
提交評論