Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: main1.cpp
- Revision:
- 0:a9ef8a5c769a
- Child:
- 1:47967167a3a6
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main1.cpp Mon May 03 08:36:29 2021 +0000 @@ -0,0 +1,420 @@ +#include "mbed.h" +#include "N5110.h" +#include "main1.h" +#include "main.h" +#define bullet_v 3//炮弹的速度为坦克三倍 +#define tank_num 4//坦克数量 + +DigitalIn button_A2(p29); +DigitalIn button_B2(p28); +DigitalIn button_C2(p27); +DigitalIn button_D2(p26); +AnalogIn joy_v2(p20); +AnalogIn joy_h2(p19); +AnalogIn pot02(p20); +AnalogIn joy_button2(p17); // could be DigitalIn, but use AnalogIn so pot can also be used +Ticker ticker2; +// JP1 must be in 2/3 position +N5110 lcd2(p8,p9,p10,p11,p13,p21); + +const int command[15][4]={ + { 0,0,0,1}, + { 0,0,0,1}, + { 0,0,0,1}, + { 0,0,0,1}, + { 0,1,0,0}, + { 0,1,0,0}, + { 0,1,0,0}, + { 0,0,0,1}, + { 0,0,0,1}, + { 1,0,0,0}, + { 1,0,0,0}, + { 1,0,0,0}, + { 0,0,1,0}, + { 0,0,1,0}, + { 0,0,1,0}, + };//模拟输入的指令,一共十组,每个指令数组分别对应上,下,左,右;上方坦克的指令 +const int map[9][11] = { + { 0,0,0,0,0,0,0,0,0,0,0}, + { 0,1,0,2,1,1,1,2,0,1,0}, + { 0,1,0,2,0,1,0,2,0,1,0}, + { 0,0,0,0,0,0,0,0,0,0,0}, + { 2,2,0,1,2,2,2,1,0,2,2}, + { 0,0,0,0,0,0,0,0,0,0,0}, + { 0,1,0,2,0,1,0,2,0,1,0}, + { 0,1,0,2,1,1,1,2,0,1,0}, + { 0,0,0,0,0,0,0,0,0,0,0}, +};//9*11大小的地图,1是墙,2是灌木 +const int wall[5][7] = { + { 1,1,1,1,1,1,1}, + { 1,1,0,0,0,1,1}, + { 1,1,0,0,0,1,1}, + { 1,1,0,0,0,1,1}, + { 1,1,1,1,1,1,1}, +};//5*7的墙,不可破坏 +const int bush[5][7] = { + { 1,0,1,0,1,0,1}, + { 0,1,0,1,0,1,0}, + { 1,0,1,0,1,0,1}, + { 0,1,0,1,0,1,0}, + { 1,0,1,0,1,0,1}, + +};//5*7的g灌木,可破坏 +const int destroyed_bush[5][7] = { + { 1,0,0,1,0,0,1}, + { 0,0,1,0,0,1,0}, + { 0,1,0,0,1,0,0}, + { 1,0,0,1,0,0,1}, + { 0,0,1,0,0,1,0}, + +};//被击中的灌木 +const int tank[tank_num][4][5][7] = +{ + { + { + { 0,1,0,1,0,1,0}, + { 0,1,1,1,1,1,0}, + { 0,1,1,0,1,1,0}, + { 0,1,1,0,1,1,0}, + { 0,1,0,0,0,1,0} + }, + { + { 0,1,0,0,0,1,0}, + { 0,1,1,0,1,1,0}, + { 0,1,1,0,1,1,0}, + { 0,1,1,1,1,1,0}, + { 0,1,0,1,0,1,0} + }, + { + { 0,1,1,1,1,1,0}, + { 0,0,1,1,1,0,0}, + { 0,1,1,0,0,0,0}, + { 0,0,1,1,1,0,0}, + { 0,1,1,1,1,1,0}}, + { + { 0,1,1,1,1,1,0}, + { 0,0,1,1,1,0,0}, + { 0,0,0,0,1,1,0}, + { 0,0,1,1,1,0,0}, + { 0,1,1,1,1,1,0} + } + },//tank1 + { + { + { 0,1,0,1,0,1,0}, + { 0,1,0,1,0,1,0}, + { 0,1,1,1,1,1,0}, + { 0,1,1,0,0,1,0}, + { 0,1,0,0,0,1,0} + + }, + { + { 0,1,0,0,0,1,0}, + { 0,1,0,0,1,1,0}, + { 0,1,1,1,1,1,0}, + { 0,1,0,1,0,1,0}, + { 0,1,0,1,0,1,0} + }, + { + { 0,1,1,1,1,1,0}, + { 0,0,0,1,0,0,0}, + { 0,1,1,1,0,0,0}, + { 0,0,0,1,1,0,0}, + { 0,1,1,1,1,1,0} + }, + { + { 0,1,1,1,1,1,0}, + { 0,0,1,1,0,0,0}, + { 0,0,0,1,1,1,0}, + { 0,0,0,1,0,0,0}, + { 0,1,1,1,1,1,0} + } + },//tank2 + { + { + { 0,1,0,1,0,1,0}, + { 0,1,0,1,0,1,0}, + { 0,1,1,1,1,1,0}, + { 0,1,0,1,0,1,0}, + { 0,1,0,0,0,1,0} + + }, + { + { 0,1,0,0,0,1,0}, + { 0,1,0,1,0,1,0}, + { 0,1,1,1,1,1,0}, + { 0,1,0,1,0,1,0}, + { 0,1,0,1,0,1,0} + }, + { + { 0,1,1,1,1,1,0}, + { 0,0,0,1,0,0,0}, + { 0,1,1,1,1,0,0}, + { 0,0,0,1,0,0,0}, + { 0,1,1,1,1,1,0} + }, + { + { 0,1,1,1,1,1,0}, + { 0,0,0,1,0,0,0}, + { 0,0,1,1,1,1,0}, + { 0,0,0,1,0,0,0}, + { 0,1,1,1,1,1,0} + } + }, //tank3 + { + { + { 0,1,0,1,0,1,0}, + { 0,1,0,1,0,1,0}, + { 0,1,1,1,1,1,0}, + { 0,1,0,0,1,1,0}, + { 0,1,0,0,0,1,0} + + }, + { + { 0,1,0,0,0,1,0}, + { 0,1,1,0,0,1,0}, + { 0,1,1,1,1,1,0}, + { 0,1,0,1,0,1,0}, + { 0,1,0,1,0,1,0} + }, + { + { 0,1,1,1,1,1,0}, + { 0,0,0,1,1,0,0}, + { 0,1,1,1,0,0,0}, + { 0,0,0,1,0,0,0}, + { 0,1,1,1,1,1,0} + }, + { + { 0,1,1,1,1,1,0}, + { 0,0,0,1,0,0,0}, + { 0,0,0,1,1,1,0}, + { 0,0,1,1,0,0,0}, + { 0,1,1,1,1,1,0} + } + }//tank4 +}; +const int tank_exp[5][7] = { + { 0,1,0,1,0,1,0}, + { 0,0,1,0,1,0,0}, + { 1,1,0,0,0,1,1}, + { 0,0,1,0,1,0,0}, + { 0,1,0,1,0,1,0}, +};//击毁的坦克 +const int heart[5][7] = { + { 0,1,1,0,1,1,0}, + { 1,1,1,1,1,1,1}, + { 0,1,1,1,1,1,0}, + { 1,0,1,1,1,0,1}, + { 1,1,0,1,0,1,1}, +};//血量的心形 +const int bullet[5][7] = { + { 0,0,0,0,0,0,0}, + { 0,0,1,1,0,0,0}, + { 0,0,1,1,0,0,0}, + { 0,0,0,0,0,0,0}, + { 0,0,0,0,0,0,0}, +};//炮弹 + +const int t_start[tank_num][2] = {{0,5},{8,1},{8,5},{8,9}}; //坦克初始坐标 +const int ai_mod[3]={0,1,0}; +const int ai_changetime[3]={6,8,5}; +void map_scan2(int map_adj[9][11]){//扫描地图函数 + int x = 0; + int y = 0; //地图扫描坐标 + lcd2.drawRect(0,0,84,1,FILL_BLACK); + lcd2.drawRect(0,46,84,2,FILL_BLACK); + lcd2.drawRect(0,0,3,48,FILL_BLACK); + lcd2.drawRect(80,0,4,48,FILL_BLACK);//边框 + + for (x=0;x<11;x++){ + for (y=0;y<9;y++){ + if(map_adj[y][x]==1){ + lcd2.drawSprite(x*7+3,y*5+1,5,7,(int *)wall); + } + else if(map_adj[y][x]==2){ + lcd2.drawSprite(x*7+3,y*5+1,5,7,(int *)bush); + } + } + } + } + +void hp_show2(int hp1,int hp2){//显示血量函数 + int heart_num=0; + for (heart_num=0;heart_num<3;heart_num++){ + if(heart_num<hp1){ + lcd2.drawSprite(4*7+heart_num*7+3,5*1+1,5,7,(int *)heart); + } + if(heart_num<hp2){ + lcd2.drawSprite(4*7+heart_num*7+3,7*5+1,5,7,(int *)heart); + } + } + } + +void tank_show2(int tank_state[4],int t[4][2]){//显示坦克函数 + int i; + for(i=0;i<tank_num;i++){ + lcd2.drawSprite(t[i][1]*7+3,t[i][0]*5+1,5,7,(int *)tank[i][tank_state[i]]); + + } + } +void main1() +{ + // need to initialise the lcd first, do this once outside of the loop + lcd2.init(); + //int command[2][4]={{0,0,0,0},{0,0,0,0}};//处理后的指令 + int command[4]= {0,0,0,0}; + int turn=0; + int a; + int stop;//stop command for ai + int i; + int j; //地图复制计数 + int ii; + int k; + int l; + int n; //炮弹刷新计数 + int shoot;//开火计数 + int t[tank_num][2]; //坦克坐标 + int t_pre[tank_num][2]; //坦克预测坐标(npc) + int b[tank_num][3][2]; //炮弹坐标 + int bullet_cont=0;//发射炮弹计数 + int bullet_direct[tank_num][3];//炮弹的方向 + int bullet_val[tank_num][3];//炮弹是否被阻挡 + int tank_state[tank_num]; //坦克的f方向 + int hp_set[tank_num]={3,3,3,3}; //坦克血量预设 + int hp[tank_num]; //坦克血量 + int tank_count;//坦克单位的计数 + int trace[tank_num-1][3]={{0,0,0},{0,0,0},{0,0,0}}; + int map_adj[9][11]; + int tank_des;//serial number of destoried tank destroy + int hit; + int obj_kind; + for (k=0;k<tank_num;k++){ + hp[k]=hp_set[k]; + tank_state[k]=0; + map_adj[t_start[k][0]][t_start[k][1]]=k+3; + for (l=0;l<bullet_v;l++){ + bullet_val[k][l]=0; + } + for (ii=0;ii<2;ii++){ + t[k][ii]=t_start[k][ii]; + } //复制坦克坐标 + } + + for (i=0;i<11;i++){ + for (j=0;j<9;j++){ + map_adj[j][i]=map[j][i]; + } + }//复制地图 + + while(1) { + lcd2.clear(); + map_scan2(map_adj);//地图显示 + hp_show2(hp[0],hp[1]);//血量显示 + tank_show2(tank_state,t);//坦克显示 + if(shoot==0){ + command[3] = button_A2.read(); + command[0] = button_B2.read(); + command[2] = button_C2.read(); + command[1] = button_D2.read(); //复制指令 + turn=turn+1; + if(turn==15){ + turn=0; + }//各种计数 + bullet_cont++; + if(bullet_cont==3){ + bullet_cont=0; + } + + for(tank_count=0;tank_count<tank_num;tank_count++) { + if(tank_count!=0){ + stop=0; + t_pre[tank_count][0]=t[tank_count][0]; + t_pre[tank_count][1]=t[tank_count][1]; + trace[tank_count][0]=(ai_changetime[tank_count-1]<turn)^ai_mod[tank_count-1]^(t[tank_count][0]>t[0][0]);//1代表坦克1在坦克2的下方 + trace[tank_count][1]=(ai_changetime[tank_count-1]<turn)^ai_mod[tank_count-1]^(t[tank_count][1]>t[0][1]);//1代表坦克1在坦克2的右 + trace[tank_count][2]=(abs(t[0][0]-t[tank_count][0]))>(abs(t[0][1]-t[tank_count][1]));//1代表坦克竖直距离大于水平距离 + for(a=0;a<4;a++){ + tank_state[tank_count]=2*(!((a%2)^trace[tank_count][2]))+(!((a>>1)^trace[tank_count][0]))*((a%2)^trace[tank_count][2])+(!((a>>1)^trace[tank_count][1]))*(!((a%2)^trace[tank_count][2])); + t_pre[tank_count][0]=t[tank_count][0]+(!(tank_state[tank_count]>>1))*(2*(tank_state[tank_count]%2)-1); + t_pre[tank_count][1]=t[tank_count][1]+(tank_state[tank_count]>>1)*(2*(tank_state[tank_count]%2)-1); + if((map_adj[t_pre[tank_count][0]][t_pre[tank_count][1]]==0)&&(t_pre[tank_count][1]>=0)&&(t_pre[tank_count][1]<=10)&&(t_pre[tank_count][0]>=0)&&(t_pre[tank_count][0]<=8)){ + break; + } + if(a==3) stop=1; + } + map_adj[t[tank_count][0]][t[tank_count][1]]=0; + if(stop==0){ + t[tank_count][tank_state[tank_count]>>1]=t[tank_count][tank_state[tank_count]>>1]+2*(tank_state[tank_count]%2)-1; + } + map_adj[t[tank_count][0]][t[tank_count][1]]=tank_count+3; + } + else{ + map_adj[t[tank_count][0]][t[tank_count][1]]=0; + t[tank_count][0]=t[tank_count][0]-command[0]+command[1]; + t[tank_count][1]=t[tank_count][1]-command[2]+command[3];//指令控制坦克 + + if(map_adj[t[tank_count][0]][t[tank_count][1]]!=0||t[tank_count][1]<0||t[tank_count][1]>10||t[tank_count][0]<0||t[tank_count][0]>8){ + t[tank_count][0]=t[tank_count][0]+command[0]-command[1]; + t[tank_count][1]=t[tank_count][1]+command[2]-command[3]; + }//障碍物判断,前方有障碍物时指令无效 + map_adj[t[tank_count][0]][t[tank_count][1]]=tank_count+3; + if(command[0]||command[1]||command[2]||command[3]){ + tank_state[tank_count]=command[1]*1+command[2]*2+command[3]*3; + } //坦克方向计算 + } + bullet_direct[tank_count][bullet_cont]=tank_state[tank_count]; + if (joy_button2.read()==0 && tank_count ==1 ){ + //pot_val = pot0.read(); + b[tank_count][bullet_cont][0]=t[tank_count][0]; + b[tank_count][bullet_cont][1]=t[tank_count][1];} + bullet_val[tank_count][bullet_cont]=1; //坦克发射炮弹技炮弹坐标方向计算 + } + } + for(tank_count=1;tank_count<tank_num;tank_count++) {//游戏里坦克依次进行运算 + for(n=0;n<bullet_v;n++){//炮弹比坦克快三倍运算也快三倍 + b[tank_count][n][0]=b[tank_count][n][0]+(!(bullet_direct[tank_count][n]>>1))*(-1+2*(bullet_direct[tank_count][n]%2)); + b[tank_count][n][1]=b[tank_count][n][1]+(bullet_direct[tank_count][n]>>1)*(-1+2*(bullet_direct[tank_count][n]%2));//炮弹坐标刷新 + if(b[tank_count][n][1]>=0&&b[tank_count][n][1]<=10&&b[tank_count][n][0]>=0&&b[tank_count][n][0]<=8&&bullet_val[tank_count][n]==1){ + //炮弹有效且未出界 + obj_kind=map_adj[b[tank_count][n][0]][b[tank_count][n][1]]; + hit=(((tank_count<4)+(obj_kind<4))%2)&(obj_kind>=3); + if(obj_kind==0){//炮弹无障碍飞行的情况 + lcd2.drawSprite(b[tank_count][n][1]*7+3,b[tank_count][n][0]*5+1,5,7,(int *)bullet); + } + else if (obj_kind==2){//炮弹打到灌木的情况 + lcd2.drawSprite(b[tank_count][n][1]*7+3,b[tank_count][n][0]*5+1,5,7,(int *)destroyed_bush); + map_adj[b[tank_count][n][0]][b[tank_count][n][1]]=0; + bullet_val[tank_count][n]=0; + } + else if (obj_kind==1){//炮弹打墙的情况 + bullet_val[tank_count][n]=0; + } + else if(obj_kind==3){//炮弹击杀坦克的情况 + tank_des=map_adj[b[tank_count][n][0]][b[tank_count][n][1]]-3; + map_adj[b[tank_count][n][0]][b[tank_count][n][1]]=0; + lcd2.drawSprite(t[tank_des][1]*7+3,t[tank_des][0]*5+1,5,7,(int *)tank_exp); + t[tank_des][0]=t_start[tank_des][0]; + t[tank_des][1]=t_start[tank_des][1];//坦克回出生点 + hp[tank_des]=hp[tank_des]-1;//血量减一 + bullet_val[tank_count][n]=0;//炮弹失效 + } + } + } + } + shoot=shoot+1; + if(shoot==bullet_v){ + shoot=0; + } + lcd2.refresh(); // refresh the LCD so the pixels appear + wait_ms(600/bullet_v); // 画面按炮弹移动s时间刷新,600为坦克移动时间 + } +} + void init_buttons2() + { + // PCB has external pull-down resistors so turn the internal ones off + // (default for DigitalIn) + button_A2.mode(PullNone); + button_B2.mode(PullNone); + button_C2.mode(PullNone); + button_D2.mode(PullNone); +} \ No newline at end of file