当前位置:文档之家› MFC贪吃蛇实验报告

MFC贪吃蛇实验报告

贪吃蛇实验报告201221143049 信计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功能介绍⑴运行程序,出现围墙界面,一条蛇在密闭的围墙内,在围墙内随机出现一个食物,出现bmp格式图片的背景。

⑵点击“游戏->游戏开始”,游戏开始。

还可暂停游戏继续⑶游戏开始后,界面右下角会同步游戏得分。

⑷通过四个方向键控制蛇的运动方向,吃掉随机出现的豆子,若不小心碰到墙壁或者与自身相交,则该轮游戏结束。

⑸游戏会根据蛇身的长度自动调节难易程度。

3.详细设计3.1主要函数●void CSnakeView::OnDraw(CDC* pDC)//显示背景图片●void CSnakeView::OnKeyDown(UINT nChar, UINT nRepCnt, UINTnFlags)//按照用户的按键来控制蛇的移动●void CSnakeView::OnTimer(UINT nIDEvent)//根据蛇的长度来进行SetTimer()函数的定义,可以根据长度来进行游戏难度的设定。

//撞界判断//蛇身相撞判断//抹掉蛇行走的痕迹//判断吃豆的条件,撞到就吃//如果食物被吃了就生成●void CSnakeView::oninit()//进行贪吃蛇外观的初始化●void CSnakeView:: OnGameStart ()//开始游戏●void CSnakeView:: IniAim ()//初始化目标的位置●void CSnakeView::IniGame()//初始化游戏●void CSnakeView::ReDisplay(CPoint pPoint)●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<0)uTag=1;break;case 3:uPoint.x++;if(uPoint.x>=m_nHeight)uTag=1;break;case 4:uPoint.x--;if(uPoint.x<0)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();}else{CPoint 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.总结这次课程设计,我选择用MFC编写一个贪食蛇的程序。

在编写程序之前,我只有很少的关于MFC的程序设计知识,因此,在刚开始,我遇到了很多困难。

为此,我在网上看了许多关于贪食蛇的算法,测试别人的代码= =,并学以致用。

才开始写我的贪食蛇,整合学习的东西并且加了很多附加功能。

这次课程设计锻炼了我的动手能力。

通过完成贪食蛇游戏的程序设计,累积了我的实际编程经验,也提高了我独立解决问题的能力。

由于所学有限,经验不足,代码经常出现错误,最终终于能够正确的运行。

但在过程中遇到了不少问题。

比如在贪吃蛇行进中急转死亡的bug。

食物生成不出来的问题食物长在蛇的身上- -。

,界面优化插入图片当做背景的问题,最终通过查阅资料、请教他人修改了参数才得以解决。

另外,很多在学习中没有涉及的函数,只能只能上网百度,借鉴别人的代码,进行测试=。

慢慢了解mfc各方面的知识。

我想这次程序所设计不单单是对学习的一种巩固我们可以在今后的工作学习中运用这次坚持不懈的精神,不断加强自己各方面的能力。

我们很感激老师提供我们这样一个机会,让我们接触学习到专业知识以外的东西,这对我们来说,不仅仅是怎样处理问题,更多的是了解编程的不易,培养我们坚定的毅力,让我们有信心和勇气去面对将来更大的挑战。

6.参考文献百度,谷歌= =。

相关主题