




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
贪吃蛇实验报告9 信计1212 许圣1. 概述 此次课程设计我利用MFC制作了一个贪吃蛇游戏,用户可以通过上下左右控制蛇的移动方向,游戏会根据贪吃蛇身体的长度自动增加难度。在游戏过程中,会记录运行时间和所得分数,我还添加了bmp格式的图片作为游戏背景。2. 功能描述2.1设计思路本软件主要由三个模块构成,它们分别是蛇运行模块,初始化处理模块和显示模块。它们的作用分别是,初始化处理:初始化蛇头位置与第一个点位置;蛇运行模块:控制蛇的上下左右运行,并对蛇的运行状态进行判断,根据(吃点、未吃点、死亡等)状态进行不同的子程序模块处理以及游戏者是否能晋级的判断;显示模块:根据对蛇和点子的当前状态进行动画显示。主要有以下步骤:1. 定义蛇类和食物类,初始化贪吃蛇各项成员变量,包括图像的出现在屏幕的初始位置,长度,以及蛇的行走方向。食物类的定义包括出现的初始位置,以及食物是否被吃掉的判断。2. 用数组初始化长度为4的贪吃蛇,并且默认出现一个食物。3. 在CView类上运用MFC提供的Windows消息中WM_TIMER消息,运用OnTimer()函数让系统提供一个时钟节拍,更新游戏4. 具体游戏实现,包括蛇撞到自己和围墙都将使游戏结束,判断吃豆等,其中还包括根据蛇的长度来进行游戏难度的改变。5. 具体键盘游戏操作运用到Windows消息响应中的WM_KEYDOWN,用OnKeyDown()来响应玩家的实际操作。6. 添加了bmp格式的图片作为游戏背景。整体流程图如下图1。设置自动移动定时器和增加食物定时器游戏开始桌面初始化初始化蛇头和蛇移动方向随机初始化一个食物到桌面蛇移动蛇吃食?蛇增长继续?蛇死亡?桌面上随机生成食物退出程序是是否否图1:系统流程图2.2功能介绍1 运行程序,出现围墙界面,一条蛇在密闭的围墙内,在围墙内随机出现一个食物,出现bmp格式图片的背景。2 点击“游戏-游戏开始”,游戏开始。还可暂停游戏 继续3 游戏开始后,界面右下角会同步游戏得分。4 通过四个方向键控制蛇的运动方向,吃掉随机出现的豆子,若不小心碰到墙壁或者与自身相交,则该轮游戏结束。5 游戏会根据蛇身的长度自动调节难易程度。3. 详细设计3.1主要函数l void CSnakeView:OnDraw(CDC* pDC)/显示背景图片l void CSnakeView:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)/按照用户的按键来控制蛇的移动l void CSnakeView:OnTimer(UINT nIDEvent)/根据蛇的长度来进行SetTimer()函数的定义,可以根据长度来进行游戏难度的设定。/撞界判断/蛇身相撞判断/抹掉蛇行走的痕迹/判断吃豆的条件,撞到就吃/如果食物被吃了 就生成l void CSnakeView:oninit()/进行贪吃蛇外观的初始化l void CSnakeView: OnGameStart ()/开始游戏l void CSnakeView: IniAim ()/初始化目标的位置l void CSnakeView:IniGame()/初始化游戏l void CSnakeView:ReDisplay(CPoint pPoint)l bool CSnakeView:ReadBmp(char *bmpName) 3.2主要功能介绍:3.2.1 背景图片加载:定义变量和函数用于读取 bmp图片做准备:BITMAPINFOHEADER head;unsigned char *pBmpBuf;bool ReadBmp(char *bmpName);定义ReadBmp函数用于读取bmp格式的图片,在初始化的时候调用该函数ReadBmp(BootPic.bmp),来读取背景图片。在OnDraw函数中实现对图片的刷新:CRect rec;GetClientRect(&rec);SetStretchBltMode(pDC-m_hDC, HALFTONE);SetBrushOrgEx(pDC-m_hDC, 0, 0, NULL);StretchDIBits (pDC-m_hDC, rec.left, rec.top, rec.Width(), rec.Height(), 0, 0, head.biWidth, head.biHeight, pBmpBuf, (BITMAPINFO*)&head, DIB_RGB_COLORS, SRCCOPY);3.2.2 初始化游戏:主要初始化蛇的初始化位置,实物的初始化位置:void CSnakeView: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;IniAim();3.2.3控制游戏操作:键盘消息是用户通过键盘发出的消息,是用来控制蛇的爬行方向。这个消息将会用到OnKeyDown()函数。OnKeyDown()函数根据用户按下的按键执行相应的语句块,即通过if判断语句来实现。下面以RIGHT键为例进行说明。当按下RIGHT键后,函数执行第一个if分支,在该分支中,首先判断蛇是否是向左走的,如果蛇是向左走的,则按右键无效,因为蛇不能“穿过”自己的身体。在满足蛇不是向左走的条件后,进入该分支,启动与该方向相应的时钟函数SetTimer,SetTimer()通过不同的ID号来执行OnTimer的不同分支,同时杀死其他时钟函数,并对蛇的运行方向做重新标记。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;case 40:m_nDirect=3;break;case 37:m_nDirect=2;break;case 39:m_nDirect=1;break;CView:OnKeyDown(nChar, nRepCnt, nFlags);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;Invalidate();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+)CPoint uPoint1=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();elseCPoint uPoint1=m_aBody.GetAt(m_aBody.GetUpperBound();m_aBody.RemoveAt(m_aBody.GetUpperBound();ReDisplay(uPoint1);else KillTimer(1);AfxMessageBox(Fail!);CView:OnTimer(nIDEvent);4. 实验结果贪吃蛇进入界面如下图所示贪吃蛇的玩法如图数字键盘下的方向键分别为上下左右,进行控制,使蛇头触碰到食物。游戏结束界面如上图所示,游戏结束后,会显示游戏的最终得分。5. 总结这次课程设计,我选择用编写一个贪食蛇的程序。在编写程序之前,我只有很少的关于的程序设计知识,因此,在刚开始,我遇到了很多困难。为此,我在网上看了许多关于贪食蛇的算法,测试别人的代码= =,并学以致用。才开始写我的贪食蛇,整合学习的东西并且加了很多附加功能。这次课程设计锻炼了我的动手能力。通过完成贪食蛇游戏的程序设计,累积了我的实际编程经验,也提高了我独立解决问题的能力。由于所学有限,经验不足,代码经常出现错误,最终终于能够正确的运行。但在过程中遇到了不少问题。比如在贪吃蛇行进中急转死亡的bug。食物生成不出来的问题食物长在蛇的身上- -。,界面优化插入图片当做背景的问题,最终通过查阅资料、请教他人修改了参数才得以解决。另外,很多在学习中没有涉及的函
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 装修公司物业费营销方案
- 施工现场环境管理实施方案及措施
- 2025年康复工程学院康复辅助器具的选用与配置及答案解析
- 2024-2025学年邮政行业职业技能鉴定试题【历年真题】附答案详解
- 2025隧道专项试题及答案
- 2024-2025学年度计算机二级题库及完整答案详解(全优)
- 2025公务员(省考)常考点试卷完整答案详解
- 2025美容化妆人员考前冲刺测试卷(夺冠)附答案详解
- 2024全国统考教师资格考试《教育教学知识与能力(小学)》高分题库含答案详解【突破训练】
- 药店相关技能鉴定自我提分评估附答案详解【B卷】
- 民营医院行政管理与法律法规遵循
- 医院培训课件:《环境卫生学监测的方法》
- 中队辅导员培训材料
- (高清版)DB12∕T 934-2020 公路工程资料管理技术规程
- 深度解析Palantir介绍
- 木方回收合同6篇
- 《探寻抗日战争历史》课件
- 2025年第三届药膳大赛(选拔赛)理论知识考试题(附答案)
- 玻璃幕墙维修保养施工方案
- 亲子关系断绝协议书范文模板
- 包装行业安全防范总结
评论
0/150
提交评论