ARM课程设计报告-基于ADuC7020ARM平台的贪吃蛇游戏的开发_第1页
ARM课程设计报告-基于ADuC7020ARM平台的贪吃蛇游戏的开发_第2页
ARM课程设计报告-基于ADuC7020ARM平台的贪吃蛇游戏的开发_第3页
ARM课程设计报告-基于ADuC7020ARM平台的贪吃蛇游戏的开发_第4页
ARM课程设计报告-基于ADuC7020ARM平台的贪吃蛇游戏的开发_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ARM系统设计实践课程报告题目:基于ADuC7020 ARM平台的贪吃蛇游戏的开发姓 名: 学 号: 完成时间: 191. 课程设计内容1.1设计任务 在LCD屏幕上模拟贪吃蛇游戏,基本功能为: 1)起初贪吃蛇的长度为3节,并根据预先设计好的方向行进,直到通过按键改变贪吃蛇的行进方向。 2)在实验开发平台上的LCD上绘制出贪吃蛇,并且在贪吃蛇的四周绘制出四面围墙,贪吃蛇在行进过程中不能碰到墙壁,碰到墙壁则游戏结束,并通过屏幕的闪烁来提醒用户游戏结束。用户可以根据按下Reset按键可以重新开始游戏。 3)贪吃蛇在行进过程中,由四个按键控制贪吃蛇的行进方向,即上下左右按键,同时按键与蜂鸣器相连接,当按键被确认按下时会发出滴的响声,提示用户按键已被按下。贪吃蛇的食物跟贪吃蛇的一节长度大小一样,并且随机产生在贪吃蛇规定的行进范围之内。贪吃蛇在行进过程中若遇到产生的食物会将食物吃掉,贪吃蛇便会长一节,然后继续行进。1.2开发平台 1)实验所需硬件:ADuC7020,PC机。 2)本次实验所需用到的硬件模块:LCD(用来显示蛇的移动以及吃食物、撞墙等过程);键盘(用来控制贪吃蛇的上下左右移动等功能)。2.设计思想2.1实现功能 1)显示开机界面和蛇的移动以及吃食物、撞墙等过程。 2)控制贪吃蛇的上下左右移动和游戏的重新开始功能。2.2设计内容 因为本次实验要使LCD显示,并通过键盘产生中断控制贪吃蛇的运动状态和速度,所以本次实验主要同到的.c文件主要是keyboard.c、lcd.c、8led.c和main.c,主要在这几个文件上进行编程。本次实验的关键是如何在LCD中显示蛇并且需要实现蛇的移动,以及蛇吃到食物之后如何实现蛇身增长一段以及如何用键盘产生中断控制蛇的移动方向.2.2.1游戏界面设计1)游戏边框绘制 将整个屏幕全部作为游戏界面,所以将点亮屏幕四条边的像素点。此时调用二维数组chDispRam实现点亮屏幕中四条边。具体通过以下程序实现。 2)游戏结束时界面显示 这里设计了新函数GameOver()来实现。GameOver()原型如下: 3)食物显示和贪吃蛇显示 为了在屏幕中显示贪吃蛇,首先需要在屏幕中确定蛇头的坐标,这样蛇身的坐标都可以通过蛇头的坐标推导出来,从而实现整个3段蛇身的显示。在点亮蛇头坐标的过程中,先设计了一个新函数Set_Display(),功能是只需要给出屏幕中某点的坐标和亮灭信号,就可以实现该点的点亮或者熄灭。Set_Display()原型如下:接下来调用Set_Display()实现贪吃蛇的蛇身显示。具体程序实现如下: 然后食物的显示,包括初始显示和随机产生食物,这里通过chDispRam和新函数Food()来完成。Food()函数通过把随机数赋给食物坐标来实现食物的随机显示。Food()原型如下: 2.2.2贪吃蛇行进和吃食物蛇身变长设计 游戏开始时,定义了新函数Move(),设置贪吃蛇从初始位置向右运动,在运动过程中等待按键,根据按键来决定下一步怎么行进。 按键控制的贪吃蛇行进可以有4种转向和4种直线运动方向。这里通过定义了4个新函数来实现,分别是UpMove(),DownMove(),LeftMove(),RightMove().这些函数中,首先控制贪吃蛇转向,等到转向完毕后,将按转向后的方向的直线行进,继续等待下一条按键指令。 贪吃蛇在行进过程中,每行进一步,都要检测蛇头坐标是否和食物坐标相同,如果相同,则在行进过程中蛇尾少熄灭一段,这样在效果上就变相的实现了蛇身的增长。在对比蛇头和食物坐标的过程中,定义了一个新函数Judge_Food()来实现。3程序流程图与主要函数说明3.1程序运行的主函数(void main):3.2 UpMove(),DownMove(),LeftMove(),RightMove()功能类似,下面以RightMove()为例介绍函数功能:4.测试效果与分析4.1初始界面测试 4.2功能测试4.2.1出现食物4.4.2出现蛇4.2.3蛇的移动界面 (a)左移 (b)右移 (c)上移 (d)下移4.3游戏结束界面 4.4结果说明 测试结果分为开机界面测试、贪吃蛇行进和吃食物的功能测试以及贪吃蛇撞墙后游戏结束闪烁界面测试。测试结果为:以上提及的功能均能正常工作,贪吃蛇在上下左右四个方向行进过程中和从四个方向去吃食物的过程中,均能流畅准确的完成,满足设计的要求。根据结果,程序仍有需要改进的地方,比如说贪吃蛇的行进速度,和贪吃蛇形状的设计,在此设计过程中,贪吃蛇的速度较为缓慢,为了改进这一状况,这是以后的工作重点。 5.收获与体会通过本次课程设计,我受益匪浅,收获很多。从一开始的迷茫,到后来的逐渐清晰,自己对本次设计的框架和思想有了更加深刻的理解,对于ARM的硬件结构有了一个全新的认识。在本次设计过程中,自己遇到了很多的困难,对很多函数的使用也不了解,但是通过与同学交流并查看相关资料,经过多次尝试,我解决了这些问题,每一次问题的解决都是对自己能力的提升和锻炼。书本上的知识毕竟只是理论,要与实践结合起来,这样才能更好的学习,希望以后能有更多这样的机会,感谢老师的指导与付出。附录:/ 设置屏幕上某点的亮灭函数/void Set_Display(uint8 x,uint8 y,uint8 k)/设置(y,x)点的亮(1)或者灭(0),显示屏上横为y,竖为x,函数这样和一般坐标系就一致 uint8 xx,jj,kk,tt; xx=x; kk=y/8; /在第几列 jj=y%8; /在该列的第几位 tt=0x01; if(k=1) if(jj!=0) tt=tt(8-jj);/找到相应的位置赋值 chDispRamxkk=chDispRamxkk| tt; else chDispRamxkk-1=chDispRamxkk-1| tt; else if(k=0) if(jj!=0) tt=tt(8-jj); /找到相应的位置赋值 chDispRam2xkk=chDispRamxkk&tt; return chDispRam2xkk; /游戏开始后贪吃蛇初始行进函数/void Move()/蛇初始运动方向为向右 while(1) Set_Display(SX,+SY,1);/蛇头向前一点 Judge_Food();/直线运动,判断食物 Set_Display(SX,SY-SL,0); /蛇尾灭一个点 switch( Key_Num ) /检测是否向上或者向下的按键 case KEY1:/键1表示向上 Key_Num = 0; UpMove(); break; case KEY2:/键2表示向下 Key_Num = 0; DownMove(); break; default: Key_Num = 0; break; /贪吃蛇向右转向函数/void RightMove()/向右运动 Judge_Direction(); sx=SX;sy=SY;sl=SL; if(JD=1) /向上运动时 JD=0; while(1) /正在向右转弯 if(sl!=0) Set_Display(SX,+SY,1); Set_Display(sx-(sl-1),sy,0); if(foodsignal=1)&(sl=2) /目的是在在转弯过程中,吃到食物,蛇长变长 SL=SL+1; sl=sl-2; else sl-; else break; else if(JD=2) /向下运动时 JD=0; while(1) /正在向右转弯 if(sl!=0) Set_Display(SX,+SY,1); Set_Display(sx+(sl-1),sy,0); if(foodsignal=1)&(sl=2) /目的是在在转弯过程中,吃到食物,蛇长变长 SL=SL+1; sl=sl-2; else sl-; else break; while(1)/转向完毕后直线行进 Set_Display(SX,+SY,1);/蛇头向前一点 Judge_Food();/直线运动,判断食物 Set_Display(SX,SY-SL,0); /蛇尾灭一个点 switch( Key_Num ) /检测是否向上或者向下的按键 case KEY1:/键1表示向上 Key_Num = 0; UpMove(); break; case KEY2:/键2表示向下 Key_Num = 0; DownMove(); break; default: Key_Num = 0; break; /贪吃蛇向上转向函数/void UpMove() Judge_Direction();sx=SX;sy=SY;sl=SL; if(JD=3) /向左运动时 JD=0; while(1) /正在向上转弯 if(sl!=0) Set_Display(+SX,SY,1); Set_Display(sx,sy-(sl-1),0); if(foodsignal=1)&(sl=2) /目的是在在转弯过程中,吃到食物,蛇长变长 SL=SL+1; sl=sl-2; else sl-; else break; else if(JD=4) /向右运动时 JD=0; while(1) /正在向上转弯 if(sl!=0) Set_Display(+SX,SY,1); Judge_Wall(); Set_Display(sx,sy-(sl-1),0); if(foodsignal=1)&(sl=2) /目的是在在转弯过程中,吃到食物,蛇长变长 SL=SL+1; sl=sl-2; else sl-; else break; while(1) /转向完毕后直线行进 Set_Display(+SX,SY,1); /蛇头向前一点 Judge_Wall(); Judge_Food(); /直线运动,判断食物 Set_Display(SX-SL,SY,0); /蛇尾灭一个点 switch( Key_Num ) /检测是否向左或者向右的按键 case KEY3: /键3表示向左 Key_Num = 0; LeftMove(); break; case KEY4: /键4表示向右 Key_Num = 0; RightMove(); break; default: Key_Num = 0; break; /贪吃蛇向左转向函数/void LeftMove() Judge_Direction();sx=SX;sy=SY;sl=SL; if(JD=1) /向上运动时 JD=0; while(1) /正在向左转弯 if(sl!=0) Set_Display(SX,-SY,1); Set_Display(sx-(sl-1),sy,0); /运动时蛇头坐标再变化 if(foodsignal=1)&(sl=2) /目的是在在转弯过程中,吃到食物,蛇长变长 SL=SL+1; sl=sl-2; else sl-; else break; else if(JD=2) /向下运动时 JD=0; while(1) /正在向左转弯 if(sl!=0) Set_Display(SX,-SY,1); Set_Display(sx+(sl-1),sy,0); if(foodsignal=1)&(sl=2) /目的是在在转弯过程中,吃到食物,蛇长变长 SL=SL+1; sl=sl-2; else sl-; else break; while(1) /转向完毕后直线行进 Set_Display(SX,-SY,1); /蛇头向前一点 Judge_Food(); /直线运动,判断食物 Set_Display(SX,SY+SL,0); /蛇尾灭一个点 switch( Key_Num ) /检测是否向上或者向下的按键 case KEY1: /键1表示向上 Key_Num = 0; UpMove(); break; case KEY2: /键2表示向下 Key_Num = 0; DownMove(); break; default: Key_Num = 0; break; /贪吃蛇向下转向函数/void DownMove() Judge_Direction();sx=SX;sy=SY;sl=SL; if(JD=3) /向左运动时 JD=0; while(1) /正在向下转弯 if(sl!=0) Set_Display(-SX,SY,1); Set_Display(sx,sy+(sl-1),0); if(foodsignal=1)&(sl=2) /目的是在在转弯过程中,吃到食物,蛇长变长 SL=SL+1; sl=sl-2; else sl-; else break; else if(JD=4) /向右运动时 JD=0; while(1) /正在向下转弯 if(sl!=0) Set_Display(-SX,SY,1); Set_Display(sx,sy-(sl-1),0); if(foodsignal=1)&(sl=2) /目的是在在转弯过程中,吃到食物,蛇长变长 SL=SL+1; sl=sl-2; else sl-; else break; while(1) /转向完毕后直线行进 Set_Display(-SX,SY,1); /蛇头向前一点 Judge_Food(); /直线运动,判断食物 Set_Display(SX-SL,SY,0); /蛇尾灭一个点 switch( Key_Num ) /检测是否向左或者向右的按键 case KEY3: /键3表示向左 Key_Num = 0; LeftMove(); break; case KEY4: /键4表示向右 Key_Num = 0; RightMove(); break; default: Key_Num = 0; break; /判断贪吃蛇行进方向函数/void Judge_Direction()/运动方向判断,JD=1是向上,2是向下,3是向左,4是向右uint8 Test_Light(); if(chDispRam2SX+1SY=0) JD=1;if(chDispRam2SX-1SY=0) JD=2;if(chDispRam2SXSY-1=0) JD=3;if(chDispRam2SXSY+1=0) JD=4;/食物生成函数/void Food() /生成食物 foodx=rand(); /控制食物在一定范围内 foodx=foodx%35; foody=rand(); foody=foody%35; Set_Display(foodx,foody,1); /显示随机的到的食物/游戏结束显示/void GameOver()/游戏结束显示 LCD_clr();w_cd(0x38,0); display(2,2,5,Game Over);DELAY(3000000);/判断贪吃蛇是否撞墙/void Judge_Wall() /判断蛇是否 撞墙 if(SX=62|SX=1|SY=1|SY=127) / LCD_clr(); while(1) GameOver(); /直线行进时,判断是否有食物/void Judge_Food() /直线运动,判断食物 foodsignal=0; if(SX=foodx)&(SY=foody) Food(); +SL; /转向过程中,判断是否有食物/void Judge_Food_Turn() /转弯过程中,判断食物 foodsignal=0; if(SX=foodx)&(SY=foody) Food(); foodsignal=1; /主函数/void main () uint8 hanzi64 = 贪吃蛇;uint8 hanzi264 = ARM 课程设计;uint8 hanzi364 = 张广申;uint16 i = 0;sint8 j=0;uint16 ADCBuff, ADCTemp;SYS_Init();/initial();w_cd(0x38,0);Write_CH452_comd( CH452_SYSON2W );/Write_CH452_comd(CH452_NO_BCD); / 不译码,8个数码管for( i = 0; i 3; i+) display

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论