贪吃蛇嵌入式系统课程设计报告 doc 联系客服

发布时间 : 星期四 文章贪吃蛇嵌入式系统课程设计报告 doc更新完毕开始阅读a3e670617e192279168884868762caaedc33bae7

设置,暂停,帮助等菜单项。

本课题未使用嵌入式开发平台上的所有硬件,如串口,电机,音频,以太网等,所以在此不再赘述。

4. 系统软件实现 4.1. 数据结构设计 一个好的程序必须有一个好的数据结构。

对于嵌入式程序的开发也是一样。

在本程序中一个非常重要的问题就是如何表示贪吃蛇,因为好的表示,贪吃蛇的行为(移动,吃食物,碰壁等)才容易处理。

另一个重要的问题就是性能众所周知,嵌入式设备对性能是非常敏感的,于是如何优化贪吃蛇的表示,从而保证资源的最大化利用也是一个重要的问题。 本软件的主要数据结构二维数组。 如图4-1-1。

图4-1-1 这是一个8X8的二维整形数组GRID[8][8],为了方便说明,矩阵中每一个点的取值有上,下,左,右,食物,石头,空白七种取值,那么这个矩阵的具体赋值如下 { 0 1 2 3 4 5 6 7 0 {空白,空白,空白,空白,空白,空白,空白,空白}, 1 {空白, 右 , 下 ,空白,空白,空白,空白,空白}, 2 {空白,空白, 下 ,空白, 右 , 右 ,空白,空白}, 3 {空白,空白, 下 ,空白, 上 ,空白,空白,空白}, 4 {空白,空白, 右 , 右 , 上 ,空白,空白,

空白}, 5 {空白,空白,空白,空白,空白,空白,空白,空白}, 6 {空白,空白,空白,食物,空白,空白,石头,空白}, 7 {空白,空白,空白,空白,空白,空白,空白,空白} } 1.贪吃蛇的表示取值为上下左右的点为贪吃蛇的身体部分,其下标表示点位置,其取值表示点的方向,这样就可以记录蛇的形状,同时用两个坐标对表示蛇的头尾,即头下标(2,5),尾下标(1,1)。

2.贪吃蛇的移动如果GRID[2][6]空白,需要GRID[1][1]空白,GRID[2][6]GRID[2][5]右,同时修改头下标为(2,6),尾下标为(1,2)。

如果GRID[2][6]食物,只需要GRID[2][6]GRID[2][5]右,同时头下标(2,6)。

如果GRID[2][6]石头,游戏结束。

移动一步后的矩阵如下(以第一种情况为例,其他同理) { 0 1 2 3 4 5 6 7 0 {空白,空白,空白,空白,空白,空白,空白,空白}, 1 {空白,空白, 下 ,空白,空白,空白,空白,空白}, 2 {空白,空白, 下 ,空白, 右 , 右 , 右 ,空白}, 3 {空白,空白, 下 ,空白, 上 ,空白,空白,空白}, 4 {空白,空白, 右 , 右 , 上 ,空白,空白,空白}, 5 {空白,空白,空白,空白,空白,空白,空白,空白}, 6 {空白,空白,空白,食物,空白,空白,石头,空白}, 7 {空白,空白,空白,空白,空白,空白,

空白,空白} } 3.计分上述中,上下左右空白食物石头分别对应一个整数的值(或一个范围)。

食物刚产生时有一个初值假设为11,石头对应的整数值为31,取值在11-30范围内的都是食物,贪吃蛇每移动一步,食物的值增加1,当增大到31时,食物就变成了石头,这样31-1120步内食物未被吃到就会变成石头。

假设在第11步吃掉了食物,那么吃掉前食物的值增加到111122,那么你的得分会加上31-229分。

在第16步吃掉食物,那么吃掉食物前,食物的值增加到111627,那么你的得分会加上31-274分。

4.2. 主任务设计 负责游戏初始化,等待键盘扫描任务和触摸屏扫描任务发送来的消息,决定贪吃蛇的下一步走向以及整个游戏的状态(是否结束,是否暂停等等)。 流程图如图4-2-1。

图4-2-1 4.3. 键盘任务设计 负责监听用户在键盘上的动作,以消息方式发送给主任务,主任务对用户的键盘操作做出相应的响应。

键盘任务本是系统附加任务,在这里我们自己实现,具体原理就是使用查询方式,调用系统函数GetKey,并以获得的参数创建消息结构,然后使用SendMessage将消息发送出去。

源码如下 void Key_Scan_Taskvoid *Id { U32 key;

POSTMSG pMsg; for;; { keyGetKey0; ///无限期等待键盘按下 pMsgOSCreateMessageOSM_KEY,key

ifpMsg

SendMessagepMsg; } } 4.4. 触摸屏任务设计 负责监听用户在触摸屏上的动作,以消息方式发送给主任务,主任务对用户的触摸屏操作做出相应的响应。 原理同键盘任务。

4.5. 贪吃蛇移动任务设计 负责贪吃蛇的不断移动,是一个无限循环。

其循环体的执行,受主任务的控制,具体讲就是多任务的同步。

因为主任务的优先级比此任务高,主任务主要负责系统消息的处理,如果没有系统消息,主任务就会在挂起状态,所以贪吃蛇移动任务就会执行。

我们定义了一个信号量Game_Run_Sem,任务先执行OSSemPend函数,等待这个信号量,如果这个信号量有效(主任务释放),那么执行移动一步的操作。

移动一步的操作在数据结构的设计中有详细讲解。 具体参考源程序snakeMoving函数 void snakeMoving //贪吃蛇移动一步的函数 { int x,y; getnexthX,hY, //获得贪吃蛇头的下一个点坐标 ifgrid[fX][fY]STONE //如果食物变成了石头,则产生新的食物 { drawdotfX,fY,BLACK; //绘制黑色石头 genFood; //产生新的食物 } ifx18|y12 //坐标在矩阵中越