vc++貪吃蛇實(shí)習(xí)報(bào)告_第1頁(yè)
vc++貪吃蛇實(shí)習(xí)報(bào)告_第2頁(yè)
vc++貪吃蛇實(shí)習(xí)報(bào)告_第3頁(yè)
vc++貪吃蛇實(shí)習(xí)報(bào)告_第4頁(yè)
vc++貪吃蛇實(shí)習(xí)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

貪吃蛇程序程序設(shè)計(jì)匯報(bào)【1】游戲簡(jiǎn)介產(chǎn)生一種固定大小有邊界的游戲區(qū)域,蛇從區(qū)域的中心開(kāi)始,由玩家通過(guò)鍵盤(pán)控制蛇的運(yùn)動(dòng)方向,用蛇頭去吃隨機(jī)分布在游戲區(qū)域內(nèi)的食物;蛇的運(yùn)動(dòng)限制在游戲區(qū)域內(nèi),游戲區(qū)域有邊界,因此蛇在區(qū)域內(nèi)作循環(huán)運(yùn)動(dòng);蛇的運(yùn)動(dòng)方向?yàn)橹本€運(yùn)動(dòng),只走橫和豎的方向,不走斜線;蛇身體的長(zhǎng)度從4開(kāi)始每吃掉一份食物就增長(zhǎng)一種長(zhǎng)度;食物的出現(xiàn)安照隨機(jī)分布的原則,蛇吃掉一份后隨即在游戲區(qū)域內(nèi)放一份新的食物;每吃掉一份食物得分為1,游戲結(jié)束后記錄所有的得分;游戲結(jié)束的條件為:在控制蛇的過(guò)程中蛇頭碰到蛇的身體的任何部位或者碰到四壁?!?】基本概念,要點(diǎn)分析蛇的活動(dòng)區(qū)域是由若干個(gè)小方格構(gòu)成的。當(dāng)這些小方格展現(xiàn)灰色時(shí),便顯示蛇身。設(shè)整個(gè)區(qū)域由由m×n個(gè)方格構(gòu)成,最左角上的方格坐標(biāo)為(0,0),蛇由若干個(gè)相鄰的方格構(gòu)成的,將這些方格的坐標(biāo)依蛇頭至蛇尾的次序存入到一種數(shù)組中便代表了蛇身。當(dāng)蛇在游戲區(qū)域中游動(dòng)一格時(shí),所對(duì)應(yīng)的數(shù)組操作應(yīng)當(dāng)是將新的位置坐標(biāo)插入到數(shù)組頭部,同步將數(shù)組中最終一種元素刪除,這項(xiàng)工作可以用一種一般的數(shù)組來(lái)完畢,但當(dāng)進(jìn)行插入操作時(shí)需要自己移動(dòng)數(shù)組中的元素;也可以使用CArray來(lái)完畢這些工作,CArray的組員函數(shù)提供了需要的操作,這樣做更簡(jiǎn)樸某些。游戲使用四個(gè)方向鍵來(lái)控制它的前進(jìn)方向,在OnKeyDown消息處理函數(shù)中,根據(jù)不一樣的方向鍵設(shè)置組員變量m_nDirect的值。當(dāng)在菜單中選擇開(kāi)始時(shí),啟動(dòng)了定期器,游戲開(kāi)始,在定期器消息處理函數(shù)中,根據(jù)m_nDirect的值判斷出蛇的下個(gè)位置,假如沒(méi)有超過(guò)邊界或碰到自身,則它可以移到新的位置。假如吃到了食物,則在CArray中只插入而不刪除最終一種元素,蛇身長(zhǎng)度增長(zhǎng)。此外值得注意的是,當(dāng)蛇移動(dòng)一格時(shí),只有蛇頭和蛇身的位置需要重繪,為此專(zhuān)門(mén)編寫(xiě)了組員函數(shù)ReDisplay來(lái)刷新一種小格?!?】程序概要設(shè)計(jì)程序流程圖如下:游戲載入內(nèi)存并初始化界面游戲載入內(nèi)存并初始化界面判斷游戲與否開(kāi)始單擊按鈕開(kāi)始游戲沒(méi)有開(kāi)始游戲,就返回初始界面貪吃蛇開(kāi)始移動(dòng)(初始方向向左)根據(jù)鍵盤(pán)消息判斷蛇頭的運(yùn)動(dòng)方向根據(jù)蛇頭的坐標(biāo)和食物的坐標(biāo)判斷蛇與否已經(jīng)得到食物假如已經(jīng)得到食物,則蛇的身體加長(zhǎng),積分器加一假如沒(méi)有得到食物,則蛇的身體不變,積分器不變根據(jù)蛇頭的坐標(biāo)、蛇身體的坐標(biāo)和墻壁的坐標(biāo)判斷蛇與否已經(jīng)撞墻或者自己咬到自己假如沒(méi)有撞墻并且沒(méi)有自己咬到自己則程序繼續(xù)進(jìn)行假如已經(jīng)撞墻或者自己咬到自己則程序終止貪吃蛇程序結(jié)束積分器開(kāi)始計(jì)分【4】詳細(xì)設(shè)計(jì)過(guò)程:(1)新建工程Snake,在MFC的向?qū)У谝徊竭x擇SingleDocument,按Finishi結(jié)束。(2)選擇ResourceView窗口,打開(kāi)菜單編輯器,在頂層菜單上添加一種名為“游戲”的彈出式菜單,該菜單下再添加一種名為“開(kāi)始”的子菜單,其ID為ID_GAME_START,如下圖所示。(3)在ClassWizard中為剛剛編輯好的菜單添加消息處理函數(shù),打開(kāi)ClassWizard,選中MessageMaps頁(yè)。在ClassName中選擇CSnakeView,在ObjectID中選擇ID_Game_START,在Messages中選擇COMMAND,添加消息處理函數(shù)。(4)在ClassWizard中添加鍵盤(pán)消息處理函數(shù)。打開(kāi)ClassWizard,選中MessageMaps頁(yè)。在ClassName中選擇CSnakeView,在ObjectID中選擇CSnakeView,在Messages中選擇WM_KeyDown,添加消息處理函數(shù)。(5)在ClassWizard中添加定期器消息處理函數(shù)。打開(kāi)ClassWizard,選中MessageMaps頁(yè)。在ClassName中選擇CSnakeView,在ObjectID中選擇CSnakeView,在Messages中選擇WM_Timer,添加消息處理函數(shù)。(6)編輯生成代碼,完畢程序?!?】運(yùn)用MFC類(lèi)向?qū)砑哟a環(huán)節(jié)如下:(1)選擇ClassView窗口,雙擊CSnakeView類(lèi),添加如下組員變量。并添加頭文獻(xiàn):#include<Afxtempl.h>classCSnakeView:publicCView{private: voidReDispilay(CPointpPoint);voidIniAim(); voidIniGame(); intm_nLeft,m_nTop,m_nWidth,m_nHeight,m_nSize;//起始坐標(biāo),寬高(格數(shù)0),每格大小 intm_nDirect;//目前方向 CPointm_pAim;//目前坐標(biāo) CArray<CPoint,CPoint>m_aBody;//蛇身 intm_nGameStatus;//游戲狀態(tài):0-未開(kāi)始,1-開(kāi)始 intm_nCount;//吃掉目的數(shù) intm_nTime,m_nTime1;//用掉的時(shí)間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文獻(xiàn)中添加3個(gè)組員函數(shù)IniAim(),IniGame()和ReDisplay()://該函數(shù)隨機(jī)產(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ù)對(duì)游戲初始化,定義游戲的初始狀態(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)); //計(jì)時(shí)器清零 m_nTime=0; m_nTime1=0; //初始化隨機(jī)數(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 //畫(huà)游戲區(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)); //顯示目前用時(shí) CStringuStr; uStr.Format("目前用時(shí):%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)); //畫(huà)蛇 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)為游戲菜單下的開(kāi)始項(xiàng)的消息映射函數(shù)添加如下代碼:voidCSnakeView::OnGameStart(){//啟動(dòng)游戲,啟動(dòng)計(jì)時(shí)器 //TODO:Addyourcommandhandlercodehere IniGame(); m_nGameStatus=1; SetTimer(1,100,NULL); Invalidate(); }(6)為鍵盤(pán)消息處理函數(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++;//計(jì)時(shí) if(m_nTime1==10)//到達(dá)一秒 { 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)的功能及運(yùn)行成果:程序能實(shí)現(xiàn)如下功能:(1)畫(huà)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論