ARM7 坦克大战实验报告 嵌入式_第1页
ARM7 坦克大战实验报告 嵌入式_第2页
ARM7 坦克大战实验报告 嵌入式_第3页
ARM7 坦克大战实验报告 嵌入式_第4页
ARM7 坦克大战实验报告 嵌入式_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

1、嵌入式课程设计实验报告 -坦克大战学 院: 信息电子学院 班 级: 07电信实验班 组 员: 铁舰 电子工程师指导老师: 日 期: 2012年12月20日 目录一、实验目的3二、游戏内容简介3三、原理分析与代码3四、游戏结果17五、改进预想方案17六、收获与体会18一、 实验目的1、通过本次实验熟练掌握嵌入式开发板的应用;2、通过开发小游戏提高编程能力,培养严谨的编程思维;二、 游戏内容简介 本游戏初始画面为一片草地,中间隔着一条河流,河的两边各一辆坦克,左边坦克为我方,右边为敌方,坦克上方各显示五滴血量,屏幕左上角显示坦克炮筒的调整角度。进入界面即可开始游戏。游戏采取回合制。每一回合均由我方

2、坦克先进行攻击,攻击前可移动坦克位置并调整炮筒角度,如果击中敌方坦克即消耗其一滴血量,然后无论击中与否,敌方坦克将随机移动至另一位置并且攻击我方坦克一次,如若击中消耗我方坦克一滴血量,然后无论击中与否此回合将结束。下一回合与之类似。如此下去,看哪方坦克血量先被扣完,如果我方胜利,则将出现“WIN”界面,将发射键可继续玩;如果敌方胜利,则屏幕将花屏,同样按发射键可重玩。数字键和可移动坦克,和可调整坦克炮筒角度,enter为发射键。三、 原理分析与代码本次设计包括三个模块,分别为游戏界面初始化模块,游戏模块,及游戏结束显示模块。主程序流程图如下图所示:其中,游戏模块playgame流程框图如下图所

3、示:程序源码如下:#define arm#define debug#ifdef arm#include "44b.h"#include"uhal.h"#include "option.h"#include"def.h"#include "Zlg7289.h"#include"keyboard.h"#pragma import(_use_no_semihosting_swi)#endif/-extern int Zlg7289SIOBand;extern int Zlg7289

4、SIOCtrl;#define XY_NUMBER 30#define MAN 1#define COMPUTER 2#define MAN_START_POS 0#define COMPUTER_START_POS 180double c;#define backcolor 0x00e0e0e0#define tankcolor 0x000000e0#define hitcolor 0x00000000#define landcolor 0x00e000#define rivercolor 0x00e00000int our_route_xXY_NUMBER,our_route_yXY_NU

5、MBER;int c_route_xXY_NUMBER,c_route_yXY_NUMBER;int key,last_alpha;int new_alpha,last_me_pos,new_me_pos,computer_pos,last_computer_pos;int my_tank4040,computer_tank4040;/store tank imageint alpha_image4040;int man_hp,computer_hp;extern U32 LCDBuffer240320 ;/-/function definevoid play_game(void);U32 g

6、et_key(void); / get keyvoid initial(void); /initial environment and tankint fight(void);/environment void paint_environment(void); /paint the environment/tankvoid refresh_tank(int flag);void paint_tank(int pos,int flag); /paint tank,flag = 2,computer,flag = 1,mevoid clear_tank(int pos,int flag); /pa

7、int tank with backcolor/hitsvoid calc_route(int alpha,int flag);/ calc the route with alphavoid paint_me_route(void);/show our hits with our_route_x,our_route_yvoid clear_me_route(void);/clear routevoid show_com_route(void);/show computer hits with c_route_x,c_route_yvoid clear_com_route(void);/clea

8、r routevoid show_hp(int,int);/alphavoid refresh_alpha(void);/refresh alpha/void clear_alpha(int last_alpha);void paint_alpha(int new_alpha);/key/-U32 get_key()U32 key; key=GetKey(); /得到按键值Delay(1);ZLG7289_ENABLE(); /使zlg7289占有同步串口Delay(5); /延时Delay(1); /延时ZLG7289_DISABLE(); /zlg7289放弃同步串口控制权return k

9、ey; void show_hp(int man_hp,int computer_hp)int i,j;for(i=20;i<30;i+)for(j=60;j<360;j+)LCDBufferij = backcolor;for(i = 20;i<30;i+)for(j=60;j<=60+16*man_hp;j+)if(LCDBufferij != tankcolor)LCDBufferij = tankcolor;if(j-60)%16=0)LCDBufferij = backcolor;for(j=260;j>=260-16*computer_hp;j-)if

10、(LCDBufferij != tankcolor)LCDBufferij = tankcolor;if(j-260)%16=0)LCDBufferij = backcolor;LCD_Refresh();void paint_environment(void)int i,j;for(i=0;i<240;i+)for(j=0;j<320;j+)if(i>=220)if(j>140&&j<180)LCDBufferij = rivercolor;elseLCDBufferij = landcolor; elseLCDBufferij = backco

11、lor;LCD_Refresh();void calc_route(int calpha,int flag)double vx,vy,t;int i,start_v,cc;double xx;if(MAN = flag)start_v = 30;vx = start_v*calpha/90 ;vx = vx/2;for(i=0;i<30;i+) /man routeour_route_yi = vx*i+50+new_me_pos;if(i>14)our_route_xi = (i-14)*240/15;if(our_route_xi>200)our_route_xi = 2

12、00;else; elseour_route_xi = 200-i*240/15;else /computer routestart_v = 30;vx = start_v*(rand()%5+3)/9-10;vx = vx/2;for(i=0;i<30;i+)cc =-vx*i+computer_pos;if(cc<0|cc>computer_pos)c_route_yi = 320;c_route_xi = 0;continue;c_route_yi = -vx*i+computer_pos;if(i>14)c_route_xi = (i-14)*240/15;if

13、(c_route_xi>200)c_route_xi = 200; elsec_route_xi = 200-i*240/15;void paint_me_route(void)int i,x,y;for(i = 0;i<30;i+)for(x=our_route_xi;x<our_route_xi+5;x+)for(y=our_route_yi;y<our_route_yi+5;y+)if(LCDBufferxy != tankcolor)if(x<220&&y<320&&x>20)LCDBufferxy = hitc

14、olor;LCD_Refresh();void clear_me_route(void)int i,x,y;for(i = 0;i<30;i+)for(x=our_route_xi;x<our_route_xi+5;x+)for(y=our_route_yi;y<our_route_yi+5;y+)if(LCDBufferxy != tankcolor)if(x<220&&y<320)LCDBufferxy = backcolor;LCD_Refresh();void show_com_route(void)int i,x,y;for(i = 0;

15、i<30;i+)for(x=c_route_xi;x<c_route_xi+5;x+)for(y=c_route_yi;y<c_route_yi+5;y+)if(LCDBufferxy != tankcolor)if(x<220&&y<320&&x>20)LCDBufferxy = hitcolor;LCD_Refresh();void clear_com_route(void)/clear routeint i,x,y;for(i = 0;i<30;i+)for(x=c_route_xi;x<c_route_xi

16、+5;x+)for(y=c_route_yi;y<c_route_yi+5;y+)if(LCDBufferxy != tankcolor)if(x<220&&y<320)LCDBufferxy = backcolor;LCD_Refresh();void show_win(void)int i,j;for(i=0;i<240;i+)for(j=0;j<320;j+)LCDBufferij = backcolor;for(i=120;i<180;i+)LCDBufferi60 = landcolor;LCDBufferi90 = landcol

17、or;LCDBufferi120 = landcolor;LCDBufferi150 =landcolor;LCDBufferi180 =landcolor;LCDBufferi240 =landcolor;for(j=60;j<120;j+)LCDBuffer180j =landcolor;for(j=140;j<160;j+)LCDBuffer180j =landcolor;LCDBuffer120j =landcolor;for(j=180;j<240;j+)LCDBuffer120j =landcolor;LCD_Refresh();void show_lose(vo

18、id)int i,j;for(i=0;i<240;i+)for(j=0;j<320;j+)LCDBufferij = tankcolor;LCD_Refresh();void Judge(int flag)int i;for(i=0;i<30;i+)if(1 = flag )if(our_route_yi<=(computer_pos+40)&&(our_route_yi>=computer_pos)if(our_route_xi<=240&&(our_route_xi>=180)if(computer_hp != 0)

19、computer_hp =computer_hp -1;show_hp(man_hp,computer_hp);return;elseif(c_route_yi<=(new_me_pos+40)&&(c_route_yi>=new_me_pos)if(c_route_xi<=240&&(c_route_xi>=200)if(man_hp != 0)man_hp =man_hp -1;show_hp(man_hp,computer_hp);return;int fight(void)int ccc;calc_route(new_alpha,

20、MAN);paint_me_route();clear_me_route();LCD_Refresh(); Judge(MAN);if(computer_hp = 0)show_win();return 1;last_computer_pos =computer_pos;ccc=rand()%4;computer_pos = 180+30*ccc;refresh_tank(COMPUTER);calc_route(new_alpha,COMPUTER);show_com_route();clear_com_route();Judge(COMPUTER);if(man_hp = 0)show_l

21、ose();return 1;return 0;void refresh_tank(int flag)if(1 = flag) /refresh man tankclear_tank(last_me_pos,MAN);paint_tank(new_me_pos,MAN);else if(2 = flag) /refresh computer tankclear_tank(last_computer_pos,COMPUTER);paint_tank(computer_pos,COMPUTER);LCD_Refresh();void clear_tank(int pos,int flag)int

22、i,j,x,y;for(i = 0;i<40;i+)for(j = 0;j<40;j+)x =180 +i;y = pos + j;LCDBufferxy = backcolor;void paint_tank(int pos,int flag)int i,j,x,y;for(i = 0;i < 40;i+)for(j = 0;j < 40;j+)x =180+i;y =pos +j;if(1=flag)LCDBufferxy =my_tankij;else if(2=flag)LCDBufferxy =computer_tankij;void paint_alpha(

23、int new_alpha)int i,j;for(i = 0;i<40;i+)for(j = 0;j<40;j+)LCDBufferij = alpha_imageij;void refresh_alpha(void)int i,j;double c6 =0.57,0.83,1.20,1.73,2.74,5.67;/clear_alpha(last_alpha);for(i = 0;i<40;i+)for(j = 0;j<40;j+)if(j > (int)(40-i)*c(new_alpha-30)/10)-5)&(j < (int)(40-i)

24、*c(new_alpha-30)/10)+5)alpha_imageij = tankcolor;elsealpha_imageij = backcolor;paint_alpha(new_alpha);LCD_Refresh();void initial(void)int i,j;#ifndef debugARMTargetInit(); /开发版初始化LCD_Init(); /LCD初始化Zlg7289_Reset(); #endifpaint_environment();paint_tank(MAN_START_POS,MAN);/paint_our_tankpaint_tank(COM

25、PUTER_START_POS,COMPUTER);/paint_computer_tankLCD_Refresh();last_alpha = new_alpha = 40;last_me_pos = new_me_pos = MAN_START_POS;last_computer_pos = computer_pos = 180;man_hp = 5;computer_hp =5;show_hp(man_hp,computer_hp);for(i=0;i<40;i+)for(j=0;j<40;j+)my_tankij =backcolor;computer_tankij =ba

26、ckcolor;for(i= 10;i<20;i+)for(j=10;j<30;j+)my_tankij = tankcolor;computer_tankij = tankcolor;for(i=20;i<40;i+)for(j=5;j<35;j+)my_tankij = tankcolor;computer_tankij = tankcolor;for(i=13;i<15;i+)for(j=30;j<37;j+)my_tankij = tankcolor;for(j=3;j<10;j+)computer_tankij =tankcolor;refr

27、esh_tank(MAN);refresh_tank(COMPUTER);void play_game(void)int alpha = last_alpha;int ret;initial();while(1)/man key = get_key();if(2 = key) /alpha+10last_alpha = alpha;alpha = alpha + 10;if(alpha >= 70) /max alpha = 70alpha = 70;new_alpha =alpha;else if(1 = key) /alpha -10last_alpha = alpha;alpha

28、= alpha -10;if(alpha <= 30) /min alpha = 30alpha = 30;new_alpha =alpha;else if(5 = key) /move tank rightlast_me_pos =new_me_pos;new_me_pos = last_me_pos + 10;if(new_me_pos >=105)/max pos 140new_me_pos = 105;else if(4 = key) /move tank leftlast_me_pos =new_me_pos;new_me_pos = last_me_pos - 10;i

29、f(new_me_pos <= 0) /min pos 0new_me_pos = 0;else if(3 = key) /fight ret = fight();if(ret)return ;if(1 = key) |(2 = key)refresh_alpha();if(4 = key)|(5 = key)refresh_tank(MAN);/main functionvoid main()while(1)play_game();while(1)key = get_key();if(key = 3)break;return ; /never return四、 游戏结果1、 游戏初始界面2、 游戏时界面 3、 我方胜利界面 4、 失败界面 五、 改进预想方案此游戏设计还有一些细节方面可以进行改进,归纳有如下几处:1、坦克炮筒角度的调整显示游戏现状:该游戏设置为左上角显示当前炮筒角度,但这样的界面效果并不是非常理想而且也影响游戏操作。改进方案:可以考虑将炮筒的角度调整直观的显示在坦克的炮筒上面,即坦克的炮筒随角度的调

温馨提示

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

评论

0/150

提交评论