收藏 分享(赏)

vc++贪吃蛇实习报告.doc

上传人:HR专家 文档编号:5168496 上传时间:2019-02-11 格式:DOC 页数:12 大小:160KB
下载 相关 举报
vc++贪吃蛇实习报告.doc_第1页
第1页 / 共12页
vc++贪吃蛇实习报告.doc_第2页
第2页 / 共12页
vc++贪吃蛇实习报告.doc_第3页
第3页 / 共12页
vc++贪吃蛇实习报告.doc_第4页
第4页 / 共12页
vc++贪吃蛇实习报告.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

1、 贪吃蛇程序程序设计报告【1】游戏介绍产生一个固定大小有边界的游戏区域,蛇从区域的中心开始,由玩家通过键盘控制蛇的运动方向,用蛇头去吃随机分布在游戏区域内的食物;蛇的运动限制在游戏区域内,游戏区域有边界,所以蛇在区域内作循环运动;蛇的运动方向为直线运动,只走横和竖的方向,不走斜线;蛇身体的长度从 4 开始每吃掉一份食物就增加一个长度;食物的出现安照随机分布的原则,蛇吃掉一份后随即在游戏区域内放一份新的食物;每吃掉一份食物得分为1,游戏结束后统计全部的得分;游戏结束的条件为:在控制蛇的过程中蛇头碰到蛇的身体的任何部位或者碰到四壁。【2】基本概念,要点分析蛇的活动区域是由若干个小方格组成的。当这些

2、小方格呈现灰色时,便显示蛇身。设整个区域由由 mn 个方格组成,最左角上的方格坐标为(0,0),蛇由若干个相邻的方格组成的,将这些方格的坐标依蛇头至蛇尾的次序存入到一个数组中便代表了蛇身。当蛇在游戏区域中游动一格时,所对应的数组操作应该是将新的位置坐标插入到数组头部,同时将数组中最后一个元素删除,这项工作可以用一个一般的数组来完成,但当进行插入操作时需要自己移动数组中的元素;也可以使用 CArray 来完成这些工作,CArray 的成员函数提供了需要的操作,这样做更简单一些。游戏使用四个方向键来控制它的前进方向,在 OnKeyDown 消息处理函数中,根据不同的方向键设置成员变量 m_nDir

3、ect 的值。当在菜单中选择开始时,启动了定时器,游戏开始,在定时器消息处理函数中,根据 m_nDirect 的值判断出蛇的下个位置,如果没有超出边界或碰到自身,则它可以移到新的位置。如果吃到了食物,则在 CArray 中只插入而不删除最后一个元素,蛇身长度增加。另外值得注意的是,当蛇移动一格时,只有蛇头和蛇身的位置需要重绘,为此专门编写了成员函数 ReDisplay 来刷新一个小格。【3】程序概要设计程序流程图如下:游戏载入内存并初始化界面判断游戏是否开始单击按钮开始游戏没有开始游戏,就返回初始界面贪吃蛇开始移动(初始方向向左)根据键盘消息判断蛇头的运动方向根据蛇头的坐标和食物的坐标判断蛇是

4、否已经得到食物如果已经得到食物,则蛇的身体加长,积分器加一如果没有得到食物,则蛇的身体不变,积分器不变根据蛇头的坐标、蛇身体的坐标和墙壁的坐标判断蛇是否已经撞墙或者自己咬到自己如果没有撞墙并且没有自己咬到自己则程序继续进行如果已经撞墙或者自己咬到自己则程序终止贪吃蛇程序结束积分器开始计分【4】详细设计过程:(1)新建工程 Snake,在 MFC 的向导第一步选择 Single Document,按 Finishi 结束。(2)选择 Resource View 窗口,打开菜单编辑器,在顶层菜单上添加一个名为“游戏”的弹出式菜单,该菜单下再添加一个名为“开始”的子菜单,其 ID 为ID_GAME_

5、START,如下图所示。(3)在 ClassWizard 中为刚才编辑好的菜单添加消息处理函数,打开 ClassWizard,选中 Message Maps 页。在 Class Name 中选择 CSnakeView,在 Object ID 中选择ID_Game_START,在 Messages 中选择 COMMAND,添加消息处理函数。(4)在 ClassWizard 中添加键盘消息处理函数。打开 ClassWizard,选中 Message Maps 页。在 Class Name 中选择 CSnakeView,在 Object ID 中选择 CSnake View,在Messages 中选

6、择 WM_KeyDown,添加消息处理函数。 (5)在 ClassWizard 中添加定时器消息处理函数。打开 ClassWizard,选中 Message Maps 页。在 Class Name 中选择 CSnakeView,在 Object ID 中选择 CSnake View,在Messages 中选择 WM_Timer , 添加消息处理函数。(6)编辑生成代码,完成程序。【5】 利用 MFC 类向导添加代码步骤如下:(1)选择 Class View 窗口,双击 CSnake View 类,添加如下成员变量。并添加头文件:#include class CSnakeView : publi

7、c CViewprivate:void ReDispilay(CPoint pPoint);void IniAim();void IniGame();int m_nLeft,m_nTop,m_nWidth,m_nHeight,m_nSize; /起始坐标,宽高(格数0),每格大小int m_nDirect; /当前方向CPoint m_pAim; /当前坐标CArray m_aBody; /蛇身int m_nGameStatus; /游戏状态:0-未开始,1- 开始int m_nCount; /吃掉目标数int m_nTime,m_nTime1; /用掉的时间protected: / crea

8、te from serialization onlyCSnakeView();DECLARE_DYNCREATE(CSnakeView)/ Attributespublic:CSnakeDoc* GetDocument();/ Operationspublic:/ Overrides/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CSnakeView)public:virtual void OnDraw(CDC* pDC); / overridden to draw this viewvirtual BOOL Pre

9、CreateWindow(CREATESTRUCTprotected:virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);/AFX_VIRTUAL/ Implementationpublic:virtual CSnakeView();#ifdef _DEBUGvirtual void AssertValid() const

10、;virtual void Dump(CDumpContext#endifprotected:/ Generated message map functionsprotected:/AFX_MSG(CSnakeView)afx_msg void OnGameStart();afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);afx_msg void OnTimer(UINT nIDEvent);afx_msg void OnPaint();/AFX_MSGDECLARE_MESSAGE_MAP();(2)在 CSnakeV

11、iew.Cpp 文件中添加 3 个成员函数 IniAim(), IniGame() 和 ReDisplay():/该函数随机产生一个供蛇吃的目标,如果该目标恰巧与蛇身重合,则重新产生一个void CSnakeView:IniAim()int uX,uY; /目标位置while(1)uX=rand()%m_nHeight;uY=rand()%m_nWidth;int uTag=0;for(int i=0;iSelectStockObject(WHITE_BRUSH);pDC-Rectangle(CRect(m_nLeft-1,m_nTop-1,m_nLeft+m_nWidth*m_nSize+1

12、,m_nTop+m_nHeight*m_nSize+1);/显示当前用时CString uStr;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_nS

13、ize,m_nTop+m_pAim.x*m_nSize,m_nLeft+(m_pAim.y+1)*m_nSize,m_nTop+(m_pAim.x+1)*m_nSize);/画蛇for(int i=0;iRectangle(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)为游戏菜单下的开始项的消息映射函数添加如下代码:void CSnakeView:OnGameStart() /启动游戏,启动计时器/ TODO:

14、 Add your command handler code hereIniGame();m_nGameStatus=1;SetTimer(1,100,NULL);Invalidate();(6)为键盘消息处理函数添加如下代码:/根据按下的方向键设置代表不同方向的值void CSnakeView:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) / TODO: Add your message handler code here and/or call defaultswitch(nChar)case 38:m_nDirect=4;break;c

15、ase 40:m_nDirect=3;break;case 37:m_nDirect=2;break;case 39:m_nDirect=1;break;CView:OnKeyDown(nChar, nRepCnt, nFlags);(7)为定时器消息处理函数添加代码:void CSnakeView:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call defaultm_nTime1+; /计时if(m_nTime1=10) /达到一秒m_nTime+;m_nTime1=0;Invalidat

16、e();CPoint uPoint=m_aBody.GetAt(0); /蛇头的位置int uTag=0; /是否失败switch(m_nDirect)case 1: /向右uPoint.y+;if(uPoint.y=m_nWidth)uTag=1;break;case 2: /向左uPoint.y-;if(uPoint.y=m_nHeight)uTag=1;break;case 4: /向上uPoint.x-;if(uPoint.x0)uTag=1;break;if(uTag=0) /判断蛇是否碰到了自身for(int i=0;i=m_aBody.GetUpperBound();i+)CPo

17、int uPoint1=m_aBody.GetAt(i);if(uPoint1.x=uPoint.x break;if(uTag=0)m_aBody.InsertAt(0,uPoint); /新的蛇头的位置ReDisplay(uPoint);if(uPoint.x=m_pAim.x IniAim();Invalidate();elseCPoint uPoint1=m_aBody.GetAt(m_aBody.GetUpperBound();m_aBody.RemoveAt(m_aBody.GetUpperBound();ReDisplay(uPoint1);Else /游戏结束KillTimer

18、(1);AfxMessageBox(“Fail!“);CView:OnTimer(nIDEvent);【6】程序实现的功能及运行结果:程序能实现以下功能:(1)画出了程序初始样式(方框,蛇身,目标及文字);(2)允许玩家用菜单项开始“开始”开始游戏;(3)蛇能自动前进,蛇身显示正确;(4)能用方向键可以改变蛇头方向,并且在蛇身的改变方向处正确弯曲;(5)蛇头碰到目标时可以正确计分并显示;(6)蛇头碰到目标时可以正确增加蛇身长度;(7)能正确判断游戏结束(包括蛇头碰到四壁或自身);(8)能正确显示计时。程序运行过程截图如下所示:【7】参考文献:Visual C+面向对象程序设计编者:戴光明 李向

19、 出版社:高等教育出版社(北京) 中山大学出版社(广州) 【8】实习心得在开始着手编程之前,我以为编个小游戏很简单,但是当我深入思考后发现,并不是自己想象的那么简单,虽然不是什么难度很大的算法,但是程序要考虑的问题很多,相当复杂,需要考虑的很全面,不然就打不到预期的效果。深入思考碰壁后,我在 c+课本上找到了灵感,把课本上的小程序仔细研究调试之后,终于弄清楚了其中的奥妙。通过此次贪吃蛇游戏的设计,确实学到了很多实战的经验。以前只是纸上谈兵,真正下起手来才发现自己其实对 C+语言还没有掌握到编程的程度。开始编译之后,自己通过与同学交流,查阅资料,独立的编写出了游戏代码,并进一步优化,加强可操作性,从中得到了很多课上没有的知识,体会到了编程的快乐,也许,编程就是,由简单到复杂,由复杂到简单。刚开始时,一直失败,好多错误,其实就是些基本的错误,比如变量的定义,整型变量的范围,结构体的运用,指针的定义,函数的调用等等,通过这些问题才发现自己学习的知识是那么不牢固。再有就是些技术上的难题,比如画图函数,初次接触,需要去查阅运用。这次实习不仅仅锻炼了我的 vc 编程能力,同时让我对可视化编程有了更深入了解,对使用 vc 来开发游戏程序有了初步体会!在此对辅导老师表示真挚感谢!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 工作总结

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报