MFC贪吃蛇实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
贪吃蛇实验报告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, UINT
nFlags)//按照用户的按键来控制蛇的移动
●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 default
switch(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 default
m_nTime1++;
if(m_nTime1==10)