基于μCOS系统ARM9硬件平台的贪吃蛇C语言游戏设计Word下载.docx
- 文档编号:21009428
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:24
- 大小:105.13KB
基于μCOS系统ARM9硬件平台的贪吃蛇C语言游戏设计Word下载.docx
《基于μCOS系统ARM9硬件平台的贪吃蛇C语言游戏设计Word下载.docx》由会员分享,可在线阅读,更多相关《基于μCOS系统ARM9硬件平台的贪吃蛇C语言游戏设计Word下载.docx(24页珍藏版)》请在冰豆网上搜索。
5)键盘:
17键数字小键盘
6)显示器:
320×
24016级灰度的LCD(可选256彩色LCD),四线电阻式触摸屏
7)USB接口:
1.1标准
8)串行口:
两个,最高波特率115200kb
9)网络接口:
10M以太网
10)CAN接口:
125Kb,250Kb,500Kb,1Mb
11)调试接口:
JTAG,14针,20针
12)电机:
直流电机(有刷),步进电机(带1/64减速器)
13)A/D:
8路10位,满量程2.5V,已用前4路
14)D/A:
10位,满量程4.096V
15)LED:
8个,共阴极
16)音频输出:
44.1KHz
17)FPGA(可选):
ACEX1K系列,扩展输出100I/O,与S3C44B0X外部总线直接
相连
18)扩展口:
2个
二、开发集成环境——ARMSDT2.5集成开发环境
ARMSDT2.5集成开发环境(ARMProjectManager)是ARM公司(为方便用户在ARM芯片上进行应用软件开发而推出的一整套集成开发工具。
ARMSDT可在Windows95、98、NT以及Solaris2.5/2.6、HP-UX10上运行,支持最高到ARM9(含ARM9)的所有ARM处理器芯片的开发,包括StrongARM。
ARMSDT包括一套完整的应用软件开发工具:
1、*armccARM的C编译器,具有优化功能,兼容于ANSIC。
2、*tccTHUMB的C编译器,同样具有优化功能,兼容于ANSIC。
3、*armasm支持ARM和THUMB的汇编器。
4、*armlinkARM连接器,连接一个和多个目标文件,最终生成ELF格式的可执行映像文件。
5、*armsdARM和THUMB的符号调试器。
详细设计
一、属性解释
贪吃蛇游戏设计最主要在于蛇移动的控制,在设计中分别用两组一维数组snake.U16x[100]和snake.U16x[100]来分别0存放蛇身的坐标,x[100]代表横坐标,y[100]代表纵坐标。
蛇的宽度设置为10个像素点。
变量direction为移动方向,foodx,foody为食物的坐标。
function.stop为判定是否是要结束退出游戏,function.restar用来在游戏结束后重新开始游戏。
1000/snake.level为蛇的移动速度(在程序中用1000/snake.level作为每次循环的延迟时间),当snake.level的记录的等级越高的话,蛇的移动速度会越快(因为延迟时间越小),难度越高。
snake.life用来判定游戏是否结束,snake.life=1代表蛇已死,游戏结束。
游戏的其他相关变量还有snake.node,用来记录蛇的节数;
snake.score用来记录游戏得分;
snake.level用来记录游戏的等级。
二、相关初始化过程:
1、堆栈大小定义、任务优先级定义:
OS_STKMain_Stack[STACKSIZE*8]={0,};
VoidMain_Task(void*Id);
#defineMain_Task_Prio12
OS_STKControl_Stack[STACKSIZE*8]={0,};
voidControl(void*Id);
#defineControl_Prio15
2、任务的创建:
OSTaskCreate(Main_Task,(void*)0,(OS_STK*)&
Main_Stack[STACKSIZE-1],Main_Task_Prio);
OSTaskCreate(Control,(void*)0,(OS_STK*)&
Control_Stack[STACKSIZE*8-1],Control_Prio);
3、初始化画笔宽度:
SetPenWidth(pdc,10);
//初始化画笔宽度为10个像素点
4、初始化蛇的节数:
snake.node=5;
//游戏开始时蛇有5节
5、初始蛇尾巴的坐标:
snake.x[0]=10;
snake.y[0]=10;
初始化蛇各节的坐标:
for(i=0;
i<
=snake.node-1;
i++)
{
snake.x[i+1]=snake.x[i]+10;
snake.y[i+1]=snake.y[i];
}
6、蛇相关参数的初始化:
初始化移动方向为向右:
snake.direction=6;
7、游戏相关参数的初始化:
初始化分数:
snake.score=0;
初始化等级:
snake.level=1;
三、程序流程:
本设计需要创建两个任务,任务流程和任务状态切换如下图。
具体的任务流程和任务所要完成的功能如下:
在系统启动后,同时创建两个任务,任务一和任务二。
任务一主要功能是等待键盘消息,有键盘消息的时候判断是什么键盘,并对相应的变量重新赋值。
任务二主要功能是控制并在屏幕上显示蛇的移动,并完成对分数、游戏等级、和其他相关参数的记录和显示。
任务一为主任务,在创建任务的时候,赋给它的优先级别比任务二高,所以任务一优先运行,任务二处于就绪状态,因为任务一主要是等待键盘消息,在无键盘消息的时候,任务一被挂起,这时候任务二进入运行状态。
1、程序主流程图:
否
是
2、主任务流程图:
——主要功能是等待键盘消息,有键盘消息的时候判断是什么键盘,并对相应的变量重新赋值。
3、任务二流程图:
——主要功能是控制并在屏幕上显示蛇的移动,并完成对分数、游戏等级、和其他相关参数的记录和显示。
四、具体功能实现:
1、移动功能的实现:
这部分功能是游戏的主体,实现蛇移动的方式是首先擦除蛇尾,擦除的方发是用白色的画笔覆盖画上蛇尾,蛇尾就变成白色底色不可见,然后从蛇尾开始,依次将蛇每一的坐标给下一节。
例如刚开始蛇是5节,这时候依次把第2四节的坐标给第1节;
把第3节(即蛇头)的坐标给第2节;
把第4四节的坐标给第3节;
把第4节(即蛇头)的坐标给第3节;
把第5节(即蛇头)的坐标给第4节。
擦除蛇尾和转移坐标这两个顺序不能颠倒。
这时候蛇头的坐标和第4节的坐标是一样的,这时候需要判断变量snake.direction的值,根据snake.direction的值补画上蛇头。
首先,擦除蛇尾
SetPenColor(pdc,0xffffffff);
MoveTo(pdc,snake.x[0],snake.y[0]);
LineTo(pdc,snake.x[0],snake.y[0]);
然后,蛇的每个环节坐标给下一节;
For(i=0;
i++)
snake.x[i]=snake.x[i+1];
snake.y[i]=snake.y[i+1];
判断snake.direction的方向:
Switch(snake.direction)
case6:
snake.x[snake.node]+=10;
break;
//6表示右,通过这个判断来移动蛇头
case2:
snake.y[snake.node]+=10;
//8表示上,通过这个判断来移动蛇头
case4:
snake.x[snake.node]-=10;
//4表示左,通过这个判断来移动蛇头
case8:
snake.y[snake.node]-=10;
//2表示下,通过这个判断来移动蛇头
最后,补画上蛇头的那一节:
SetPenColor(pdc,0);
MoveTo(pdc,snake.x[snake.node],snake.y[snake.node]);
LineTo(pdc,snake.x[snake.node],snake.y[snake.node]);
2、食物的产生:
食物的产生主要要注意食物产生之前,我们必须要判断画面上面是已经存在食物,如有已经存在食物了,就不再产生食物,如果食物被蛇吃到了,那就要重新画上食物。
本设计是中设置了变量eye,在每次循环都判断依次eye的值,通过eye的值来判断要不要画出食物。
eye的值为0表示要画食物,为1表示已经存在食物。
在蛇吃到食物后eye的值要被赋值0,画完食物后重新赋值1。
另外还要保证食物不能超出蛇的活动界面,并要保证食物能被蛇吃到,所以需要指定食物坐标的范围,被通过舍去食物坐标个位的方法保证食物坐标是整十,这样就能被蛇吃到。
本设计用一个矩形方框来代表食物,所以通过上面介绍的方法产生食物坐标后,对应在该坐标的位置画上一个矩形方框。
If(eye==0)
{
a=rand()%620+10;
b=rand()%415+45;
food.foodx=a/10*10;
food.foody=b/10*10;
SetPenColor(pdc,0);
MoveTo(pdc,food.foodx,food.foody);
LineTo(pdc,food.foodx,food.foody);
eye=1;
3、判断蛇是否吃到食物:
判断蛇是否吃到食物的方法比较简单,只要判断蛇头的X、Y坐标是否同时和食物的坐标的X、Y一样。
吃到食物后改变响应的游戏参数,并要让蛇的节数多一节,这时候要让变量snake.node加1,并且还要对蛇补画上一节,本设计采用补上蛇头的方法,要注意根据此时蛇的运动方向来确定新蛇头的坐标。
另外,要注意,蛇吃完食物后,要把变量eye赋值0,以后食物产生子程序能够判断食物已经被蛇“吃到”了,要重新产生食物。
if(snake.x[snake.node]==food.foodx&
&
snake.y[snake.node]==food.foody)
snake.score++;
snake.node++;
然后判断此时蛇的运动方向,补上新蛇头的坐标
switch(snake.direction)
Case6:
snake.x[snake.node]=snake.x[snake.node-1]+10;
snake.y[snake.node]=snake.y[snake.node-1];
Case2:
snake.y[snake.node]=snake.y[snake.node-1]+10;
snake.x[snake.node]=snake.x[snake.node-1];
snake.x[snake.node]=snake.x[snake.node-1]-10;
snake.y[snake.node]=snake.y[snake.node-1]-10;
接下来根据新蛇头的坐标,画上新蛇头
MoveTo(pdc,snake.x[snake.node],snake.y[snake.node]);
eye=0;
4、判断游戏是否结束的功能实现——有两种情况,游戏将结束
(1)蛇头撞到蛇身
判断蛇是否撞到蛇身的方法可以从蛇头开始依次开始判断蛇头的X、Y轴坐标是不是同时和蛇身的坐标相等,但是其实因为从第四节开始蛇身才有可能被蛇头碰到,为了减轻硬件资源开销,只需要从snake.node-3的那一节开始,逐次逐节开始判断蛇身的X、Y坐标是否同时和蛇头的X、Y坐标一样,一样的话即表明蛇撞到蛇身了,此时游戏结束。
例如,游戏刚开始蛇有5节,只要判断第5节坐标(即蛇头)是不是和蛇身第2节坐标相等,相等的话,游戏结束;
不相等再判断第5节坐标(即蛇头)是不是和蛇身第1节坐标相等。
For(i=snake.node-3;
i>
=0;
i--)
{
if(snake.x[i]==snake.x[snake.node]&
snake.y[i]==snake.y[snake.node])
snake.life=1;
}
elsecontinue;
(2)蛇头撞到游戏界面边框
判断蛇是否撞到边框的方法,只要比较蛇头的X、Y坐标是不是同时和边框的X、Y坐标一样,一样的话,即表明蛇撞到边框,游戏结束。
例如:
本设计中以(10,45)为坐标原点的情况下,只要保证蛇头的X坐标在0~620之间(像素点为单位),蛇头Y坐标在0~415之间(像素点为单位),即表示蛇没有撞到边框。
if(snake.x[snake.node]==0||snake.x[snake.node]>
=620||snake.y[snake.node]==0||
nake.y[snake.node]>
=415)
snake.life=1;
5、监听键盘动作:
任务通过等待消息而处于挂起状态,当任务接到消息以后,则处于就绪状态,然后开始判断所接受到的这个消息是不是需要处理,如果是执行相应的处理函数,最后,删除所接收到的消息,继续挂起等待下一条消息。
VoidMain_Task(void*Id)//Main_Test_Task
U8xiaoxi;
POSMSGpMsg=0;
for(;
;
)
pMsg=WaitMessage(0);
switch(pMsg->
Message)
caseOSM_KEY:
xiaoxi=onKey(pMsg->
WParam,pMsg->
LParam);
if(xiaoxi==……
……
default:
OSTimeDly(200);
DeleteMessage(pMsg);
U8onKey(intnkey,intfnkey)
switch(nkey)
Case……return……
returnFALSE;
程序下载与调试
1、把程序下载到试验箱中:
(1)执行菜单Project|Make对工程进行编译连接。
在出现的错误/警告窗口中选择某错误/警告信息,ADS会自动打开相应源文件并用箭头指向出错的文本行。
如果某个源文件被修改,重新编译时ADS会自动同步各文件的日期信息。
(2)在ADS中执行菜单Project|Debug启动ADS1.2的调试工具AXD。
(3)在AXD中执行菜单Options|ConfigureTarget对AXD进行设置。
选择ADP即远程调试,点Configure按钮进一步设置具体参数。
(4)点Select按钮选择远程连接为ARMethernetdriver,点Configure按
钮输入仿真器的IP地址。
如果用户使用的是并行口仿真器,请输入127.0.0.1即可。
(5)等待程序装载完毕以后,通过Execute|Go菜单以及Execute|Stop(或者工具栏中
的相应按钮)运行或暂停程序。
程序暂停后在窗口中将显示出程序暂停的位置。
(6)通过Execute|Step菜单(或者工具栏中的相应按钮)可以单步运行程序。
也可以
使用StepIn、StepOut菜单命令进入或者跳出函数的调用。
RunToCursor命令运行到光标位置。
(7)程序停止后可以通过ProcessorViews|Sources菜单查看源文件,并可在适当位置
按F9设置端点。
(8)使用在ProcessorView菜单下的Registers、Variables和Memory命令可以查看工作
寄存器或者内存变量。
读者可以逐一地尝试,为以后调试程序打下基础。
注意:
在进行调试时在ADS中必须选择当前工程的Debug版本,如果选择Release版本则无法正常调试程序。
但在调试通过后就必须选择Release版本进行编译连接并将生产的system.bin文件复制到开发板的Flash中。
将开发板上的Flash激活并使Windows认其为一个
2、运行结果与不足:
本程序能够完成设计目的的所有基本要求;
(1)能够通过方向键来控制蛇的移动方向;
(2)蛇吃到食物后能够重新出现食物;
(3)每吃到5个食物后,游戏能够自动进入下一关,并能通过增加蛇的移动速度来增加游戏的难度;
(4)能够通过按键随便退出游戏,并能通过按键重新进入游戏;
未能实现的功能;
本程序设计时预想在游戏开始前能够停留在游戏界别设置画面,并能通过手动进行游戏级别的调整,“+”按键用来增加游戏级别,“-”按键用来减少游戏级别,并能在屏幕上显示游戏灌输,等到有确认信息,游戏才开始。
但是此部功能没有实现,实验的时候程序能够进入级别调整画面,并等待用户对游戏等级进行调整,但是“+”、“-”按键和确认按键无效,没办法对游戏级别进行调整。
由于调试时间有限,最后删掉次部分功能。
不足之处:
(1)方向按键按下后,要有一定的延迟蛇才能对按键作出反应,这个延迟不是很明显,但是刚开始游戏的时候,总感觉不能刚好控制蛇吃到食物,需要稍微提早一些时间按下按键才能让蛇延目标方向移动。
这个不足的原理是因为每次按键按下,要等到下一次循环,蛇才能响应方向改变,而蛇控制的程序中每次循环中用到了比较多的循环语句,判断,跳转,每次程序循环所需要的时间比较长,所以感觉按键有一点延迟,但是这个延迟非常的小,并不明显。
解决方法:
要优化蛇控制程序,简化程序过程。
(2)蛇的移动范围和游戏界面有些不一致,例如蛇会稍稍超出游戏界面的边框。
这是因为蛇移动时候所用的坐标原点和画游戏界面所用的坐标原点不一样,在判断蛇是否超出边框时要注意计算在新坐标原点下,边框的位置,以便准确判断出蛇是否超出游戏界面。
这个问题仅仅是画面上有点缺陷,不影响贪吃蛇的功能。
要准确计算出游戏边框相对坐标原点的距离(像素点)。
总结:
想要写出好的程序,需要我们有扎实的基础,这样遇到一些基本算法的时候可能就会游刃有余了。
在编程是我们要有丰富的想象力。
不要拘泥于固定的思维方式,遇到问题的时候要多想几种解决问题的方案,试试别人从没想过的方法。
丰富的想象力是建立在丰富的知识的基础上,所以我们要通过多的途径来帮助自己建立较丰富的知识结构。
在编程时我们会碰到了很多的困难,这就需要我们多与别人交流。
三人行必有我师,也许在一次和别人不经意的谈话中,就可以迸出灵感的火花。
在编程的过程中我们也看到了有良好的编程风格是十分重要的,至少在时间效率上就体现了这一点。
养成良好的习惯,代码的缩进编排,变量的命名规则要始终保持一致,这些都是提高我们编程的注意点。
还有在变成中最能体现简单的原则。
所以我们要思考讨论简单的程序,这样简单的方法更容易被人理解,更容易实现,也更容易维护。
遇到问题时要优先考虑最简单的方案,只有简单方案不能满足要求时再考虑复杂的方案。
附录
程序:
***************************************************************************
#include"
../ucos-ii/includes.h"
/*uC/OSinterface*/
#include"
../ucos-ii/add/osaddition.h"
../ucos-ii/add/Ustring.h"
../inc/drivers.h"
../inc/sys/lib.h"
../src/gui/gui.h"
#include<
string.h>
stdio.h>
#pragmaimport(__use_no_semihosting_swi)//ensurenofunctionsthatusesemihosting
///任务定义
//Main_Test_Task堆栈
voidMain_Task(void*Id);
//Main_Test_Task
//test_Test_Task堆栈
//Control_Task
/**************已经定义的OS任务*************
#defineSYS_Task_Prio1
#defineTouch_Screen_Task_Prio9
#defineKey_Scan_Task_Prio58
#defineLcd_Fresh
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 COS 系统 ARM9 硬件 平台 贪吃 语言 游戏 设计