vc++贪吃蛇实习报告_第1页
vc++贪吃蛇实习报告_第2页
vc++贪吃蛇实习报告_第3页
vc++贪吃蛇实习报告_第4页
vc++贪吃蛇实习报告_第5页
已阅读5页,还剩7页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

贪吃蛇程序程序设计报告【1】游戏介绍产生一种固定大小有边界的游戏区域,蛇从区域的中心开始,由玩家通过键盘控制蛇的运动方向,用蛇头去吃随机分布在游戏区域内的食物;蛇的运动限制在游戏区域内,游戏区域有边界,因此蛇在区域内作循环运动;蛇的运动方向为直线运动,只走横和竖的方向,不走斜线;蛇身体的长度从4开始每吃掉一份食物就增加一种长度;食物的出现安照随机分布的原则,蛇吃掉一份后随即在游戏区域内放一份新的食物;每吃掉一份食物得分为1,游戏结束后统计全部的得分;游戏结束的条件为:在控制蛇的过程中蛇头碰到蛇的身体的任何部位或者碰到四壁。【2】基本概念,要点分析蛇的活动区域是由若干个小方格构成的。当这些小方格呈现灰色时,便显示蛇身。设整个区域由由m×n个方格构成,最左角上的方格坐标为(0,0),蛇由若干个相邻的方格构成的,将这些方格的坐标依蛇头至蛇尾的次序存入到一种数组中便代表了蛇身。当蛇在游戏区域中游动一格时,所对应的数组操作应当是将新的位置坐标插入到数组头部,同时将数组中最后一种元素删除,这项工作能够用一种普通的数组来完毕,但当进行插入操作时需要自己移动数组中的元素;也能够使用CArray来完毕这些工作,CArray的组员函数提供了需要的操作,这样做更简朴某些。游戏使用四个方向键来控制它的迈进方向,在OnKeyDown消息解决函数中,根据不同的方向键设立组员变量m_nDirect的值。当在菜单中选择开始时,启动了定时器,游戏开始,在定时器消息解决函数中,根据m_nDirect的值判断出蛇的下个位置,如果没有超出边界或碰到本身,则它能够移到新的位置。如果吃到了食物,则在CArray中只插入而不删除最后一种元素,蛇身长度增加。另外值得注意的是,当蛇移动一格时,只有蛇头和蛇身的位置需要重绘,为此专门编写了组员函数ReDisplay来刷新一种小格。【3】程序概要设计程序流程图以下:游戏载入内存并初始化界面游戏载入内存并初始化界面判断游戏与否开始单击按钮开始游戏没有开始游戏,就返回初始界面贪吃蛇开始移动(初始方向向左)根据键盘消息判断蛇头的运动方向根据蛇头的坐标和食物的坐标判断蛇与否已经得到食物如果已经得到食物,则蛇的身体加长,积分器加一如果没有得到食物,则蛇的身体不变,积分器不变根据蛇头的坐标、蛇身体的坐标和墙壁的坐标判断蛇与否已经撞墙或者自己咬到自己如果没有撞墙并且没有自己咬到自己则程序继续进行如果已经撞墙或者自己咬到自己则程序终止贪吃蛇程序结束积分器开始计分【4】具体设计过程:(1)新建工程Snake,在MFC的向导第一步选择SingleDocument,按Finishi结束。(2)选择ResourceView窗口,打开菜单编辑器,在顶层菜单上添加一种名为“游戏”的弹出式菜单,该菜单下再添加一种名为“开始”的子菜单,其ID为ID_GAME_START,以下图所示。(3)在ClassWizard中为刚刚编辑好的菜单添加消息解决函数,打开ClassWizard,选中MessageMaps页。在ClassName中选择CSnakeView,在ObjectID中选择ID_Game_START,在Messages中选择COMMAND,添加消息解决函数。(4)在ClassWizard中添加键盘消息解决函数。打开ClassWizard,选中MessageMaps页。在ClassName中选择CSnakeView,在ObjectID中选择CSnakeView,在Messages中选择WM_KeyDown,添加消息解决函数。(5)在ClassWizard中添加定时器消息解决函数。打开ClassWizard,选中MessageMaps页。在ClassName中选择CSnakeView,在ObjectID中选择CSnakeView,在Messages中选择WM_Timer,添加消息解决函数。(6)编辑生成代码,完毕程序。【5】运用MFC类向导添加代码环节以下:(1)选择ClassView窗口,双击CSnakeView类,添加以下组员变量。并添加头文献:#include<Afxtempl.h>classCSnakeView:publicCView{private: voidReDispilay(CPointpPoint);voidIniAim(); voidIniGame(); intm_nLeft,m_nTop,m_nWidth,m_nHeight,m_nSize;//起始坐标,宽高(格数0),每格大小 intm_nDirect;//现在方向 CPointm_pAim;//现在坐标 CArray<CPoint,CPoint>m_aBody;//蛇身 intm_nGameStatus;//游戏状态:0-未开始,1-开始 intm_nCount;//吃掉目的数 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个组员函数IniAim(),IniGame()和ReDisplay()://该函数随机产生一种供蛇吃的目的,如果该目的恰巧与蛇身重叠,则重新产生一种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);//产生的目的寄存在组员变量中}//该函数对游戏初始化,定义游戏的初始状态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; //初始化随机数发生器 srand((unsigned)time(NULL)); //产生一种目的 IniAim();}//刷新游戏区域中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的构造函数,完毕游戏的初始化:CSnakeView::CSnakeView(){ //TODO:addconstructioncodehere IniGame();}(4)在OnDraw中加入代码,显示游戏界面:voidCSnakeView::OnDraw(CDC*pDC){ CSnakeDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); //TODO:adddrawcodefornativedatahere //画游戏区域 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)为游戏菜单下的开始项的消息映射函数添加以下代码:voidCSnakeView::OnGameStart(){//启动游戏,启动计时器 //TODO:Addyourcommandhandlercodehere IniGame(); m_nGameStatus=1; SetTimer(1,100,NULL); Invalidate(); }(6)为键盘消息解决函数添加以下代码://根据按下的方向键设立代表不同方向的值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)为定时器消息解决函数添加代码: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);}【6】程序实现的功效及运行成果:程序能实现下列功效:(1)画出了程序初

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论