xuanyu an / Mbed 2 deprecated tankworld

Dependencies:   mbed N5110

Revision:
0:a9ef8a5c769a
Child:
2:ce24c50fc0a6
diff -r 000000000000 -r a9ef8a5c769a main3.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main3.cpp	Mon May 03 08:36:29 2021 +0000
@@ -0,0 +1,327 @@
+#include "mbed.h"
+#include "N5110.h"
+#include "main2.h"
+#include "main.h"
+
+DigitalIn button_A4(p29);
+DigitalIn button_B4(p28);
+DigitalIn button_C4(p27);
+DigitalIn button_D4(p26);
+AnalogIn joy_v4(p20);
+AnalogIn joy_h4(p19);
+AnalogIn joy_button4(p17); // could be DigitalIn, but use AnalogIn so pot can also be used
+// JP1 must be in 2/3 position
+N5110 lcd4(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},
+{ 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 tank1[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}
+}
+};
+//四个⽅向的坦克1
+const int tank2[4][5][7] =
+{
+{
+{ 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,0,1,0},
+{ 0,1,0,0,0,1,0}
+},
+{
+{ 0,1,0,0,0,1,0},
+{ 0,1,0,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,0,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,0,1,0,0,0},
+{ 0,1,1,1,1,1,0}
+}
+};//四个⽅向的坦克2
+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 bullet_v=3;//炮弹的速度为坦克三倍
+const int tank_num=2;//坦克数量
+const int t_start[2][2] = {{0,5},{8,5}}; //坦克初始坐标
+void map_scan4(int map_adj[9][11]){//扫描地图函数
+int x = 0;
+int y = 0; //地图扫描坐标
+lcd4.drawRect(0,0,84,1,FILL_BLACK);
+lcd4.drawRect(0,46,84,2,FILL_BLACK);
+lcd4.drawRect(0,0,3,48,FILL_BLACK);
+lcd4.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){
+lcd4.drawSprite(x*7+3,y*5+1,5,7,(int *)wall);
+}
+else if(map_adj[y][x]==2){
+lcd4.drawSprite(x*7+3,y*5+1,5,7,(int *)bush);
+}
+}
+}
+ }
+void hp_show4(int hp1,int hp2){//显示⾎量函数
+int heart_num=0;
+for (heart_num=0;heart_num<3;heart_num++){
+if(heart_num<hp1){
+lcd4.drawSprite(4*7+heart_num*7+3,5*1+1,5,7,(int *)heart);
+}
+if(heart_num<hp2){
+lcd4.drawSprite(4*7+heart_num*7+3,7*5+1,5,7,(int *)heart);
+}
+}
+}
+void tank_show4(int tank1_state,int tank2_state,int t1[2],int t2[2]){//显示坦克函数
+lcd4.drawSprite(t1[1]*7+3,t1[0]*5+1,5,7,(int *)tank1[tank1_state]);
+lcd4.drawSprite(t2[1]*7+3,t2[0]*5+1,5,7,(int *)tank2[tank2_state]);
+}
+void init_buttons4();
+
+void main3()
+{
+// need to initialise the lcd first, do this once outside of the loop
+lcd4.init();
+int command[2][4]={{0,0,0,0},{0,0,0,0}};//处理后的指令
+int i = 0;
+int j = 0; //地图复制计数
+int ii = 0;
+int ji = 0;//坦克初始坐标复制计数
+int n = 0; //炮弹刷新计数
+int shoot = 0;//开⽕计数
+int t[tank_num][2]; //坦克坐标
+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]={0,0}; //坦克的f⽅向
+int hp[tank_num] ={3,3}; //坦克⾎量
+int tank_count;//坦克单位的计数
+int map_adj[9][11];
+for (i=0;i<11;i++){
+for (j=0;j<9;j++){
+map_adj[j][i]=map[j][i];
+}
+}//复制地图
+for (ii=0;ii<2;ii++){
+for (ji=0;ji<2;ji++){
+t[ji][ii]=t_start[ji][ii];
+}
+} //复制指令
+//welcome();
+while(1) {
+lcd4.clear();
+map_scan4(map_adj);//地图显示
+hp_show4(hp[0],hp[1]);//⾎量显示
+tank_show4(tank_state[0],tank_state[1],t[0],t[1]);//坦克显示
+if(shoot==0){
+command[0][3] = button_A4.read();
+command[0][0] = button_B4.read();
+command[0][2] = button_C4.read();
+command[0][1] = button_D4.read(); //复制指令
+if(joy_h4.read()<0.3){
+command[1][0] = 0;
+command[1][1] = 0;
+command[1][2] = 0;
+command[1][3] = 1;
+}
+else if(joy_h4.read()>0.7){
+command[1][0] = 0;
+command[1][1] = 0;
+command[1][2] = 1;
+command[1][3] = 0;
+}
+else if(joy_v4.read()<0.3){
+command[1][0] = 0;
+command[1][1] = 1;
+command[1][2] = 0;
+command[1][3] = 0;
+}
+else if(joy_v4.read()>0.7){
+command[1][0] = 1;
+command[1][1] = 0;
+command[1][2] = 0;
+command[1][3] = 0;
+}
+ else{
+command[1][0] = 0;
+command[1][1] = 0;
+command[1][2] = 0;
+command[1][3] = 0;
+}
+bullet_cont++;
+if(bullet_cont==3){
+bullet_cont=0;
+}
+/* turn=turn+1;
+if(turn==15){
+turn=0;
+}//各种计数*/
+for(tank_count=0;tank_count<tank_num;tank_count++) {
+t[tank_count][0]=t[tank_count][0]-command[tank_count][0]+command[tank_count][1];
+t[tank_count][1]=t[tank_count][1]-command[tank_count][2]+command[tank_count][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[tank_count][0]-command[tank_count][1];
+t[tank_count][1]=t[tank_count][1]+command[tank_count][2]-command[tank_count][3];
+}//障碍物判断,前⽅有障碍物时指令⽆效
+if(command[tank_count][0]||command[tank_count][1]||command[tank_count][2]||
+command[tank_count][3]){
+tank_state[tank_count]=command[tank_count][1]*1+command[tank_count]
+[2]*2+command[tank_count][3]*3;
+} //坦克⽅向计算
+bullet_direct[tank_count][bullet_cont]=tank_state[tank_count];
+if (joy_button4.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=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){
+ //炮弹有效且未出界
+if(b[tank_count][n][1]==t[!tank_count][1]&&b[tank_count][n][0]==t[!tank_count][0]){//炮弹击杀坦克的情况
+lcd4.drawSprite(t[!tank_count][1]*7+3,t[!tank_count][0]*5+1,5,7,(int *)tank_exp);
+t[!tank_count][0]=t_start[!tank_count][0];
+t[!tank_count][1]=t_start[!tank_count][1];//坦克回出⽣点
+hp[!tank_count]=hp[!tank_count]-1;//⾎量减⼀
+if (hp[!tank_count]==0){
+lcd4.clear();
+lcd4.printString("Game Over", 15, 2);
+lcd4.refresh();
+while(1){
+if (button_C4.read() == 1) {
+main();
+}
+}
+}
+bullet_val[tank_count][n]=0;//炮弹失效
+}
+else if(map_adj[b[tank_count][n][0]][b[tank_count][n][1]]==0){//炮弹⽆障碍⻜⾏的情况
+lcd4.drawSprite(b[tank_count][n][1]*7+3,b[tank_count][n][0]*5+1,5,7,(int *)bullet);
+}
+else if (map_adj[b[tank_count][n][0]][b[tank_count][n][1]]==2){//炮弹打到灌⽊的情况
+lcd4.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 (map_adj[b[tank_count][n][0]][b[tank_count][n][1]]==1){//炮弹打墙的情况
+bullet_val[tank_count][n]=0;
+}
+}
+}
+}
+shoot=shoot+1;
+if(shoot==bullet_v){
+shoot=0;
+}
+lcd4.refresh(); // refresh the LCD so the pixels appear
+wait_ms(600/bullet_v); // 画⾯按炮弹移动时间刷新,600为坦克移动时间
+}
+}
+void init_buttons4()
+{
+// PCB has external pull-down resistors so turn the internal ones off
+// (default for DigitalIn)
+button_A4.mode(PullNone);
+button_B4.mode(PullNone);
+button_C4.mode(PullNone);
+button_D4.mode(PullNone);
+}
\ No newline at end of file