贪吃蛇游戏设计报告(C++)_第1页
贪吃蛇游戏设计报告(C++)_第2页
贪吃蛇游戏设计报告(C++)_第3页
贪吃蛇游戏设计报告(C++)_第4页
贪吃蛇游戏设计报告(C++)_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

PAGEPAGE10青岛理工大学琴岛学院设计报告课题名称:贪吃蛇游戏设计学院:青岛理工大学琴岛学院专业班级:计算机网络技术091学号:200903120017学生:王三鹏指导教师:张秀国、宋传磊青岛理工大学琴岛学院教务处2010学生王三鹏指导教师张秀国、宋传磊课题名称贪吃蛇游戏设计设计时间2010.12.20-2010.12.31设计地点图书馆501设计目的熟练使用vc++,提高自身对MFC类的理解及更好的应用MFC类制作软件。指导教师评语系部教研室意见

目录需求分析………4设计说明………4设计思路……………4程序框图……………5主要函数……………7代码实现………6构造函数……………6放置食物……………6碰撞检测……………7问题解决………9总结展望………10参考文献………10

一、需求分析1.选题接到课程设计任务后,我们对曾经非常感兴趣的几款经典小游戏作了分析并筛选,然后发现使用MFC类库都可以完成这些游戏的编译,但是我们刚刚学习,还不能完全掌握MFC类的使用和复杂的算法,但是我们相信通过一个简单的贪吃蛇游戏可以让我们对MFC得到充分的锻炼。2.功能使用MFC编译的游戏,我们预计实现游戏的开始、暂停、继续、等级的提升、难度的增加。3.重要的MFCCWnd:窗口,它是大多数“看得见的东西”的父类(Windows里几乎所有看得见的东西都是一个窗口,大窗口里有许多小窗口),比如视图CView、框架窗口CFrameWnd、工具条CToolBar、对话框CDialog、按钮CButton,etc;一个例外是菜单(CMenu)不是从窗口派生的。CDocument文档,负责内存数据与磁盘的交互。最重要的是OnOpenDocument(读入),OnSaveDocument(写盘),Serialize(读写)CView视图,负责内存数据与用户的交互。包括数据的显示、用户操作的响应(如菜单的选取、鼠标的响应)。最重要的是OnDraw(重画窗口),通常用CWnd::Invalidate()来启动它。另外,它通过消息映射表处理菜单、工具条、快捷键和其他用户消息。CDialog对话框CPen笔,画线CBrush刷子,填充CBitmap位图CRgn区域,指定一块区域可以用于做特殊处理。CString字符串。封装了C中的字符数组,非常实用。CPoint点,就是(x,y)对CRect矩形,就是(left,top,right,bottom)二、总体设计说明1.设计思路 在数据结构上,用数组存储蛇以及蛇的运动区域。在数组中,每个元素有四个云感动方向,分别为RIGHT,LEFT,UP,DOWN.在没有蛇身的区域,数组的元素值为0。在蛇身的每个节点,用一个数组元素存储当前蛇节点的运动方向。通过改变数组中元素的值来表示蛇身的移动。在程序中运用定时器来保证蛇的持续移动。每个一定的时间间隔,蛇移动一格。在设计界面时。在VisualStudioC++6.0的环境下,建立基于对话框的工程,在工程下设计游戏界面,实现贪食蛇运行算法。在对话框中画出一个矩形,在大矩形中,用20x20的像素单位表示每一个蛇的节点。当数组节点的值不为0的时候,在大矩形中画出相应的蛇的节点矩形。并在蛇每移动一小格的时候,重绘整个窗口。在对蛇身进行绘画时。通过数组元素的值将蛇身在对话框的矩形中显示出来。在蛇身运动时,首先在蛇头位置蛇身增长一个节点,然后判断蛇头是否到达食物所在位置,若在食物所在位置,则蛇尾不减一,蛇身继续移动,若蛇头不在食物位置,则蛇尾减一,蛇身继续移动。若蛇头越界或者蛇头与蛇身重叠,则游戏结束。2.程序框图操作控制:如图1所示图1游戏控制:如图2所示图2

3.主要函数和变量:如表1表2所示表1主要函数和变量函数名所属类功能ReDisplay()CSnakeView刷新界面函数voidIniAim()CSnakeView消息处理函数m_nDirectCSnakeView运动方向m_pAimCSnakeView目前指向m_nGameStatusCSnakeView游戏是否进行m_nCountCSnakeView计分m_nTime,m_nTime1CSnakeView计时表2按钮控件资源清单ID按钮功能ID_APP_ABOUTVK_F1游戏介绍ID_GAME_STARTVK_F2游戏开始ID_APP_EXITVK_F4游戏结束、退出三、代码实现1.构造函数:通过定义构造函数CSnakeView::CSnakeView()调用IniGame()实现游戏界面的初始化,为开始游戏做好准备,所以在开始进行游戏之前,游戏界面就已经显示完整。CSnakeView::CSnakeView(){ …… IniGame();……}CSnakeView::~CSnakeView(){}2.消息处理食物位置:在函数中声明一个(x,y)数对uAimX,uAimY,然后执行条件循环while(1),使用随机数函数rand()为uAimX,uAimY赋值,并在一个循环体中判断该点位置上是否有元素,若没有,则放置实物在该坐标上。voidCSnakeView::IniAim(){ intuAimX,uAimY; while(1) { uAimX=rand()%m_nHeight; uAimY=rand()%m_nWidth; intuTag=0; for(inti=0;i<=m_aBody.GetUpperBound();i++) { CPointuPoint=m_aBody.GetAt(i); if(uPoint.x==uAimX||uPoint.y==uAimY) { uTag=1; break; } } if(uTag==0) break; } m_pAim=CPoint(uAimX,uAimY);}3.碰撞检测:这里碰撞检测是贯穿游戏始末的主要步骤,蛇神移动的每一步都要执行一次碰撞检测。第一步检测边界,如果由计时器控制的蛇身触界则游戏结束,否则进行第二步检测,检测该点是否有蛇身(蛇身分为两种,一种是地图上随机生成的实物,另一种是由时间轴控制的蛇)若该点有食物,则蛇身不减,计时器继续运行;若该点是蛇身则调用KillTimer(1)游戏结束。碰撞检测实际上是计时器函数的后半部分。……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); MessageBox(strTemp,"游戏结束"); } CView::OnTimer(nIDEvent);运行界面:①初始界面:如图3图3游戏初始界面②运行时界面:如图4图4游戏运行时界面③结束界面:如图5图5游戏结束时界面四、问题解决:1.找不到合适的方法实现食物随机放置:游戏进行时,如果采用原来的方式在游戏进行到200秒以上时会出现没有食物的现象。我们通过while(1)循环控制的随机x,y坐标在地图上绘制一段蛇身来解决了这一问题。2.在控制游戏选择性条件里食物与蛇身的关系:一开始,我们的设想是碰撞一次食物,让蛇身加一节,后来实现时遇到了困难,就是不变化。然后我们决定让蛇每前进一步就加一节,然后每步都进行碰撞检测,如果碰撞到食物就不减一节,反之则减。这样,就把每一步都控制在了一个贯穿游戏始末的条件循环体中。3.碰撞检测不能随计时器一起良好运行:检测游戏时经常出现撞墙不死的情况,疑似碰撞检测没有正常运行。经改进,我们把碰撞检测加到计时器里面同时运行,这保证了每一步的正确性,又使游戏流畅。五、总结展望:参考资料和程序成品,我了解了游戏的最基本形式。ontimer()函数是控制游戏运行的根本函数,借助这一函数,能实现贪吃蛇、俄罗斯方块、赛车等多个游戏的开发。随机数生成函数rand()的应用在贪吃蛇游戏中是一个关键步骤,通过不断的循环和调用,能保证游戏的持续进行和更新,其实不止是贪吃蛇,在大多数需要随机生成元素的游戏中,都可以用rand()函数生成随机数,再控制坐标等变量实现“随机生成”功能。碰撞检测是一个逻辑性比较强的地方,这一段代码的实现,我们想了很多,也找了很多资料,不管是检测碰撞类型先后顺序,还是碰撞检测的位置都经过了多次试验,虽然成品游戏中的代码能够实现,但是我们还是改了又改,让它以我们最理想的形式实现。通过这一次课程设计,我最大的收获就是分析问题解决问题能力的提高,发现问题,而后解决问题是生活的永续循环,这种能力会伴随我们一生;其次,程序的开发给了我很多经验,相信时间充裕的话,我能独立开发一个小游戏;最后,老师提出的对设计报告的种种要求也为我以后的各种报告的规范性做好了

温馨提示

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

评论

0/150

提交评论