当前位置:文档之家› 贪吃蛇游戏设计报告

贪吃蛇游戏设计报告

青岛理工大学琴岛学院设计报告课题名称:贪吃蛇游戏设计学院:青岛理工大学琴岛学院专业班级:计算机网络技术091 学号:0017学生:王三鹏指导教师:张秀国、宋传磊青岛理工大学琴岛学院教务处2010 年12 月29 日目录需求分析、设计说明........................ 4•…1.设计思路...................... … ....2.程序框图……………………………………5 ………3.主要函数……………………………………7 ………三、代码实现..................... 6 .....1.构造函数............................................. (6)2.放置食物............................................. (6)3.碰撞检测............................................. (7)四、问题解决.................... 9 ......五、总结展望.................... 10 .....六、参考文献10一、需求分析1.选题接到课程设计任务后,我们对曾经非常感兴趣的几款经典小游戏作了分析并筛选,然后发现使用MFC 类库都可以完成这些游戏的编译,但是我们刚刚学习,还不能完全掌握MFC 类的使用和复杂的算法,但是我们相信通过一个简单的贪吃蛇游戏可以让我们对MFC得到充分的锻炼。

2.功能使用MFC编译的游戏,我们预计实现游戏的开始、暂停、继续、等级的提升、难度的增加。

3.重要的MFC1)CWnd:窗口,它是大多数看得见的东西”的父类(Windows里几乎所有看得见的东西都是一个窗口,大窗口里有许多小窗口),比如视图CView、框架窗口CFrameWnd、工具条CToolBar、对话框CDialog、按钮CButton,etc; —个例外是菜单(CMenu)不是从窗口派生的。

2)CDocument 文档,负责内存数据与磁盘的交互。

最重要的是On Ope nDocume nt(读入),0n SaveDocume nt (写盘)‘Serialize (读写)3)CView 视图,负责内存数据与用户的交互。

包括数据的显示、用户操作的响应(如菜单的选取、鼠标的响应)。

最重要的是OnDraw(重画窗口),通常用CWnd::Invalidate()来启动它。

另外,它通过消息映射表处理菜单、工具条、快捷键和其他用户消息。

4)CDialog 对话框5)CPen 笔,画线6)CBrush 刷子,填充7)CBitmap 位图8)CRgn区域,指定一块区域可以用于做特殊处理。

9)CString字符串。

封装了C中的字符数组,非常实用。

10)CPoint 点,就是(x,y)对11)CRect 矩形,就是( left,top,right,bottom ) 二、总体设计说明1.设计思路在数据结构上,用数组存储蛇以及蛇的运动区域。

在数组中,每个元素有四个云感动方向,分别为RIGHT丄EFT,UP,DOW在没有蛇身的区域,数组的元素值为0。

在蛇身的每个节点,用一个数组元素存储当前蛇节点的运动方向。

通过改变数组中元素的值来表示蛇身的移动。

在程序中运用定时器来保证蛇的持续移动。

每个一定的时间间隔,蛇移动一格。

在设计界面时。

在Visual Studio C++勺环境下,建立基于对话框的工程,在工程下设计游戏界面,实现贪食蛇运行算法。

在对话框中画出一个矩形,在大矩形中,用20x20的像素单位表示每一个蛇的节点。

当数组节点的值不为0的时候,在大矩形中画出相应的蛇的节点矩形。

并在蛇每移动一小格的时候,重绘整个窗口。

在对蛇身进行绘画时。

通过数组元素的值将蛇身在对话框的矩形中显示出来。

在蛇身运动时,首先在蛇头位置蛇身增长一个节点,然后判断蛇头是否到达食物所在位置,若在食物所在位置,则蛇尾不减一,蛇身继续移动,若蛇头不在食物位置,则蛇尾减一,蛇身继续移动。

若蛇头越界或者蛇头与蛇身重叠,则游戏结束。

2.程序框图操作控制:如图 1 所示游戏控^1]模块图游戏控制:如图2所示FM HTTI tn IF图23•主要函数和变量:如表1表2所示表主要函数和变量三、代码实现1.构造函数:通过定义构造函数CSnakeView::CSnakeView()调用IniGame()实现游戏界面的初始化,为开始游戏做好准备,所以在开始进行游戏之前,游戏界面就已经显示完整。

CSn akeView::CS nakeView(){In iGame();}CSnakeView::~CSnakeView(){2.消息处理食物位置:在函数中声明一个(x,y)数对uAimX,uAimY,然后执行条件循环while (1),使用随机数函数rand ()为uAimX,uAimY 赋值,并在一个循环体中判断该点位置上是否有元素,若没有,则放置实物在该坐标上。

void CSnakeView::IniAim(){int uAimX,uAimY;while(1){uAimX=rand()%m_nHeight;uAimY=rand()%m_nWidth;int uTag=0;for(int i=0;i<=();i++){CPoint uPoint=(i);if==uAimX || ==uAimY){uTag=1;break;}if(uTag==0)break;}m_pAim=CPoint(uAimX,uAimY);}3.碰撞检测:这里碰撞检测是贯穿游戏始末的主要步骤,蛇神移动的每一步都要执行一次碰撞检测。

第一步检测边界,如果由计时器控制的蛇身触界则游戏结束,否则进行第二步检测,检测该点是否有蛇身(蛇身分为两种,一种是地图上随机生成的实物,另一种是由时间轴控制的蛇)若该点有食物,则蛇身不减,计时器继续运行;若该点是蛇身则调用KillTimer(1) 游戏结束碰撞检测实际上是计时器函数的后半部分。

if(uTag==0){for(int i=0;i<();i++){CPoint uPoint1=(i);if== && =={uTag=1; break;}}}if(uTag==0){(0,uPoint);ReDisplay(uPoint);if== && =={m_nCount++;IniAim();Invalidate();}else{CPoint uPoint1=());());ReDisplay(uPoint1);}}else{KillTimer(1);MessageBox(strTemp," 游戏结束"); } CView::OnTimer(nIDEvent);运行界面:①初始界面:如图35图3 游戏初始界面②运行时界面:如图4占〉莓川”硝.4(.2腫昭Rftrtlr图4游戏运行时界面③结束界面:如图Vlfi n««> ■图5游戏结束时界面四、问题解决:1•找不到合适的方法实现食物随机放置:游戏进行时,如果采用原来的方式在游戏进行到 200秒以上时会出现没有食物的现象。

我们通过 while ( 1 )循环控制的随机 x ,y 坐标在地图上 绘制一段蛇身来解决了这一问题。

2•在控制游戏选择性条件里食物与蛇身的关系:一开始,我们的设想是碰撞一次食物,让蛇身加一节,后来实现时遇到了困难,就是不变化。

然后我们决定让蛇每前进一步就加一节,然后每 步都进行碰撞检测,如果碰撞到食物就不减一节,反之则减。

这样,就把 每一步都控制在了一个贯穿游戏始末的条件循环体中。

3. 碰撞检测不能随计时器一起良好运行:检测游戏时经常出现撞墙不死的情况,疑似碰撞检测没有正常运行。

经改进,我们把碰撞检测加到计时器里面同时运行,这保证了每一步的正 确性,又使游戏流畅。

五、总结展望:参考资料和程序成品,我了解了游戏的最基本形式。

ontimer ()函数是控制游戏运行的根本函数,借助这一函数,能实现贪吃蛇、俄罗斯方块、赛车等多个游戏的开发。

随机数生成函数rand ()的应用在贪吃蛇游戏中是一个关键步骤,通过不断的循环和调用,能保证游戏的持续进行和更新,其实不止是贪吃蛇,在大多数需要随机生成元素的游戏中,都可以用rand()函数生成随机数,再控制坐标等变量实现“随机生成”功能。

碰撞检测是一个逻辑性比较强的地方,这一段代码的实现,我们想了很多,也找了很多资料,不管是检测碰撞类型先后顺序,还是碰撞检测的位置都经过了多次试验,虽然成品游戏中的代码能够实现,但是我们还是改了又改,让它以我们最理想的形式实现。

通过这一次课程设计,我最大的收获就是分析问题解决问题能力的提高,发现问题,而后解决问题是生活的永续循环,这种能力会伴随我们一生;其次,程序的开发给了我很多经验,相信时间充裕的话,我能独立开发一个小游戏;最后,老师提出的对设计报告的种种要求也为我以后的各种报告的规范性做好了心理准备。

六、参考文献:[1]孙鑫•《VC++深入详解》.北京.电子工业出版社•[2]谭浩强.《 C + +程序设计》.北京.清华大学出版社.[3]刘春辉.《Visual C+程序设计学习笔记》.北京.电子工业出版社.[4]Charles Petzold.《Windows 程序设计》.北京.北京大学出版社.⑸曾凡锋.《MFC编译技巧与范例详解》•北京.清华大学出版社.。

相关主题