MFC贪吃蛇实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)

相关文档
最新文档