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

嵌入式大作业

贪食蛇的设计和实现

作 者 姓 名:

学科、专业 :

学 号 :

指 导 教 师:

完 成 日 期:

大连大学

Dalian University

摘 要

WinCE 是微软公司嵌入式、移动计算平台的基础 它是一个开放的、 可升级的 32 位嵌入式操作系统 是基于掌上型 电脑类的电子设备操作系统 。

本文基于此,尝试设计了基于嵌入式winCE 开发的一款贪吃蛇游戏,主要目的是通过开发嵌入式贪吃蛇游戏,掌握嵌入式开发的整个过程,同时介绍基于winCE 嵌入式开发的详细设计步骤,向初学者介绍开发基于winCE 方面嵌入式程序的整个框架流程。本论文软件方面采用的是EVC++4.0开发平台设计程序,PB5.0进行系统定制,硬件方面采用的是PXA270-S 实验开发箱。整个设计流程将在本论文主体部分进行详细的叙述。从定制自己所需的winCE 系统、运用MFC 基于对话框的C++语言编写贪吃蛇游戏源代码到最终下载程序到实验开发板的整个过程都做了很详细的介绍。

关键词:winCE5.0、EVC++4.0、PB5.0 、嵌入式系统、贪吃蛇游戏

目 录

摘 要........................................................................................................................ 2

引 言........................................................................................................................ 1

1系统概要设计............................................................................................................. 1

1.1系统的整体结构 . ............................................................................................................... 1

1.1.1 系统的定制 . .......................................................................................................... 1

1.1.2 程序的编写 . .......................................................................................................... 2

1.2系统的硬件构建 . ............................................................................................................... 3

1.3系统的软件组成 . ............................................................................................................... 4

2. 系统的详细设计......................................................................................................... 4

2.1 定制winCE 内核 . .............................................................................................................. 4

2.1.1 winCE内核定制原理以说明 . ............................................................................... 4

2.1.2 winCE内核定制 . ................................................................................................... 5

2.2 贪吃蛇游戏详细设计开发 . .............................................................................................. 5

2.2.1 贪吃蛇游戏的可行性分析 . .................................................................................. 5

2.2.2 贪吃蛇游戏的需求分析 . ...................................................................................... 6

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

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

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

2.2.6 贪吃蛇游戏界面的实现 . .................................................................................... 10

2.2.7 贪吃蛇游戏主要代码说明 . ................................................................................ 10

3. 系统整合及测试....................................................................................................... 12

3.1 系统整合 . ........................................................................................................................ 12

3.2 系统整体测试 . ................................................................................................................ 13

3.2.1 系统规则测试 . .................................................................................................... 13

3.2.2 按键功能测试 . .................................................................................................... 14

3.2.3 分数和关卡测试 . ................................................................................................ 16

结论.............................................................................................................................. 17

引 言

随着计算机技术的快速发展,嵌入式技术也相应的取得了突破性的进展,嵌入式设备正日益渗透到人们的日常生活中,默默地为我们提供连接和服务,嵌入式设备往往是一个资源有限的系统,它们追求的是在有限的价格上满足一定的功能性要求。通常它们采用那些功能并不强大的CPU ,这也是开发者不得不尽可能地压缩嵌入式系统性能的原因。最初的嵌入式设备是单一用途的,它们拥有各自独特的显示方式和用户界面,而今天它们变成了类似PC 系统。它们可以运行很多相同的应用程序。针对嵌入式资源的限制,如何将对资源有很大依赖性的大规模的计算,成功的移植到嵌入式系统中,并能使其达到类似与在PC 上计算的效果。针对此问题,必须对原适用于PC 上的游戏引擎做出修改,才能使其在嵌入式系统中成功的运行。因此需要在特定的环境下开发相应的游戏,这样才能在以后下载到相应的板子上进行效果演示。

目前嵌入式行业在中国得到了有效发展,但是规模相应的还与国际上有很大的差距,因此,为了能够让大家对基于嵌入式wince 开发游戏得到有效的理解,本论文以贪吃蛇游戏为详细的例子,完整的阐述了嵌入式游戏的开发流程,以及演示结果,还有中间特别要注重的难点疑点的解析。本文对具体的开发流程都做了很详细的阐述,从编码到仿真,然后在定制系统内核,最后进行应用程序的下载,完成贪吃蛇游戏的具体效果演示,论文的后续都做了相当详细的解释。

1系统概要设计

1.1系统的整体结构

1.1.1 系统的定制

首先所需winCE 系统内核的定制,通过PlatformBuilders5.0来定制自己所需

要的系统内核,根据自己程序设计时所用到的win32程序的接口,以及用到的库函数,类库,各种所需要的驱动,例如USB 驱动,屏幕显示驱动,鼠标驱动,键盘驱动等,来定制自己所需要的系统内核,系统不必过于繁琐,达到自己所需要的功能即可,因为我们所强调的是嵌入式,嵌入式是以方便为前提的,定制的系统是以简洁方便为目的的,具体的定制细节我们在第四章将会详细介绍。

1.1.2 程序的编写

程序的名称是《贪吃蛇游戏》,采用的是VC++语言,MFC 微软基础类库环境的单文档窗体。

程序的大体思想是:采用一个二维数组(这里我们采用的是24*24的整形数组)作为贪吃蛇游戏的背景地图,数组的每个值代表地图上每个小矩形,而每个小矩形连续组成贪吃蛇的蛇身,在程序初始化窗体时候调用这个函数,刷新出程序的背景地图;程序贪吃蛇的蛇身用一个Cpoint 类的一位连续数组,Cpoint 类是一个结构体类型,结构体类型里包含着两个整形参数x 和y 代表的是屏幕窗体上的某一个对应的点的坐标,我们在得知点的坐标的同时,就明确了对应二维数组地图上的某个矩形区域的坐标值,这样用Cpoint 类的一位数组我们可以存放蛇身的每个节点的坐标,于此同时,我们在程序snake 类里面设定蛇头和蛇尾的坐标变量、蛇身长度的坐标变量,这样在程序调用Timer()系统函数定时刷新时,每次刷新只需要改变蛇头和蛇尾的坐标即可,每次刷新时,根据舍身前进方向判断下一个头节点的坐标值,然后添加到Cpoint 类定义的蛇身节点,而蛇尾节点坐标值是前一个状态的倒数第二个节点,然后调用库函数FillSolildRect()函数刷新头节点为蛇的自身颜色,而尾节点是地图背景颜色,这样我们在外观看起来就是蛇身前进的效果。

那么,我们怎么判断蛇头前进的方向呢?这个问题的解决方式是,在定义snake 类的同时,定义了一个私有变量Direction 为蛇动态前进的方向,而每次Timer()刷新时,动态的根据键盘响应函数来判断前进方向,并同时给Direction 赋值,这样每次刷新的同时Direction 为四个方向(上、下、左、右)其中的一个方向,蛇头前进的方向在此时已经确定,这样就动态的根据输入的键盘值来改变蛇的前进方向,我们就可以控制蛇的移动啦!

最后,在蛇动态效果显示出来的同时,我们也应该考虑到蛇的生命周期问题,就是蛇在什么情况下会死亡,在什么情况下会得分,在什么情况下会自身长度增加等一系列相关问题。这里我们首先考虑到一个十分重要的问题,就是蛇遇到食物(这里我们用一个蓝色的小矩形表示蛇的食物苹果) 同时,将食物吃掉并且动态自身增加一节,这里我们是这样实现的:首先实现的是食物的随机出现,在某个食物被吃掉的同时,我们要立即产生出下一个食物的坐标,我们用到的是一个随机函数产生出下一个食物的坐标,但是这个坐标必须仅仅在0—23之间,因为我们地图采用的是一个24维的二维数组表示的,地图每个横坐标纵坐标的范围是0—23,但是,这里注意一个特别重要的问题,就是每次随机产生的食物坐标不能出现在当前蛇身上,我们必须加一个判断,如果产生的坐标在蛇身上,必须重新生成,一直到产生一个在地图上并且不在蛇身上的食物坐标为止;当蛇头坐标的下一个前进方向的坐标和食物坐标相等时,我们在这里是将食物坐标改变成当前蛇头坐标,并且蛇尾坐标不变,蛇身长度增加一个单位,这样就动态的现实出来蛇吃食物自身增加一个的效果。

生命周期的问题:在我们解决上述功能的同时,我们不得不考虑一个问题,那就是蛇的生命周期问题,就是蛇在身条件下会死亡,死亡的结果会是怎么样,我们在这里做了一个判断,就是蛇遇到地图周围的墙和遇到自己的身体蛇会死亡,生命周期结束,于此同时记录下当前玩家所得的分数,比较分数来判断玩家的能力程度,那么我们怎么判断蛇头撞墙和蛇头撞到自身呢?继承上一个问题的解决方式,蛇身用到的是Cpoint 类的一个一维数组表示,地图用到的是一个二维数组表示,当蛇头节点的左边和二维数组边界值相等时,或者蛇头坐标变为蛇自身的坐标时,蛇死亡,生命周期结束,关闭定时器函数Timer(),初始化游戏界面,记录当前分数,重新等待游戏开始。到此为止,贪吃蛇游戏的大概思路就解决了。

1.2系统的硬件构建

硬件环境分析:系统硬件平台采用的是PXA270-S 实验开发板,开发板提供了多种CPU 内核共大家使用,具体的内核信息详细如下:

X86:支持的处理器包括486、586、Geode 、Pentium I/II/III/IV。

ARM :支持的处理器包括ARM720T 、ARM920T 、ARM1020T 、StrongARM 、Xscale 。 SHx :支持的处理器包括SH-3、SH-3 DSP、SH-4。

MIPS :支持的处理器包括MIPS II/32(带浮点运算)、MIPS II/3(不带浮点运算)、MIPS16、MIPS IV/64(带浮点运算)、MIPS IV/6(不带浮点运算)。

软件环境分析:PC 机操作系统Win2000或以上,EVC4.0开发环境,WinCE500标准SDK ,PXA270-S 平台SDK 。

1.3系统的软件组成

PC 机操作系统Win2000或以上,EVC4.0开发环境,WinCE500标准SDK ,PXA270-S 平台SDK 。

2. 系统的详细设计

2.1 定制winCE 内核

2.1.1 winCE内核定制原理以说明

定制winCE 内核之前,我们首先要做的准备工作详见下:首先是安装PB 工具,我们这里之前已经提及,所以就不再过多叙述。在实际操作中,我们主要有如下的注意事项:

(1)推荐安装在分区根目录下。并且分区需要保持足够大的硬盘空间,一般需要5G 以上,PB 和运行在PC 的WinCE 环境需要安装在一个分区内。安装时间通常较长,网络安装的版本同时依赖网络的速度。 以下是微软推荐的最小配置,低于该配置PB 工具将不能正常安装或使用;处理器:至少266MHz Pentium II以上;推荐使用500MHz Pentium III以上CPU ;操作系统:Windows 2000 SP2以上;Windows XP;内存要求:至少128M ;使用模拟器时候至少192M (不包括操作系统本身占用的内存)硬盘:典型安装时,选择一种处理器需至少1.7G 空间;若要包含Platform Builder的完整工具组在内需要至少12G 的硬盘空间。光驱:可以使用与桌面系统相兼容的CD-ROM 或DVD-ROM 等。

(2)在安装过程中,会提示选择处理器体系结构,务必选中ARMV4I 和

XSCALE 两项,否则无法支持PXA270处理器。

(3)如果PC 上使用的操作系统为Windows XP SP2,可能出现严重安装问题,最好不要采用Windows XP SP2,或者在微软网站上搜索相关的指导文档。安装过程中请关闭系统防火墙。然后需要建立系统最基本的配置。打开PB 5.0,首先导入我们提供的BSP 包。导入BSP 的过程很简单,只需要安装光盘中提供的

up270classic_BSP文件就可以实现,可以由指导教师提前完成。安装完,会发现在系统的\WINCE500\Platform\路径下出现“Up_PXA270cl”文件夹,这个就是安装好的BSP 了。之后建立UP-TECH S2410/P270 DVP的WinCE 工程,都需要建立在这个BSP 的基础上。(类似地,你也可以自己构建系统自带的Mainstone II的工程,但是它不能运行在UP-TECH S2410/P270 DVP实验箱上)。

2.1.2 winCE内核定制

我们在编译winCE 内核镜像前,需要添加特性目录(Catalog)的一些组件来定制内核,我们在本系统需要添加以下的组件:

(1)添加鼠标键盘控制驱动; (2)添加USB 主控制器驱动;

(3)添加USB 从控制器驱动(建立与PC 机的Activesyn 。连接需要此特性) ;

(4)添加串口驱动; (5)添加触摸屏驱动;

(6)添加IE6.0浏览器驱动;(7)添加拨号网络组件驱动;

(8)添加Fat 文件系统;. (9)加入对HIVE 注册表的支持;

(10)加入对Mediaplayer 播放器;

(11)加入对本地存储器中的mp3和wMA 文件播放的支持。

除了上述所需的添加组件外,我们还需要一些另外的组件。

2.2 贪吃蛇游戏详细设计开发

2.2.1 贪吃蛇游戏的可行性分析

通过查找相关文档和技术支持,了解了EVC 环境下的开发过程,熟悉了VC++语言的开发技巧,通过以下几个方面,进行可行性分析:

1. 参考《贪吃蛇游戏用户描述文档》、《软件工程》等书,确定自己能够

在自己能力范围内开发出这个贪吃蛇游戏项目。

2. 功能要求:在进行整个项目开发之前,必须要做的就是确定贪吃蛇游戏

的主要功能,必须明确贪吃蛇游戏的功能,因为要进行游戏功能可行性

分析,经过自己的查阅相关资料,确定了贪吃蛇游戏的具体功能,详见

后续部分详细设计。

3. 性能需求:必须保证自己开发的贪吃蛇游戏能够整体尽可能做到高效快

速,不占用大量的使用资源,因为我做的是一个嵌入式的游戏开发项目,

必须要考虑资源使用情况,要求尽可能少用资源,在有限的资源范围内

实现最大的可利用价值。

4. 运行环境:PXA270-S 开发板,EVC ++4.0开发平台,模拟器上进行调试,

经过安装软件,确定可以进行项目程序的编写。

5. 界面要求:采用Windows 标准界面,只需要使用键盘和鼠标。

6. 完成期限,一个学期完成整个系统,包括程序的编写,硬件板子的下载,

以及最终的调试,测试阶段。

2.2.2 贪吃蛇游戏的需求分析

文档包括了嵌入式技术领域的介绍,嵌入式国内外环境的探索与简介,主要从我国嵌入式领域发展的最新阶段来探讨,与国际对比得出相应发展的前景,同时,针对自身对嵌入式方面的兴趣爱好,以及自己所掌握的有限知识来对嵌入式方面的一些看法等,另外还有winCE 环境的简介,以及用法,还有关于嵌入式基于winCE 的开发流程的一些相关文档,还有EVC++4.0开发工具的使用方法的介绍,以及游戏的详细代码的功能简介等。

游戏功能:能够实现贪吃蛇自动前线移动,也就是贪吃蛇能够“活动”的外观效果,根据相同的时间间隔,每一次将贪吃蛇自身的蛇头向前移动一个小格子,同时蛇尾向前移动一个小格子,移动方向为贪吃蛇行走的方向。对游戏中规则进行判断,当游戏中的贪吃蛇遇到墙壁和自身时,根据规则判断应为死亡,宣告当前游戏结束,记录当前游戏的分数值。根据每次所得的分数值不同,判断玩家的能力,来显示玩家的效果。贪吃蛇的相关操作,根据键盘上的上、下、左、右四个键来控制贪吃蛇游戏的前进方向,同时,根据空格键来开始游戏,空格键在游戏开始时,还有另外一个功能,那就是暂停游戏功能,这样玩家就可以根据暂停

游戏来处理当前需要处理的事情,当游戏结束时,按回车键就可以重新开始游戏的初始化界面。果实的出现,每次贪吃蛇吃到果实时,于此同时,应该出现一个果实在地图中,那么怎么实现这个功能呢?我采用的是随机函数出现果实的横纵坐标,然后判断这个店得坐标是不是在蛇身上,如果是那么就得重现出现上一个过程,直到食物的坐标不在蛇身上为止。这样就出现了果实。游戏分数的统计方法,当贪吃蛇吃到果实时,玩家的分数就应该随着吃到的果实而增加,增加的规则就是贪吃蛇的身体长度乘以等级 得到分数。这样就可以根据游戏的难度对应得到分数。

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

贪吃蛇功能图

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

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

游戏规则模块功能设计:游戏规则包括蛇的运动范围、蛇的生命周期问题、分数统计、关卡判断。其中蛇的运动范围是一个33*57的List Box,蛇运动的地图抽象成为一个33*57的List Box ,当蛇遇到List Box 边界值(我们在这里抽象成为

上、下、左、右四个边界,其中上边界坐标值中纵坐标都是20,横坐标任意,下边界为纵坐标是53,同理横坐标不变,左边界为横坐标为20,纵坐标任意,同理右边界为横坐标为77,纵坐标任意) 时,宣告蛇生命周期结束,贪吃蛇死亡,这个是第一个规则;另外,当蛇自己吃到自己身体的某一部分时,也宣告游戏结束,在程序里通过循环判断蛇头下一个前进方向的节点是不是蛇身上的某一部分节点即可,如果是那么蛇死亡,否则继续运行游戏。分数统计算法的思想是每次蛇吃到一个果实时,相加的分数为蛇身长度乘以一个定值来记录分数,这样可以随着游戏难度的增加,分数值也随之增多。关卡功能设置通过与分数相关联而体现的,初始化游戏为第一关,分数为0,当玩家玩到一定的分数时(例如是500) 关卡加一,变为第二关,同时,蛇前进速度相应增加一个等级,这样就实现了不同关卡,不同速度的贪吃蛇,从而增加了游戏的难度。

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

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

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

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

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

Windows MFC 在程序执行时,会动态的调用窗口资源,在程序自动生成函数中,添加相应的函数实现程序初始化界面,本程序的具体思路是:程序在开始执行时会调用BOOL CSnakeDlg::OnInitDialog()函数,进行窗体的初始化,我们在此窗体客户区求得窗体长和宽的最小值,记录在WIDTHOFBRICKS 和

HEIGHTOFBRICKS 变量中,因为我们设计的游戏地图是一个33*57的矩形区域,在这,根据WIDTHOFBRICKS 和HEIGHTOFBRICKS 等分,求出每个小矩形的边长存放在HEIGHTOFBRICKS 和WIDTHOFBRICKS 变量中,然后调用绘图函数void CSnakeDlg::MyDraw()进行地图的绘制,这样在程序执行时,就动态绘制了贪吃蛇游戏地图。

首先,食物时通过一个坐标记录下在地图上的位置,通过绘图函数绘制这点坐标的小矩形,程序中采用的是随机数生成食物出现的坐标。其次,程序中必须增加一个判断,判断当前生成的食物坐标是否在贪吃蛇身体范围内,如果当前生成的坐标在蛇身坐标范围内,那么必须重新随机产生食物坐标直到不在为止。如果坐标不在蛇身坐标范围内,则把坐标位置返回给调用对象。程序中本模块具体功能是在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 语句进行相应按键的响应,从而实现按键响应功能

2.2.6 贪吃蛇游戏界面的实现

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

如上图:游戏界面左边为地图部分,是一个33*的二维数组抽象出来的,右面有七个按钮部分,分别对应着上诉部分按键功能。

2.2.7 贪吃蛇游戏主要代码说明

下面函数是游戏开始函数,主要功能是初始化游戏的状态,开启计时器函数,实现游戏的开始。

void CSnakeDlg::Start()

{

}

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

BOOL CSnakeDlg::OnInitDialog()

{

CDialog::OnInitDialog(); SetIcon(m_hIcon, TRUE); Level=1; Score=0; TimerInterval=200; GameState=RUNNING; dead_flag=1;//初始化蛇没有死 SetDlgItemText(IDC_SCORE_NUM,L"0"); SetTimer(1,TimerInterval,NULL);//开始设置计时器 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,HEIGHT

OFBRICKS);

} Level=0; GameState=STOP; InitSnake(); return TRUE;

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

void CSnakeDlg::RefreshAll()

{

CDC* dc=GetDC();

for(int y=0;y

{

for(int x=0;x

{

if(SnakeOfBrick[y][x]==0)

{

dc->FillSolidRect(LEFTMARGIN+x*WIDTHOFBRICKS,10+y*H

EIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,BAC

KCOLOR);

dc->Draw3dRect(LEFTMARGIN+x*WIDTHOFBRICKS,

10+y*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRIC KS,CLRTOPLEFT,BACKCOLOR);

}

if(SnakeOfBrick[y][x]==1)

{

dc->FillSolidRect(LEFTMARGIN+x*WIDTHOFBRICKS,10+y*HE

IGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,SNAK

ECOLOR);

dc->Draw3dRect(LEFTMARGIN+x*WIDTHOFBRICKS,10+y*HEI

GHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,CLRTO

PLEFT,SNAKECOLOR);

}

}

}

ReleaseDC(dc);

}

3. 系统整合及测试

3.1 系统整合

通过前几章的叙述,我们已经把系统的各个部分分别作了非常详细的论述,

我们已经将上述过程中定制好的winCE 系统下载到PXA270-S 实验箱上,于此同时我们已经在EVC++4.0开发平台上运用VC++语言开发好贪吃蛇游戏的详细代码,剩下的就是将上诉三个过程最终整合在一起,达到编制好的程序最终在开发板上运行的一种嵌入式程序设计的效果。我们将开发板接好电源,下载好winCE 系统,后,将数据线连接好,启动同步软件,进行连接,直到同步软件显示连接成功之后,浏览板子内容,选择PXA270-S 开发板SDK ,进行编译,将C:\Documents and Settings\lining\桌面\Snake_no_dead\ARMV4Irel目录下的可执行文件加入到实验箱目录下,然后连接键盘和鼠标到开发板上的USB 上,点击可执行程序Snake 文件,运行开发完成的贪吃蛇游戏程序,这样,整个系统整合完成。

3.2 系统整体测试

3.2.1 系统规则测试

本程序制定的规则是贪吃蛇撞墙死亡,撞到自己身体任意一部分死亡。

按照预先设计应出现的结果是当蛇头下一个移动节点的位置是地图四周的墙壁时,或者是蛇自身的某一个位置节点时,应该显示出一个对话框,标志着蛇死亡。下面我们进行测试。

我们运行程序,然后按空格键开始游戏,让蛇自身开始移动,我们首先让蛇头撞到地图周围的墙壁,观察结果是不是出现应该出现的结果。

下图是我们运行程序后的结果截图,观察出现的结果如图所示:

通过上图我们可以发现,当贪吃蛇由于“贪吃”而不小心撞到了地图周围的墙壁上,出现了一个对话框,宣告程序游戏结束,玩家记录分数如上图右面部分所示。

根据游戏规则,当贪吃蛇吃到自己身体的某一部分时,也应该出现一个对话框,显示游戏结束,标志着游戏的结束,玩家重新开始游戏。

测试用例:让蛇吃到自己身体的某一个部分,观察出现的结果是不是根据游戏规则应该出现的。开始游戏,然后让蛇吃到自己的身体某一部分,结果如下图所示:

通过上图,我们发现,当蛇头吃到自己身体的某一部分时,贪吃蛇死亡,游戏结束,说明此功能正确,测试结束。

3.2.2 按键功能测试

贪吃蛇的控制是通过键盘上的按键来进行控制的,我们需要对相应的按键进行功能测试,看相应的按键对应的功能是不是正确。一共有5个按键与贪吃蛇游戏相关,分别是,上、下、左、右按键,还有空格按键。其中空格按键的功能是开始游戏,同时还有当游戏在进行时可以暂停游戏的功能,对应测试图如下:

我们可以通过上图看到,在按下空格键时游戏开始,同时按下空格键,游戏暂停,停留在如图所示的状态。

下面我们来进行上、下、左、右功能键的按键测试,如下图所示:

通过观察上图和前一个状态的变化,我们发现此图显示了按上功能键后,贪吃蛇蛇头向上移动,说明向上按键功能正确。

通过观察上图和前一个状态的变化,我们发现此图显示了按下功能键后,贪吃蛇蛇头向下移动,说明向下按键功能正确。

通过观察上图和前一个状态的变化,我们发现此图显示了按左功能键后,贪吃蛇蛇头向左移动,说明向左按键功能正确。

通过观察上图和前一个状态的变化,我们发现此图显示了按右功能键后,贪

吃蛇蛇头向右移动,说明向右按键功能正确。

3.2.3 分数和关卡测试

玩家在进行游戏的比赛时,需要有个分数来进行统计,这个分数用来进行比较玩家的能力高低,我们要进行这个功能的测试,看是否随着吃到游戏果实的增加,对应的分数也相应的增加,同时当玩家达到一定的分数后,是不是关卡也随之增加,我们开始进行游戏的初始化界面如下:

按下空格键,开始游戏,进行测试,玩家通过开始一段时间的游戏后,观察上图右面部分,分数和关卡数的文本框的变化情况,是不是和游戏规则里面的描述相符合,我们观察下面的截图:

通过玩一段时间的游戏后,此时显示对应的分数为300分,不是初始化的0分,对应的时间是28秒,与目标测试结果相符合,功能正确,测试结束。

结论

本论文描述了基于winCE 设计思想开发的贪吃蛇游戏功能,作为基于winCE 嵌入式程序的开发,提供了一个完整的过程,从一开始定制内核到下载内核,程序的编写直至最后程序在板子上调试运行给初学者带来了一个整体的指导,方便学习基于winCE 嵌入式。

在采用了软硬件相结合的嵌入式设计方案,开拓了自己对嵌入式领域的认知,分别采用了winCE5.0作为系统定制的平台,PB5.0作为系统那个定制的工具,EVC4.0作为系统开发的语言平台,最后经过一系列的功能测试,下载内核,调试实验开发板,完成了能够在实验板上运行的贪吃蛇游戏,总体来说,采用winCE5.0版本的操作系统,较其他嵌入式操作系统而言,具有的优势是:良好的操作界面、实时性较高、开发工具丰富以及强大的技术支持等等。

然而,目前设计的基于嵌入式winCE 贪吃蛇游戏还处于较原始的阶段,实现的功能还不够完善,但随着相关技术的成熟和软硬件平台的发展,完善相关的游戏功能,使之更加完善,界面更加可视化。

嵌入式大作业

贪食蛇的设计和实现

作 者 姓 名:

学科、专业 :

学 号 :

指 导 教 师:

完 成 日 期:

大连大学

Dalian University

摘 要

WinCE 是微软公司嵌入式、移动计算平台的基础 它是一个开放的、 可升级的 32 位嵌入式操作系统 是基于掌上型 电脑类的电子设备操作系统 。

本文基于此,尝试设计了基于嵌入式winCE 开发的一款贪吃蛇游戏,主要目的是通过开发嵌入式贪吃蛇游戏,掌握嵌入式开发的整个过程,同时介绍基于winCE 嵌入式开发的详细设计步骤,向初学者介绍开发基于winCE 方面嵌入式程序的整个框架流程。本论文软件方面采用的是EVC++4.0开发平台设计程序,PB5.0进行系统定制,硬件方面采用的是PXA270-S 实验开发箱。整个设计流程将在本论文主体部分进行详细的叙述。从定制自己所需的winCE 系统、运用MFC 基于对话框的C++语言编写贪吃蛇游戏源代码到最终下载程序到实验开发板的整个过程都做了很详细的介绍。

关键词:winCE5.0、EVC++4.0、PB5.0 、嵌入式系统、贪吃蛇游戏

目 录

摘 要........................................................................................................................ 2

引 言........................................................................................................................ 1

1系统概要设计............................................................................................................. 1

1.1系统的整体结构 . ............................................................................................................... 1

1.1.1 系统的定制 . .......................................................................................................... 1

1.1.2 程序的编写 . .......................................................................................................... 2

1.2系统的硬件构建 . ............................................................................................................... 3

1.3系统的软件组成 . ............................................................................................................... 4

2. 系统的详细设计......................................................................................................... 4

2.1 定制winCE 内核 . .............................................................................................................. 4

2.1.1 winCE内核定制原理以说明 . ............................................................................... 4

2.1.2 winCE内核定制 . ................................................................................................... 5

2.2 贪吃蛇游戏详细设计开发 . .............................................................................................. 5

2.2.1 贪吃蛇游戏的可行性分析 . .................................................................................. 5

2.2.2 贪吃蛇游戏的需求分析 . ...................................................................................... 6

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

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

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

2.2.6 贪吃蛇游戏界面的实现 . .................................................................................... 10

2.2.7 贪吃蛇游戏主要代码说明 . ................................................................................ 10

3. 系统整合及测试....................................................................................................... 12

3.1 系统整合 . ........................................................................................................................ 12

3.2 系统整体测试 . ................................................................................................................ 13

3.2.1 系统规则测试 . .................................................................................................... 13

3.2.2 按键功能测试 . .................................................................................................... 14

3.2.3 分数和关卡测试 . ................................................................................................ 16

结论.............................................................................................................................. 17

引 言

随着计算机技术的快速发展,嵌入式技术也相应的取得了突破性的进展,嵌入式设备正日益渗透到人们的日常生活中,默默地为我们提供连接和服务,嵌入式设备往往是一个资源有限的系统,它们追求的是在有限的价格上满足一定的功能性要求。通常它们采用那些功能并不强大的CPU ,这也是开发者不得不尽可能地压缩嵌入式系统性能的原因。最初的嵌入式设备是单一用途的,它们拥有各自独特的显示方式和用户界面,而今天它们变成了类似PC 系统。它们可以运行很多相同的应用程序。针对嵌入式资源的限制,如何将对资源有很大依赖性的大规模的计算,成功的移植到嵌入式系统中,并能使其达到类似与在PC 上计算的效果。针对此问题,必须对原适用于PC 上的游戏引擎做出修改,才能使其在嵌入式系统中成功的运行。因此需要在特定的环境下开发相应的游戏,这样才能在以后下载到相应的板子上进行效果演示。

目前嵌入式行业在中国得到了有效发展,但是规模相应的还与国际上有很大的差距,因此,为了能够让大家对基于嵌入式wince 开发游戏得到有效的理解,本论文以贪吃蛇游戏为详细的例子,完整的阐述了嵌入式游戏的开发流程,以及演示结果,还有中间特别要注重的难点疑点的解析。本文对具体的开发流程都做了很详细的阐述,从编码到仿真,然后在定制系统内核,最后进行应用程序的下载,完成贪吃蛇游戏的具体效果演示,论文的后续都做了相当详细的解释。

1系统概要设计

1.1系统的整体结构

1.1.1 系统的定制

首先所需winCE 系统内核的定制,通过PlatformBuilders5.0来定制自己所需

要的系统内核,根据自己程序设计时所用到的win32程序的接口,以及用到的库函数,类库,各种所需要的驱动,例如USB 驱动,屏幕显示驱动,鼠标驱动,键盘驱动等,来定制自己所需要的系统内核,系统不必过于繁琐,达到自己所需要的功能即可,因为我们所强调的是嵌入式,嵌入式是以方便为前提的,定制的系统是以简洁方便为目的的,具体的定制细节我们在第四章将会详细介绍。

1.1.2 程序的编写

程序的名称是《贪吃蛇游戏》,采用的是VC++语言,MFC 微软基础类库环境的单文档窗体。

程序的大体思想是:采用一个二维数组(这里我们采用的是24*24的整形数组)作为贪吃蛇游戏的背景地图,数组的每个值代表地图上每个小矩形,而每个小矩形连续组成贪吃蛇的蛇身,在程序初始化窗体时候调用这个函数,刷新出程序的背景地图;程序贪吃蛇的蛇身用一个Cpoint 类的一位连续数组,Cpoint 类是一个结构体类型,结构体类型里包含着两个整形参数x 和y 代表的是屏幕窗体上的某一个对应的点的坐标,我们在得知点的坐标的同时,就明确了对应二维数组地图上的某个矩形区域的坐标值,这样用Cpoint 类的一位数组我们可以存放蛇身的每个节点的坐标,于此同时,我们在程序snake 类里面设定蛇头和蛇尾的坐标变量、蛇身长度的坐标变量,这样在程序调用Timer()系统函数定时刷新时,每次刷新只需要改变蛇头和蛇尾的坐标即可,每次刷新时,根据舍身前进方向判断下一个头节点的坐标值,然后添加到Cpoint 类定义的蛇身节点,而蛇尾节点坐标值是前一个状态的倒数第二个节点,然后调用库函数FillSolildRect()函数刷新头节点为蛇的自身颜色,而尾节点是地图背景颜色,这样我们在外观看起来就是蛇身前进的效果。

那么,我们怎么判断蛇头前进的方向呢?这个问题的解决方式是,在定义snake 类的同时,定义了一个私有变量Direction 为蛇动态前进的方向,而每次Timer()刷新时,动态的根据键盘响应函数来判断前进方向,并同时给Direction 赋值,这样每次刷新的同时Direction 为四个方向(上、下、左、右)其中的一个方向,蛇头前进的方向在此时已经确定,这样就动态的根据输入的键盘值来改变蛇的前进方向,我们就可以控制蛇的移动啦!

最后,在蛇动态效果显示出来的同时,我们也应该考虑到蛇的生命周期问题,就是蛇在什么情况下会死亡,在什么情况下会得分,在什么情况下会自身长度增加等一系列相关问题。这里我们首先考虑到一个十分重要的问题,就是蛇遇到食物(这里我们用一个蓝色的小矩形表示蛇的食物苹果) 同时,将食物吃掉并且动态自身增加一节,这里我们是这样实现的:首先实现的是食物的随机出现,在某个食物被吃掉的同时,我们要立即产生出下一个食物的坐标,我们用到的是一个随机函数产生出下一个食物的坐标,但是这个坐标必须仅仅在0—23之间,因为我们地图采用的是一个24维的二维数组表示的,地图每个横坐标纵坐标的范围是0—23,但是,这里注意一个特别重要的问题,就是每次随机产生的食物坐标不能出现在当前蛇身上,我们必须加一个判断,如果产生的坐标在蛇身上,必须重新生成,一直到产生一个在地图上并且不在蛇身上的食物坐标为止;当蛇头坐标的下一个前进方向的坐标和食物坐标相等时,我们在这里是将食物坐标改变成当前蛇头坐标,并且蛇尾坐标不变,蛇身长度增加一个单位,这样就动态的现实出来蛇吃食物自身增加一个的效果。

生命周期的问题:在我们解决上述功能的同时,我们不得不考虑一个问题,那就是蛇的生命周期问题,就是蛇在身条件下会死亡,死亡的结果会是怎么样,我们在这里做了一个判断,就是蛇遇到地图周围的墙和遇到自己的身体蛇会死亡,生命周期结束,于此同时记录下当前玩家所得的分数,比较分数来判断玩家的能力程度,那么我们怎么判断蛇头撞墙和蛇头撞到自身呢?继承上一个问题的解决方式,蛇身用到的是Cpoint 类的一个一维数组表示,地图用到的是一个二维数组表示,当蛇头节点的左边和二维数组边界值相等时,或者蛇头坐标变为蛇自身的坐标时,蛇死亡,生命周期结束,关闭定时器函数Timer(),初始化游戏界面,记录当前分数,重新等待游戏开始。到此为止,贪吃蛇游戏的大概思路就解决了。

1.2系统的硬件构建

硬件环境分析:系统硬件平台采用的是PXA270-S 实验开发板,开发板提供了多种CPU 内核共大家使用,具体的内核信息详细如下:

X86:支持的处理器包括486、586、Geode 、Pentium I/II/III/IV。

ARM :支持的处理器包括ARM720T 、ARM920T 、ARM1020T 、StrongARM 、Xscale 。 SHx :支持的处理器包括SH-3、SH-3 DSP、SH-4。

MIPS :支持的处理器包括MIPS II/32(带浮点运算)、MIPS II/3(不带浮点运算)、MIPS16、MIPS IV/64(带浮点运算)、MIPS IV/6(不带浮点运算)。

软件环境分析:PC 机操作系统Win2000或以上,EVC4.0开发环境,WinCE500标准SDK ,PXA270-S 平台SDK 。

1.3系统的软件组成

PC 机操作系统Win2000或以上,EVC4.0开发环境,WinCE500标准SDK ,PXA270-S 平台SDK 。

2. 系统的详细设计

2.1 定制winCE 内核

2.1.1 winCE内核定制原理以说明

定制winCE 内核之前,我们首先要做的准备工作详见下:首先是安装PB 工具,我们这里之前已经提及,所以就不再过多叙述。在实际操作中,我们主要有如下的注意事项:

(1)推荐安装在分区根目录下。并且分区需要保持足够大的硬盘空间,一般需要5G 以上,PB 和运行在PC 的WinCE 环境需要安装在一个分区内。安装时间通常较长,网络安装的版本同时依赖网络的速度。 以下是微软推荐的最小配置,低于该配置PB 工具将不能正常安装或使用;处理器:至少266MHz Pentium II以上;推荐使用500MHz Pentium III以上CPU ;操作系统:Windows 2000 SP2以上;Windows XP;内存要求:至少128M ;使用模拟器时候至少192M (不包括操作系统本身占用的内存)硬盘:典型安装时,选择一种处理器需至少1.7G 空间;若要包含Platform Builder的完整工具组在内需要至少12G 的硬盘空间。光驱:可以使用与桌面系统相兼容的CD-ROM 或DVD-ROM 等。

(2)在安装过程中,会提示选择处理器体系结构,务必选中ARMV4I 和

XSCALE 两项,否则无法支持PXA270处理器。

(3)如果PC 上使用的操作系统为Windows XP SP2,可能出现严重安装问题,最好不要采用Windows XP SP2,或者在微软网站上搜索相关的指导文档。安装过程中请关闭系统防火墙。然后需要建立系统最基本的配置。打开PB 5.0,首先导入我们提供的BSP 包。导入BSP 的过程很简单,只需要安装光盘中提供的

up270classic_BSP文件就可以实现,可以由指导教师提前完成。安装完,会发现在系统的\WINCE500\Platform\路径下出现“Up_PXA270cl”文件夹,这个就是安装好的BSP 了。之后建立UP-TECH S2410/P270 DVP的WinCE 工程,都需要建立在这个BSP 的基础上。(类似地,你也可以自己构建系统自带的Mainstone II的工程,但是它不能运行在UP-TECH S2410/P270 DVP实验箱上)。

2.1.2 winCE内核定制

我们在编译winCE 内核镜像前,需要添加特性目录(Catalog)的一些组件来定制内核,我们在本系统需要添加以下的组件:

(1)添加鼠标键盘控制驱动; (2)添加USB 主控制器驱动;

(3)添加USB 从控制器驱动(建立与PC 机的Activesyn 。连接需要此特性) ;

(4)添加串口驱动; (5)添加触摸屏驱动;

(6)添加IE6.0浏览器驱动;(7)添加拨号网络组件驱动;

(8)添加Fat 文件系统;. (9)加入对HIVE 注册表的支持;

(10)加入对Mediaplayer 播放器;

(11)加入对本地存储器中的mp3和wMA 文件播放的支持。

除了上述所需的添加组件外,我们还需要一些另外的组件。

2.2 贪吃蛇游戏详细设计开发

2.2.1 贪吃蛇游戏的可行性分析

通过查找相关文档和技术支持,了解了EVC 环境下的开发过程,熟悉了VC++语言的开发技巧,通过以下几个方面,进行可行性分析:

1. 参考《贪吃蛇游戏用户描述文档》、《软件工程》等书,确定自己能够

在自己能力范围内开发出这个贪吃蛇游戏项目。

2. 功能要求:在进行整个项目开发之前,必须要做的就是确定贪吃蛇游戏

的主要功能,必须明确贪吃蛇游戏的功能,因为要进行游戏功能可行性

分析,经过自己的查阅相关资料,确定了贪吃蛇游戏的具体功能,详见

后续部分详细设计。

3. 性能需求:必须保证自己开发的贪吃蛇游戏能够整体尽可能做到高效快

速,不占用大量的使用资源,因为我做的是一个嵌入式的游戏开发项目,

必须要考虑资源使用情况,要求尽可能少用资源,在有限的资源范围内

实现最大的可利用价值。

4. 运行环境:PXA270-S 开发板,EVC ++4.0开发平台,模拟器上进行调试,

经过安装软件,确定可以进行项目程序的编写。

5. 界面要求:采用Windows 标准界面,只需要使用键盘和鼠标。

6. 完成期限,一个学期完成整个系统,包括程序的编写,硬件板子的下载,

以及最终的调试,测试阶段。

2.2.2 贪吃蛇游戏的需求分析

文档包括了嵌入式技术领域的介绍,嵌入式国内外环境的探索与简介,主要从我国嵌入式领域发展的最新阶段来探讨,与国际对比得出相应发展的前景,同时,针对自身对嵌入式方面的兴趣爱好,以及自己所掌握的有限知识来对嵌入式方面的一些看法等,另外还有winCE 环境的简介,以及用法,还有关于嵌入式基于winCE 的开发流程的一些相关文档,还有EVC++4.0开发工具的使用方法的介绍,以及游戏的详细代码的功能简介等。

游戏功能:能够实现贪吃蛇自动前线移动,也就是贪吃蛇能够“活动”的外观效果,根据相同的时间间隔,每一次将贪吃蛇自身的蛇头向前移动一个小格子,同时蛇尾向前移动一个小格子,移动方向为贪吃蛇行走的方向。对游戏中规则进行判断,当游戏中的贪吃蛇遇到墙壁和自身时,根据规则判断应为死亡,宣告当前游戏结束,记录当前游戏的分数值。根据每次所得的分数值不同,判断玩家的能力,来显示玩家的效果。贪吃蛇的相关操作,根据键盘上的上、下、左、右四个键来控制贪吃蛇游戏的前进方向,同时,根据空格键来开始游戏,空格键在游戏开始时,还有另外一个功能,那就是暂停游戏功能,这样玩家就可以根据暂停

游戏来处理当前需要处理的事情,当游戏结束时,按回车键就可以重新开始游戏的初始化界面。果实的出现,每次贪吃蛇吃到果实时,于此同时,应该出现一个果实在地图中,那么怎么实现这个功能呢?我采用的是随机函数出现果实的横纵坐标,然后判断这个店得坐标是不是在蛇身上,如果是那么就得重现出现上一个过程,直到食物的坐标不在蛇身上为止。这样就出现了果实。游戏分数的统计方法,当贪吃蛇吃到果实时,玩家的分数就应该随着吃到的果实而增加,增加的规则就是贪吃蛇的身体长度乘以等级 得到分数。这样就可以根据游戏的难度对应得到分数。

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

贪吃蛇功能图

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

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

游戏规则模块功能设计:游戏规则包括蛇的运动范围、蛇的生命周期问题、分数统计、关卡判断。其中蛇的运动范围是一个33*57的List Box,蛇运动的地图抽象成为一个33*57的List Box ,当蛇遇到List Box 边界值(我们在这里抽象成为

上、下、左、右四个边界,其中上边界坐标值中纵坐标都是20,横坐标任意,下边界为纵坐标是53,同理横坐标不变,左边界为横坐标为20,纵坐标任意,同理右边界为横坐标为77,纵坐标任意) 时,宣告蛇生命周期结束,贪吃蛇死亡,这个是第一个规则;另外,当蛇自己吃到自己身体的某一部分时,也宣告游戏结束,在程序里通过循环判断蛇头下一个前进方向的节点是不是蛇身上的某一部分节点即可,如果是那么蛇死亡,否则继续运行游戏。分数统计算法的思想是每次蛇吃到一个果实时,相加的分数为蛇身长度乘以一个定值来记录分数,这样可以随着游戏难度的增加,分数值也随之增多。关卡功能设置通过与分数相关联而体现的,初始化游戏为第一关,分数为0,当玩家玩到一定的分数时(例如是500) 关卡加一,变为第二关,同时,蛇前进速度相应增加一个等级,这样就实现了不同关卡,不同速度的贪吃蛇,从而增加了游戏的难度。

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

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

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

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

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

Windows MFC 在程序执行时,会动态的调用窗口资源,在程序自动生成函数中,添加相应的函数实现程序初始化界面,本程序的具体思路是:程序在开始执行时会调用BOOL CSnakeDlg::OnInitDialog()函数,进行窗体的初始化,我们在此窗体客户区求得窗体长和宽的最小值,记录在WIDTHOFBRICKS 和

HEIGHTOFBRICKS 变量中,因为我们设计的游戏地图是一个33*57的矩形区域,在这,根据WIDTHOFBRICKS 和HEIGHTOFBRICKS 等分,求出每个小矩形的边长存放在HEIGHTOFBRICKS 和WIDTHOFBRICKS 变量中,然后调用绘图函数void CSnakeDlg::MyDraw()进行地图的绘制,这样在程序执行时,就动态绘制了贪吃蛇游戏地图。

首先,食物时通过一个坐标记录下在地图上的位置,通过绘图函数绘制这点坐标的小矩形,程序中采用的是随机数生成食物出现的坐标。其次,程序中必须增加一个判断,判断当前生成的食物坐标是否在贪吃蛇身体范围内,如果当前生成的坐标在蛇身坐标范围内,那么必须重新随机产生食物坐标直到不在为止。如果坐标不在蛇身坐标范围内,则把坐标位置返回给调用对象。程序中本模块具体功能是在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 语句进行相应按键的响应,从而实现按键响应功能

2.2.6 贪吃蛇游戏界面的实现

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

如上图:游戏界面左边为地图部分,是一个33*的二维数组抽象出来的,右面有七个按钮部分,分别对应着上诉部分按键功能。

2.2.7 贪吃蛇游戏主要代码说明

下面函数是游戏开始函数,主要功能是初始化游戏的状态,开启计时器函数,实现游戏的开始。

void CSnakeDlg::Start()

{

}

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

BOOL CSnakeDlg::OnInitDialog()

{

CDialog::OnInitDialog(); SetIcon(m_hIcon, TRUE); Level=1; Score=0; TimerInterval=200; GameState=RUNNING; dead_flag=1;//初始化蛇没有死 SetDlgItemText(IDC_SCORE_NUM,L"0"); SetTimer(1,TimerInterval,NULL);//开始设置计时器 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,HEIGHT

OFBRICKS);

} Level=0; GameState=STOP; InitSnake(); return TRUE;

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

void CSnakeDlg::RefreshAll()

{

CDC* dc=GetDC();

for(int y=0;y

{

for(int x=0;x

{

if(SnakeOfBrick[y][x]==0)

{

dc->FillSolidRect(LEFTMARGIN+x*WIDTHOFBRICKS,10+y*H

EIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,BAC

KCOLOR);

dc->Draw3dRect(LEFTMARGIN+x*WIDTHOFBRICKS,

10+y*HEIGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRIC KS,CLRTOPLEFT,BACKCOLOR);

}

if(SnakeOfBrick[y][x]==1)

{

dc->FillSolidRect(LEFTMARGIN+x*WIDTHOFBRICKS,10+y*HE

IGHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,SNAK

ECOLOR);

dc->Draw3dRect(LEFTMARGIN+x*WIDTHOFBRICKS,10+y*HEI

GHTOFBRICKS,WIDTHOFBRICKS,HEIGHTOFBRICKS,CLRTO

PLEFT,SNAKECOLOR);

}

}

}

ReleaseDC(dc);

}

3. 系统整合及测试

3.1 系统整合

通过前几章的叙述,我们已经把系统的各个部分分别作了非常详细的论述,

我们已经将上述过程中定制好的winCE 系统下载到PXA270-S 实验箱上,于此同时我们已经在EVC++4.0开发平台上运用VC++语言开发好贪吃蛇游戏的详细代码,剩下的就是将上诉三个过程最终整合在一起,达到编制好的程序最终在开发板上运行的一种嵌入式程序设计的效果。我们将开发板接好电源,下载好winCE 系统,后,将数据线连接好,启动同步软件,进行连接,直到同步软件显示连接成功之后,浏览板子内容,选择PXA270-S 开发板SDK ,进行编译,将C:\Documents and Settings\lining\桌面\Snake_no_dead\ARMV4Irel目录下的可执行文件加入到实验箱目录下,然后连接键盘和鼠标到开发板上的USB 上,点击可执行程序Snake 文件,运行开发完成的贪吃蛇游戏程序,这样,整个系统整合完成。

3.2 系统整体测试

3.2.1 系统规则测试

本程序制定的规则是贪吃蛇撞墙死亡,撞到自己身体任意一部分死亡。

按照预先设计应出现的结果是当蛇头下一个移动节点的位置是地图四周的墙壁时,或者是蛇自身的某一个位置节点时,应该显示出一个对话框,标志着蛇死亡。下面我们进行测试。

我们运行程序,然后按空格键开始游戏,让蛇自身开始移动,我们首先让蛇头撞到地图周围的墙壁,观察结果是不是出现应该出现的结果。

下图是我们运行程序后的结果截图,观察出现的结果如图所示:

通过上图我们可以发现,当贪吃蛇由于“贪吃”而不小心撞到了地图周围的墙壁上,出现了一个对话框,宣告程序游戏结束,玩家记录分数如上图右面部分所示。

根据游戏规则,当贪吃蛇吃到自己身体的某一部分时,也应该出现一个对话框,显示游戏结束,标志着游戏的结束,玩家重新开始游戏。

测试用例:让蛇吃到自己身体的某一个部分,观察出现的结果是不是根据游戏规则应该出现的。开始游戏,然后让蛇吃到自己的身体某一部分,结果如下图所示:

通过上图,我们发现,当蛇头吃到自己身体的某一部分时,贪吃蛇死亡,游戏结束,说明此功能正确,测试结束。

3.2.2 按键功能测试

贪吃蛇的控制是通过键盘上的按键来进行控制的,我们需要对相应的按键进行功能测试,看相应的按键对应的功能是不是正确。一共有5个按键与贪吃蛇游戏相关,分别是,上、下、左、右按键,还有空格按键。其中空格按键的功能是开始游戏,同时还有当游戏在进行时可以暂停游戏的功能,对应测试图如下:

我们可以通过上图看到,在按下空格键时游戏开始,同时按下空格键,游戏暂停,停留在如图所示的状态。

下面我们来进行上、下、左、右功能键的按键测试,如下图所示:

通过观察上图和前一个状态的变化,我们发现此图显示了按上功能键后,贪吃蛇蛇头向上移动,说明向上按键功能正确。

通过观察上图和前一个状态的变化,我们发现此图显示了按下功能键后,贪吃蛇蛇头向下移动,说明向下按键功能正确。

通过观察上图和前一个状态的变化,我们发现此图显示了按左功能键后,贪吃蛇蛇头向左移动,说明向左按键功能正确。

通过观察上图和前一个状态的变化,我们发现此图显示了按右功能键后,贪

吃蛇蛇头向右移动,说明向右按键功能正确。

3.2.3 分数和关卡测试

玩家在进行游戏的比赛时,需要有个分数来进行统计,这个分数用来进行比较玩家的能力高低,我们要进行这个功能的测试,看是否随着吃到游戏果实的增加,对应的分数也相应的增加,同时当玩家达到一定的分数后,是不是关卡也随之增加,我们开始进行游戏的初始化界面如下:

按下空格键,开始游戏,进行测试,玩家通过开始一段时间的游戏后,观察上图右面部分,分数和关卡数的文本框的变化情况,是不是和游戏规则里面的描述相符合,我们观察下面的截图:

通过玩一段时间的游戏后,此时显示对应的分数为300分,不是初始化的0分,对应的时间是28秒,与目标测试结果相符合,功能正确,测试结束。

结论

本论文描述了基于winCE 设计思想开发的贪吃蛇游戏功能,作为基于winCE 嵌入式程序的开发,提供了一个完整的过程,从一开始定制内核到下载内核,程序的编写直至最后程序在板子上调试运行给初学者带来了一个整体的指导,方便学习基于winCE 嵌入式。

在采用了软硬件相结合的嵌入式设计方案,开拓了自己对嵌入式领域的认知,分别采用了winCE5.0作为系统定制的平台,PB5.0作为系统那个定制的工具,EVC4.0作为系统开发的语言平台,最后经过一系列的功能测试,下载内核,调试实验开发板,完成了能够在实验板上运行的贪吃蛇游戏,总体来说,采用winCE5.0版本的操作系统,较其他嵌入式操作系统而言,具有的优势是:良好的操作界面、实时性较高、开发工具丰富以及强大的技术支持等等。

然而,目前设计的基于嵌入式winCE 贪吃蛇游戏还处于较原始的阶段,实现的功能还不够完善,但随着相关技术的成熟和软硬件平台的发展,完善相关的游戏功能,使之更加完善,界面更加可视化。


相关文章

  • 600个毕业设计题目
  • 1 实验室排课系统 2 电子技术题库系统升级设计及打包发布 3 电子技术基础辅助学习系统设计 4 电子技术基础辅助学习系统功能实现 5 检察院语音门户网站设计 6 185邮政客户服务中心构架分析 7 无纸水文信息记录仪研究与设计 8 中文语 ...查看


  • 电子信息工程毕业设计题目大全
  • 1 压力容器液位测量 2 多功能遥控小车 3基于RS232的仓库多点温度.湿度.气 4压检测系统 5自动控制升降旗系统 6基于RS485的温度报警系统 7基于模糊算法的水温控制系统的设计 8多分机电话交换机 9简易火灾自动报警系统 10基于 ...查看


  • 基于FPGA的乒乓球游戏参考毕业论文设计
  • 基于 XILINX-FPGA 的乒乓球游戏参考设计 一.背景: Xilinx 大学计划(xilinx university plan 简称 XUP)一直致力于为工程课程 提供新一代软件和硬件设计流程.全球数千所使用 Xilinx 系统进行教 ...查看


  • 基于嵌入式的视频监控系统设计
  • 嵌入式系统设计课程作业 题目:基于嵌入式的视频监控系统设计 姓名: 班级: 学号: 成绩: 2015年06月17日 基于嵌入式的视频监控系统设计 摘要: 该文介绍了一种基于WiFi 无线网络的嵌入式视频监控系统的设计.该设计的服务器端以AR ...查看


  • 智能交通疏缓拥堵专题资料集锦(二)
  • 智能交通 疏缓拥堵专题 资料集锦(二) 更新时间:2015-2-5 以下是小编整理的一些智能交通 疏缓拥堵专题资料,其中包括了有关 智能交通的学术研究文献及其文献简介.有关文档的下载,可以到研发 埠网站的专题模块,输入相应的专题名,搜索到相 ...查看


  • 注塑机嵌入式控制系统图形界面的设计与实现
  • 注塑机嵌入式控制系统图形界面的设计与实现 The design and realization of graphical interface for mould plastics machine's embedded control sys ...查看


  • 嵌入式网络数控技术与系统_周祖德
  • 嵌入式网络数控技术与系统* 周祖德龙毅宏刘泉 (武汉理工大学湖北省数字制造重点实验室武汉 430070) 20机械工程学报第 43 卷第 5 期期 于嵌入式的新型网络数控系统. 嵌入式系统是"嵌入到受控对象或宿主系统中 的专用计算 ...查看


  • 电子信息类毕业设计课题
  • 电子信息类毕业设计课题 [电子通讯] 出租车计价系统 [过程控制] 基于单片机实现单回路智能调节.. [电子通讯] 脉冲数字频率计 [机床仪表] 仪表机床数控系统的设计(论文.. 磁流体发电论文 [电子通讯] 基于VC++6.0的PC 机与 ...查看


  • 嵌入式系统论文 1
  • 目录 引言 . ............................................................... 3 第一章 嵌入式系统发展历史 . .............................. ...查看


热门内容