xuanyu an / Mbed 2 deprecated tankworld

Dependencies:   mbed N5110

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main3.cpp Source File

main3.cpp

00001 #include "mbed.h"
00002 #include "N5110.h"
00003 #include "main.h"
00004 #ifndef bullet_v
00005 #define bullet_v 3//炮弹的速度为坦克三倍
00006 #endif
00007 #ifndef tank_num
00008 #define tank_num 4//坦克数量
00009 #endif
00010 
00011 DigitalIn button_A3(p29);
00012 DigitalIn button_B3(p28);
00013 DigitalIn button_C3(p27);
00014 DigitalIn button_D3(p26);
00015 
00016 AnalogIn joy_button3(p17); // could be DigitalIn, but use AnalogIn so pot can also be used
00017 
00018 // JP1 must be in 2/3 position
00019 N5110 lcd3(p8,p9,p10,p11,p13,p21);
00020 const int map[9][11] =   {
00021     { 0,0,0,0,0,0,0,0,0,0,0},
00022     { 0,1,0,2,1,1,1,2,0,1,0},
00023     { 2,1,2,2,2,2,2,2,2,1,2},
00024     { 0,0,0,0,0,0,0,0,0,0,0},
00025     { 2,2,2,1,2,2,2,1,2,2,2},
00026     { 0,0,1,1,1,1,1,1,1,0,0},
00027     { 0,1,0,4,0,1,0,5,0,1,0},
00028     { 0,1,2,2,1,1,1,2,2,1,0},
00029     { 0,0,0,0,0,6,0,0,0,0,0},
00030 };//9*11大小的地图,1是墙,2是灌木
00031 const int wall[5][7] =   {
00032     { 1,1,1,1,1,1,1},
00033     { 1,1,0,0,0,1,1},
00034     { 1,1,0,0,0,1,1},
00035     { 1,1,0,0,0,1,1},
00036     { 1,1,1,1,1,1,1},
00037 };//5*7的墙,不可破坏
00038 const int bush[5][7] =   {
00039     { 1,0,1,0,1,0,1},
00040     { 0,1,0,1,0,1,0},
00041     { 1,0,1,0,1,0,1},
00042     { 0,1,0,1,0,1,0},
00043     { 1,0,1,0,1,0,1},
00044 
00045 };//5*7的g灌木,可破坏
00046 const int destroyed_bush[5][7] =   {
00047     { 1,0,0,1,0,0,1},
00048     { 0,0,1,0,0,1,0},
00049     { 0,1,0,0,1,0,0},
00050     { 1,0,0,1,0,0,1},
00051     { 0,0,1,0,0,1,0},
00052 
00053 };//被击中的灌木
00054 const int tank[tank_num][4][5][7] = {
00055     {
00056         {
00057             { 0,1,0,1,0,1,0},
00058             { 0,1,1,1,1,1,0},
00059             { 0,1,1,0,1,1,0},
00060             { 0,1,1,0,1,1,0},
00061             { 0,1,0,0,0,1,0}
00062         },
00063         {
00064             { 0,1,0,0,0,1,0},
00065             { 0,1,1,0,1,1,0},
00066             { 0,1,1,0,1,1,0},
00067             { 0,1,1,1,1,1,0},
00068             { 0,1,0,1,0,1,0}
00069         },
00070         {
00071             { 0,1,1,1,1,1,0},
00072             { 0,0,1,1,1,0,0},
00073             { 0,1,1,0,0,0,0},
00074             { 0,0,1,1,1,0,0},
00075             { 0,1,1,1,1,1,0}
00076         },
00077         {
00078             { 0,1,1,1,1,1,0},
00079             { 0,0,1,1,1,0,0},
00080             { 0,0,0,0,1,1,0},
00081             { 0,0,1,1,1,0,0},
00082             { 0,1,1,1,1,1,0}
00083         }
00084     },//tank1
00085     {
00086         {
00087             { 0,1,0,1,0,1,0},
00088             { 0,1,0,1,0,1,0},
00089             { 0,1,1,1,1,1,0},
00090             { 0,1,1,0,0,1,0},
00091             { 0,1,0,0,0,1,0}
00092 
00093         },
00094         {
00095             { 0,1,0,0,0,1,0},
00096             { 0,1,0,0,1,1,0},
00097             { 0,1,1,1,1,1,0},
00098             { 0,1,0,1,0,1,0},
00099             { 0,1,0,1,0,1,0}
00100         },
00101         {
00102             { 0,1,1,1,1,1,0},
00103             { 0,0,0,1,0,0,0},
00104             { 0,1,1,1,0,0,0},
00105             { 0,0,0,1,1,0,0},
00106             { 0,1,1,1,1,1,0}
00107         },
00108         {
00109             { 0,1,1,1,1,1,0},
00110             { 0,0,1,1,0,0,0},
00111             { 0,0,0,1,1,1,0},
00112             { 0,0,0,1,0,0,0},
00113             { 0,1,1,1,1,1,0}
00114         }
00115     },//tank2
00116     {
00117         {
00118             { 0,1,0,1,0,1,0},
00119             { 0,1,0,1,0,1,0},
00120             { 0,1,1,1,1,1,0},
00121             { 0,1,0,1,0,1,0},
00122             { 0,1,0,0,0,1,0}
00123 
00124         },
00125         {
00126             { 0,1,0,0,0,1,0},
00127             { 0,1,0,1,0,1,0},
00128             { 0,1,1,1,1,1,0},
00129             { 0,1,0,1,0,1,0},
00130             { 0,1,0,1,0,1,0}
00131         },
00132         {
00133             { 0,1,1,1,1,1,0},
00134             { 0,0,0,1,0,0,0},
00135             { 0,1,1,1,1,0,0},
00136             { 0,0,0,1,0,0,0},
00137             { 0,1,1,1,1,1,0}
00138         },
00139         {
00140             { 0,1,1,1,1,1,0},
00141             { 0,0,0,1,0,0,0},
00142             { 0,0,1,1,1,1,0},
00143             { 0,0,0,1,0,0,0},
00144             { 0,1,1,1,1,1,0}
00145         }
00146     }, //tank3
00147     {
00148         {
00149             { 0,1,0,1,0,1,0},
00150             { 0,1,0,1,0,1,0},
00151             { 0,1,1,1,1,1,0},
00152             { 0,1,0,0,1,1,0},
00153             { 0,1,0,0,0,1,0}
00154 
00155         },
00156         {
00157             { 0,1,0,0,0,1,0},
00158             { 0,1,1,0,0,1,0},
00159             { 0,1,1,1,1,1,0},
00160             { 0,1,0,1,0,1,0},
00161             { 0,1,0,1,0,1,0}
00162         },
00163         {
00164             { 0,1,1,1,1,1,0},
00165             { 0,0,0,1,1,0,0},
00166             { 0,1,1,1,0,0,0},
00167             { 0,0,0,1,0,0,0},
00168             { 0,1,1,1,1,1,0}
00169         },
00170         {
00171             { 0,1,1,1,1,1,0},
00172             { 0,0,0,1,0,0,0},
00173             { 0,0,0,1,1,1,0},
00174             { 0,0,1,1,0,0,0},
00175             { 0,1,1,1,1,1,0}
00176         }
00177     }//tank4
00178 };
00179 const int tank_exp[5][7] =   {
00180     { 0,1,0,1,0,1,0},
00181     { 0,0,1,0,1,0,0},
00182     { 1,1,0,0,0,1,1},
00183     { 0,0,1,0,1,0,0},
00184     { 0,1,0,1,0,1,0},
00185 };//击毁的坦克
00186 const int bullet[5][7] =   {
00187     { 0,0,0,0,0,0,0},
00188     { 0,0,1,1,0,0,0},
00189     { 0,0,1,1,0,0,0},
00190     { 0,0,0,0,0,0,0},
00191     { 0,0,0,0,0,0,0},
00192 };//炮弹
00193 const int hp_ai[5][7] =   {
00194     { 0,1,1,0,1,1,0},
00195     { 1,1,1,1,1,1,1},
00196     { 0,1,1,1,1,1,0},
00197     { 1,0,1,1,1,0,1},
00198     { 1,1,0,1,0,1,1},
00199 };//炮弹
00200 const int t_start[tank_num][2] = {{0,5},{6,3},{6,7},{8,5}}; //坦克初始坐标
00201 void map_scan3(int map_adj[9][11]) //扫描地图函数
00202 {
00203     int x = 0;
00204     int y = 0; //地图扫描坐标
00205     lcd3.drawRect(0,0,84,1,FILL_BLACK);
00206     lcd3.drawRect(0,46,84,2,FILL_BLACK);
00207     lcd3.drawRect(0,0,3,48,FILL_BLACK);
00208     lcd3.drawRect(80,0,4,48,FILL_BLACK);//边框
00209 
00210     for (x=0; x<11; x++) {
00211         for (y=0; y<9; y++) {
00212             if(map_adj[y][x]==1) {
00213                 lcd3.drawSprite(x*7+3,y*5+1,5,7,(int *)wall);
00214             } else if(map_adj[y][x]==2) {
00215                 lcd3.drawSprite(x*7+3,y*5+1,5,7,(int *)bush);
00216             }
00217         }
00218     }
00219 }
00220 
00221 void hp_show3(int hp[4])  //显示血量函数
00222 {
00223     int i;
00224     for(i=1; i<tank_num; i++) {
00225         if(hp[i]==1) {
00226             lcd3.drawSprite(4*7+(i-1)*7+3,7*5+1,5,7,(int *)hp_ai);
00227         }
00228 
00229     }
00230 }
00231 void tank_show3(int tank_state[4],int t[4][2],int hp[4])   //显示坦克函数
00232 {
00233     int i;
00234     for(i=0; i<tank_num; i++) {
00235         if(hp[i]!=0) {
00236             lcd3.drawSprite(t[i][1]*7+3,t[i][0]*5+1,5,7,(int *)tank[i][tank_state[i]]);
00237         }
00238     }
00239 }
00240 void main3()
00241 {
00242     // need to initialise the lcd3 first, do this once outside of the loop
00243     lcd3.init();
00244     //int command[2][4]={{0,0,0,0},{0,0,0,0}};//处理后的指令
00245     int command[4]= {0,0,0,0};
00246     int i;
00247     int j; //地图复制计数
00248     int ii;
00249     int k;
00250     int l;
00251     int n; //炮弹刷新计数
00252     int shoot;//开火计数
00253     int t[tank_num][2]; //坦克坐标
00254     int b[3][2]; //炮弹坐标
00255     int bullet_cont=0;//发射炮弹计数
00256     int bullet_direct[3];//炮弹的方向
00257     int bullet_val[3];//炮弹是否被阻挡
00258     int tank_state[tank_num]; //坦克的f方向
00259     int hp_set[tank_num]= {3,1,1,1}; //坦克血量预设
00260     int hp[tank_num]= {0,0,0,0}; //坦克血量
00261     int map_adj[9][11];
00262     int tank_des;//serial number of destoried tank destroy
00263     int obj_kind;
00264     for (k=0; k<tank_num; k++) {
00265         hp[k]=hp_set[k];
00266         tank_state[k]=0;
00267         map_adj[t_start[k][0]][t_start[k][1]]=k+3;
00268         for (l=0; l<bullet_v; l++) {
00269             bullet_val[l]=0;
00270         }
00271         for (ii=0; ii<2; ii++) {
00272             t[k][ii]=t_start[k][ii];
00273         } //复制坦克坐标
00274     }
00275 
00276     for (i=0; i<11; i++) {
00277         for (j=0; j<9; j++) {
00278             map_adj[j][i]=map[j][i];
00279         }
00280     }//复制地图
00281     shoot=0;
00282     while(1) {
00283         lcd3.clear();
00284         map_scan3(map_adj);//地图显示
00285         hp_show3(hp);//血量显示
00286         tank_show3(tank_state,t,hp);//坦克显示
00287 
00288         if(shoot==0) {
00289             command[3] = button_A3.read();
00290             command[0] = button_B3.read();
00291             command[2] = button_C3.read();
00292             command[1] = button_D3.read(); //复制指令
00293             bullet_cont++;
00294             if(bullet_cont==3) {
00295                 bullet_cont=0;
00296             }
00297 
00298 
00299             command[3]=(~command[0])&(~command[1])&(~command[2])&command[3];
00300             command[2]=(~command[0])&(~command[1])&command[2];
00301             command[1]=(~command[0])&command[1];
00302             command[0]=command[0];
00303 
00304             map_adj[t[0][0]][t[0][1]]=0;
00305             t[0][0]=t[0][0]-command[0]+command[1];
00306             t[0][1]=t[0][1]-command[2]+command[3];//指令控制坦克
00307 
00308             if(map_adj[t[0][0]][t[0][1]]!=0||t[0][1]<0||t[0][1]>10||t[0][0]<0||t[0][0]>8) {
00309                 t[0][0]=t[0][0]+command[0]-command[1];
00310                 t[0][1]=t[0][1]+command[2]-command[3];
00311             }//障碍物判断,前方有障碍物时指令无效
00312             map_adj[t[0][0]][t[0][1]]=3;
00313             if(command[0]||command[1]||command[2]||command[3]) {
00314                 tank_state[0]=command[1]*1+command[2]*2+command[3]*3;
00315             } //坦克方向计算
00316             if (joy_button3.read()==0) {
00317                 bullet_val[bullet_cont]=1; //坦克发射炮弹技炮弹坐标方向计算
00318                 bullet_direct[bullet_cont]=tank_state[0];
00319                 b[bullet_cont][0]=t[0][0];
00320                 b[bullet_cont][1]=t[0][1];
00321             }
00322         }
00323 
00324         for(n=0; n<bullet_v; n++) { //炮弹比坦克快三倍运算也快三倍
00325             b[n][0]=b[n][0]+(!(bullet_direct[n]>>1))*(-1+2*(bullet_direct[n]%2));
00326             b[n][1]=b[n][1]+(bullet_direct[n]>>1)*(-1+2*(bullet_direct[n]%2));//炮弹坐标刷新
00327             if(b[n][1]>=0&&b[n][1]<=10&&b[n][0]>=0&&b[n][0]<=8&&bullet_val[n]==1) {
00328                 //炮弹有效且未出界
00329                 obj_kind=map_adj[b[n][0]][b[n][1]];
00330                 if(obj_kind==0) { //炮弹无障碍飞行的情况
00331                     lcd3.drawSprite(b[n][1]*7+3,b[n][0]*5+1,5,7,(int *)bullet);
00332                 } else if (obj_kind==2) { //炮弹打到灌木的情况
00333                     lcd3.drawSprite(b[n][1]*7+3,b[n][0]*5+1,5,7,(int *)destroyed_bush);
00334                     map_adj[b[n][0]][b[n][1]]=0;
00335                     bullet_val[n]=0;
00336                 } else if (obj_kind==1) { //炮弹打墙的情况
00337                     bullet_val[n]=0;
00338                 } else if(obj_kind>3) { //炮弹击杀坦克的情况
00339                     lcd3.printString("1", 0, 0);
00340                     tank_des=map_adj[b[n][0]][b[n][1]]-3;
00341                     map_adj[b[n][0]][b[n][1]]=0;
00342                     lcd3.drawSprite(t[tank_des][1]*7+3,t[tank_des][0]*5+1,5,7,(int *)tank_exp);
00343                     hp[tank_des]=hp[tank_des]-1;//血量减一
00344                     bullet_val[n]=0;//炮弹失效
00345                     if((hp[1]+hp[2]+hp[3])==0) {
00346                         lcd3.clear();
00347                         lcd3.printString("Exercise", 20, 1);
00348                         lcd3.printString("Completed", 18, 3);
00349                         lcd3.refresh();
00350                         wait(1);
00351                         while(1) {
00352                             if (button_C3.read() == 1) {
00353                                 main();
00354                             }
00355                         }
00356                     }
00357                 }
00358             }
00359         }
00360         shoot=shoot+1;
00361         if(shoot==bullet_v) {
00362             shoot=0;
00363         }
00364         lcd3.refresh(); // refresh the lcd3 so the pixels appear
00365         wait_ms(600/bullet_v); // 画面按炮弹移动s时间刷新,600为坦克移动时间
00366     }
00367 }
00368 void init_buttons3()
00369 {
00370     // PCB has external pull-down resistors so turn the internal ones off
00371     // (default for DigitalIn)
00372     button_A3.mode(PullNone);
00373     button_B3.mode(PullNone);
00374     button_C3.mode(PullNone);
00375     button_D3.mode(PullNone);
00376 }