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:
- 2:ce24c50fc0a6
- Parent:
- 1:47967167a3a6
- Child:
- 3:4bc4e762a906
--- a/main1.cpp Tue May 04 05:03:18 2021 +0000 +++ b/main1.cpp Tue May 04 09:02:33 2021 +0000 @@ -1,35 +1,24 @@ #include "mbed.h" #include "N5110.h" +#include "main.h" +#ifndef bullet_v #define bullet_v 3//炮弹的速度为坦克三倍 +#endif +#ifndef tank_num #define tank_num 4//坦克数量 -DigitalIn button_A(p29); -DigitalIn button_B(p28); -DigitalIn button_C(p27); -DigitalIn button_D(p26); +#endif -AnalogIn joy_v(p20); -AnalogIn joy_h(p19); -AnalogIn joy_button(p17); // could be DigitalIn, but use AnalogIn so pot can also be used +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 joy_button2(p17); // could be DigitalIn, but use AnalogIn so pot can also be used // JP1 must be in 2/3 position -N5110 lcd(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}, -};//模拟输入的指令,一共十组,每个指令数组分别对应上,下,左,右;上方坦克的指令 +N5110 lcd2(p8,p9,p10,p11,p13,p21); 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}, @@ -196,13 +185,6 @@ { 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}, @@ -210,55 +192,73 @@ { 0,0,0,0,0,0,0}, { 0,0,0,0,0,0,0}, };//炮弹 - +const int hp_ai[2][5][7] = {{ + { 0,1,1,0,0,0,0}, + { 1,1,1,1,0,0,0}, + { 0,1,1,1,0,0,0}, + { 1,0,1,1,0,0,1}, + { 1,1,0,1,0,1,1}, + },{ + { 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 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_scan(int map_adj[9][11]) //扫描地图函数 +void map_scan2(int map_adj[9][11]) //扫描地图函数 { int x = 0; int y = 0; //地图扫描坐标 - lcd.drawRect(0,0,84,1,FILL_BLACK); - lcd.drawRect(0,46,84,2,FILL_BLACK); - lcd.drawRect(0,0,3,48,FILL_BLACK); - lcd.drawRect(80,0,4,48,FILL_BLACK);//边框 + 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) { - lcd.drawSprite(x*7+3,y*5+1,5,7,(int *)wall); + lcd2.drawSprite(x*7+3,y*5+1,5,7,(int *)wall); } else if(map_adj[y][x]==2) { - lcd.drawSprite(x*7+3,y*5+1,5,7,(int *)bush); + lcd2.drawSprite(x*7+3,y*5+1,5,7,(int *)bush); } } } } -void hp_show(int hp1,int hp2) //显示血量函数 +void hp_show2(int hp[4],int level) //显示血量函数 { - int heart_num=0; + int heart_num; + int i; for (heart_num=0; heart_num<3; heart_num++) { - if(heart_num<hp1) { - lcd.drawSprite(4*7+heart_num*7+3,5*1+1,5,7,(int *)heart); + if(heart_num<hp[0]) { + lcd2.drawSprite(4*7+heart_num*7+3,5*1+1,5,7,(int *)hp_ai[0]); + for(i=1; i<tank_num-level; i++) { + if(heart_num<hp[i]) { + lcd2.drawSprite(4*7+(i-1)*7+3,7*5+1,5,7,(int *)hp_ai[hp[i]-1]); + } + } } - if(heart_num<hp2) { - lcd.drawSprite(4*7+heart_num*7+3,7*5+1,5,7,(int *)heart); - } + } } -void tank_show(int tank_state[4],int t[4][2]) //显示坦克函数 +void tank_show2(int tank_state[4],int t[4][2],int hp[4],int level) //显示坦克函数 { int i; - for(i=0; i<tank_num; i++) { - lcd.drawSprite(t[i][1]*7+3,t[i][0]*5+1,5,7,(int *)tank[i][tank_state[i]]); - + for(i=0; i<tank_num-level; i++) { + if(hp[i]!=0) { + lcd2.drawSprite(t[i][1]*7+3,t[i][0]*5+1,5,7,(int *)tank[i][tank_state[i]]); + } } } -int main() +int body(int level) { - // need to initialise the lcd first, do this once outside of the loop - lcd.init(); + // need to initialise the lcd2 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; @@ -278,15 +278,15 @@ 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 hp_set[tank_num]= {3,1,1,1}; //坦克血量预设 + int hp[tank_num]= {0,0,0,0}; //坦克血量 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++) { + for (k=0; k<tank_num-level; k++) { hp[k]=hp_set[k]; tank_state[k]=0; map_adj[t_start[k][0]][t_start[k][1]]=k+3; @@ -303,17 +303,19 @@ map_adj[j][i]=map[j][i]; } }//复制地图 - + shoot=0; + tank_count=0; while(1) { - lcd.clear(); - map_scan(map_adj);//地图显示 - hp_show(hp[0],hp[1]);//血量显示 - tank_show(tank_state,t);//坦克显示 + lcd2.clear(); + map_scan2(map_adj);//地图显示 + hp_show2(hp,level);//血量显示 + tank_show2(tank_state,t,hp,level);//坦克显示 + if(shoot==0) { - command[3] = button_A.read(); - command[0] = button_B.read(); - command[2] = button_C.read(); - command[1] = button_D.read(); //复制指令 + 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; @@ -323,8 +325,8 @@ bullet_cont=0; } - for(tank_count=0; tank_count<tank_num; tank_count++) { - if(tank_count!=0) { + for(tank_count=0; tank_count<tank_num-level; tank_count++) { + if(tank_count!=0&&hp[tank_count]!=0) { stop=0; t_pre[tank_count][0]=t[tank_count][0]; t_pre[tank_count][1]=t[tank_count][1]; @@ -345,8 +347,16 @@ 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; - //bullet_val[tank_count][bullet_cont]=1; //坦克发射炮弹技炮弹坐标方向计算 - } else { + bullet_val[tank_count][bullet_cont]=1; //坦克发射炮弹技炮弹坐标方向计算 + bullet_direct[tank_count][bullet_cont]=tank_state[tank_count]; + b[tank_count][bullet_cont][0]=t[tank_count][0]; + b[tank_count][bullet_cont][1]=t[tank_count][1]; + } else if(hp[tank_count]!=0&&tank_count==0) { + command[3]=(~command[0])&(~command[1])&(~command[2])&command[3]; + command[2]=(~command[0])&(~command[1])&command[2]; + command[1]=(~command[0])&command[1]; + command[0]=command[0]; + 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];//指令控制坦克 @@ -359,44 +369,49 @@ if(command[0]||command[1]||command[2]||command[3]) { tank_state[tank_count]=command[1]*1+command[2]*2+command[3]*3; } //坦克方向计算 - + if (joy_button2.read()==0) { + bullet_val[tank_count][bullet_cont]=1; //坦克发射炮弹技炮弹坐标方向计算 + bullet_direct[tank_count][bullet_cont]=tank_state[tank_count]; + b[tank_count][bullet_cont][0]=t[tank_count][0]; + b[tank_count][bullet_cont][1]=t[tank_count][1]; + } } - - bullet_direct[tank_count][bullet_cont]=tank_state[tank_count]; - if (joy_button.read()==0&&tank_count==1) { - bullet_val[tank_count][bullet_cont]=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]; + } } - for(tank_count=0; 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) { //炮弹无障碍飞行的情况 - lcd.drawSprite(b[tank_count][n][1]*7+3,b[tank_count][n][0]*5+1,5,7,(int *)bullet); - } else if (obj_kind==2) { //炮弹打到灌木的情况 - lcd.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; - lcd.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;//炮弹失效 - }*/ + for(tank_count=0; tank_count<tank_num-level; tank_count++) { //游戏里坦克依次进行运算 + if(hp[tank_count]!=0) { + 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==0)+(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&&hit) { //炮弹击杀坦克的情况 + 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;//炮弹失效 + if(hp[0]==0) { + return 0; + } else if((hp[1]+hp[2]+hp[3])==0) { + return 1; + } + } + } } } } @@ -404,16 +419,62 @@ if(shoot==bullet_v) { shoot=0; } - lcd.refresh(); // refresh the LCD so the pixels appear + lcd2.refresh(); // refresh the lcd2 so the pixels appear wait_ms(600/bullet_v); // 画面按炮弹移动s时间刷新,600为坦克移动时间 } } -void init_buttons() +void init_buttons2() { // PCB has external pull-down resistors so turn the internal ones off // (default for DigitalIn) - button_A.mode(PullNone); - button_B.mode(PullNone); - button_C.mode(PullNone); - button_D.mode(PullNone); + button_A2.mode(PullNone); + button_B2.mode(PullNone); + button_C2.mode(PullNone); + button_D2.mode(PullNone); +} +void main1() +{ + int result; + result=body(1); + if (result==0) { + lcd2.clear(); + lcd2.printString("Game Over", 15, 1); + lcd2.printString("You lose:", 17, 3); + lcd2.refresh(); + wait(1); + while(1) { + if (button_A2.read() == 1) { + main(); + } + } + } else if (result==1) { + lcd2.clear(); + lcd2.printString("Level 1: win", 10, 1); + lcd2.printString("A:Next level", 10, 3); + lcd2.refresh(); + wait(1); + while(1) { + if (button_A2.read() == 1) { + result=body(0); + if(result==0) { + lcd2.clear(); + lcd2.printString("Game Over", 15, 1); + lcd2.printString("You lose:", 17, 3); + lcd2.refresh(); + } else if (result==1) { + lcd2.clear(); + lcd2.printString("You win", 20, 1); + lcd2.printString("A:Menu", 25, 3); + lcd2.refresh(); + + } + wait(1); + while(1) { + if (button_A2.read() == 1) { + main(); + } + } + } + } + } } \ No newline at end of file