基于嵌入式的贪食蛇的设计和实现(3)

2020-06-03 15:23

2.2.3 贪吃蛇游戏的总体功能图

贪吃蛇贪吃蛇移动功游戏规则判断主界面地图控制按键功能帮助功能移动方向功控制

贪吃蛇自动移动初始化地图随机果实出现分数统计功能关卡选择功能 贪吃蛇功能图

2.2.4 贪吃蛇游戏的实现的功能模块

在贪吃蛇游戏中,本论文设计的贪吃蛇游戏的大致可以分为五个功能模块,以下是对这五个模块的具体介绍:

游戏规则模块功能设计:游戏规则包括蛇的运动范围、蛇的生命周期问题、分数统计、关卡判断。其中蛇的运动范围是一个24*24的数组呢,蛇运动的地图抽象成为一个24*24的二维整形数组,每个数组值代表一个小方块的坐标值,这样,蛇只能在规定好的二维数组内运动,当蛇遇到数组边界值(我们在这里抽象成为上、下、左、右四个边界,其中上边界坐标值中纵坐标都是0,横坐标任意,下边界为纵坐标是24,同理横坐标不变,左边界为横坐标为0,纵坐标任意,同理右边界为横坐标为24,纵坐标任意)时,宣告蛇生命周期结束,贪吃蛇死亡,这个是第一个规则;另外,当蛇自己吃到自己身体的某一部分时,也宣告游戏结束,在程序里通过循环判断蛇头下一个前进方向的节点是不是蛇身上的某一部分节点即可,如果是那么蛇死亡,否则继续运行游戏。分数统计算法的思想是每次蛇吃到一个果实时,相加的分数为蛇身长度乘以一个定值来记录分数,这样可以

8

随着游戏难度的增加,分数值也随之增多。关卡功能设置通过与分数相关联而体现的,初始化游戏为第一关,分数为0,当玩家玩到一定的分数时(例如是500)关卡加一,变为第二关,同时,蛇前进速度相应增加一个等级,这样就实现了不同关卡,不同速度的贪吃蛇,从而增加了游戏的难度。

蛇身操作模块功能的设计: 首先得到当前按下的移动方向,此时有两种情况需要考虑,如果遇到的是一个果实,则蛇身长度增加一个单位,表现在程序中是存放蛇身数组值增加一位,如果没遇到果实,则不断更新蛇身数组中的相应坐标值。

按键功能模块:游戏是通过键盘按键控制,其中空格键控制游戏开始和暂停,上、下、左、右键控制蛇头前进方向,回车键控制游戏重新开始,程序内部是通过消息响应函数实现。

主界面地图模块:贪吃蛇游戏的主界面是通过窗体初始化事件进行实现的,运用MFC类库中的FillSoldRect ()库函数通过程序内部的二维数组进行绘制地图,地图然后可以改变,这样在游戏运行后就会在窗体上显示游戏初始化的效果。

帮组模块:通过窗体的调用另外一个帮组窗体显示游戏的规则,游戏的计分公式,游戏的玩法等等。

2.2.5 贪吃蛇游戏的主要功能设计思路

Windows MFC在程序执行时,会动态的调用窗口资源,在程序自动生成函数中,添加相应的函数实现程序初始化界面,本程序的具体思路是:程序在开始执行时会调用BOOL CSnakeDlg::OnInitDialog()函数,进行窗体的初始化,我们在此窗体客户区求得窗体长和宽的最小值,记录在WIDTHOFBRICKS和HEIGHTOFBRICKS 变量中,因为我们设计的游戏地图是一个24*24的小方格组成的矩形区域,在这,根据WIDTHOFBRICKS和HEIGHTOFBRICKS 等分为24部分,求出每个小矩形的边长存放在HEIGHTOFBRICKS和WIDTHOFBRICKS变量中,然后调用绘图函数void CSnakeDlg::MyDraw()进行地图的绘制,这样在程序执行时,就动态绘制了贪吃蛇游戏地图。

首先,食物时通过一个坐标记录下在地图上的位置,通过绘图函数绘制这点坐标的小矩形,程序中采用的是随机数生成食物出现的坐标。其次,程序中必须

9

增加一个判断,判断当前生成的食物坐标是否在贪吃蛇身体范围内,如果当前生成的坐标在蛇身坐标范围内,那么必须重新随机产生食物坐标直到不在为止。如果坐标不在蛇身坐标范围内,则把坐标位置返回给调用对象。程序中本模块具体功能是在void InitFoods()函数中实现。具体代码参见程序主要代码说明。

程序执行的步骤:首先接受玩家按下方向键消息,并把当前要前进的方向保存在方向变量snake_direct中,记录贪吃蛇下一个状态前进的方向,通过方向判断头节点下一个节点的坐标值。先判断下一个节点坐标值是不是符合游戏规则之内(也就是判断蛇是不是死亡)的坐标,此时调用IS_GameOver()函数判断游戏是否结束,如果结束宣告游戏结束,否则程序继续执行;如果下一个节点的坐标值与当前食物节点坐标值(snake_foods)相同,则调用void MyDraw()函数重绘蛇头和蛇尾节点颜色,因为此时蛇吃到一个果实,蛇身长度加一,动态的现实,将果实重绘为蛇身颜色(红色),蛇尾节点颜色不变,蛇身变量长度snake_body_length自加,动态记录当前蛇头节点snake_head和蛇尾节点snake_rear的坐标;如果下一个节点不是食物节点,重绘蛇头蛇尾颜色,蛇身长度不变,动态的蛇头和蛇尾节点坐标改变。

分数统计和改变关卡的设计思路:在本程序设计的贪吃蛇游戏中,分数统计采用的是如下公式进行的统计,贪吃蛇游戏分数 = 贪吃蛇蛇身长度 * 定制变量(本程序设置的是整形常量5),这样可以动态的根据蛇身长度不同,每次得到果实的分数也就随之不同,体现了游戏难度的差异;另外游戏关卡的设计与分数统计有着密切的关系,关卡是通过玩家玩得的分数而自动晋级的,换句话说,例如:游戏的初始化分数为0,游戏关卡为第一关,当玩家玩到1000分数时根据程序内部定义,关卡增加一级,同时,游戏难度也要随之增加,体现在程序中就是,定时器变量刷新间隔要变小,也就是类中定义的TimerInterval变量要随之相应的变小。这样,在玩家看来,蛇的刷新速度就会变得越来越快。

按键响应功能的设置思路:贪吃蛇游戏的控制通过键盘按键来控制,所以必须实现键盘响应功能,程序规定,上、下、左、右按键控制贪吃蛇的前进方向,空格键控制游戏开始和暂停,当按下回车键时,游戏重新进行初始化,重新开始游戏,此时需要重复上一个过程。这些按键消息响应是通过函数BOOL CSnakeDlg::PreTranslateMessage(MSG* pMsg)来实现,内部通过case语句进行

10

相应按键的响应,从而实现按键响应功能 2.2.6 贪吃蛇游戏界面的实现

贪吃蛇游戏界面是通过MFC初始化窗口实现,地图是通过初始化窗体时,计算窗体客户区高度和宽度,然后取其中最小值,等分为24部分,记录下每部分的长度,这就是地图中每个小矩形的长度。具体界面详见下图:

如上图:游戏界面左边为地图部分,是一个24*24的二维数组抽象出来的,右面有七个按钮部分,分别对应着上诉部分按键功能。 2.2.7 贪吃蛇游戏主要代码说明

下面函数是游戏开始函数,主要功能是初始化游戏的状态,开启计时器函数,实现游戏的开始。 void CSnakeDlg::Start() {

Level=1; Score=0;

TimerInterval=200;

11

}

GameState=RUNNING; dead_flag=1;//初始化蛇没有死

SetDlgItemText(IDC_SCORE_NUM,L\SetTimer(1,TimerInterval,NULL);//开始设置计时器

下面的函数功能是初始化游戏界面,通过窗体初始化事件来进行计算游戏地图的宽和高,这样进一步计算出来游戏地图上每个小格子的宽度和高度,然后调用初始化函数进行游戏界面初始化。 BOOL CSnakeDlg::OnInitDialog() {

CDialog::OnInitDialog(); SetIcon(m_hIcon, TRUE);

SetIcon(m_hIcon, FALSE);

CenterWindow(GetDesktopWindow()); CRect rt;

GetClientRect(&rt);

WIDTHOFBRICKS=((rt.right -rt.left)-LEFTMARGIN)/24;// HEIGHTOFBRICKS=((rt.bottom-rt.top))/24;

WIDTHOFBRICKS=HEIGHTOFBRICKS=min(WIDTHOFBRICKS,HEIGHTOFBRICKS);

}

Level=0;

GameState=STOP; InitSnake(); return TRUE;

下面是通过二维数组值来确定地图上的各种颜色,是背景色,是蛇身色,还是食物颜色等。

void CSnakeDlg::RefreshAll() {

CDC* dc=GetDC(); for(int y=0;y<24;y++)

12


基于嵌入式的贪食蛇的设计和实现(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:六爻之墓库

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: