“坦克大战”小游戏(C语言)源代码及其详解注释

运行实现之后的图片结果如下:

笔记
1.敌人必须先移动再创造,不然会出现尸体复活。
  原因:敌人死亡之后,中心点是无法再次定位的,敌人刷新的那一帧会出现两个中心点。
  解决方法:再主函数里把敌人移动的函数放在创造敌人的函数之前。

2.敌人子弹和玩家子弹相撞时,必定只会有一方的子弹消失,看概率。
  原因:两方子弹相撞只会有一方的子弹先到达另一方的前面然后消失,跟子弹移动速度(停留时间)有关。
  解决方法:把子弹的消失判定点往前加一个点来判断是否是敌方的子弹(暂时不解决)

3.敌人发射子弹时,有时候会出现发射子弹的方向和敌人的方向不一致。
  原因:敌人转向时是先改变方向,下一次移动时再转过去,子弹发射的时间被卡在了两者之间。
  解决方法:将发射子弹写在移动的里面,这样会改变敌人射击的频率,移动的条件符合,再判断射击条件,两者都符合才会射击。(不优)
            添加一个坦克属性来设置坦克预备转向。

4.敌人的子弹在接近玩家附近一格时,玩家向反方向移动会消除子弹,反之相同。(触发几率很小)
  原因:玩家移动的时候会把之前的所在的一条三个格子全都清零。
  解决方法:暂无

5.当玩家的前方是敌方坦克时,无法发射子弹,反之相同。不能贴脸射击。
  原因:发射子弹的条件是坦克的前方无阻挡物,才会生成子弹,在子弹生成之后才会飞行和击毁。
    解决方法:在发射子弹时添加条件判断。(不优,感觉会影响游戏体验)

6.敌人A和B的行动模式是一样的,可以把他们的移动写在一个函数里,但是运行的时候会出错只有一个坦克会动。
    原因:函数传入的参数是在函数里改变了不会影响外面的参数,这需要用到指针。
    解决方法:把所有的坦克参数全都变成指针类型?(太复杂了)

7.敌人坦克在移动的时候会被自己的子弹挡住然后转向,玩家也是(几率很小,不过不影响游戏)

#pragma warning(disable:4996)
#include<stdio.h>
#include<iostream>
#include<conio.h>
#include<time.h>
#include<windows.h>
#include<graphics.h>
#define ROW 48int map[ROW][ROW];//正方形的地图
int refresh;//记录当前刷新的次数
int FlyBullet_P_C, FlyBullet_E_C;//控制玩家和敌人子弹的飞行速度
struct Tank{//坦克的参数int x;//横向坐标int y;//纵向坐标int dir;//方向int rdir;//预备转向int dirt;//记录转向的时间int dirc;//控制转向频率int life;//坦克的生命int maxl;//坦克最大生命值int dietime;//坦克的死亡时间int str;//子弹的伤害int mt;//记录移动时间int mc; //控制移动速度int st;//记录射击时间int sc;//控制射速int score;//击败敌人的得分/玩家积累的分数int shape[3][3];//坦克的外形
} player, enemyA, enemyB, enemyC, enemyD, enemyE;//创建玩家敌人
int Player[3][3]{ {0,2,0},{2,4,2},{2,2,2} };//玩家的坦克
int empty[3][3];//空数组用于转向
struct CreatePoint {//敌人的刷新点int x;//刷新点横向坐标int y;//纵向坐标
}cp[5];
int propbox;//道具编号;
int propt, propc;//记录,控制道具刷新时间
int propflag;//判断场上是否有道具//游戏开始时的初始化
void GameStart() {initgraph(640, 480);//窗口大小setbkcolor(WHITE);//背景颜色memset(map, 0, sizeof(map));//初始化数组为0for (int i = 0; i < ROW; i++) map[0][i] = map[ROW - 1][i] = 1;for (int i = 1; i < ROW - 1; i++) map[i][0] = map[i][ROW - 1] = 1;for (int y = 0; y < ROW; y++) {//y轴向下for (int x = 0; x < ROW; x++) {//x轴向右if (map[y][x]) {setlinecolor(BLACK);setfillcolor(RGB(213, 222, 217));fillrectangle(x * 10, y * 10 + 10, x * 10 + 10, y * 10);}}}refresh = 0;map[45][23] = 4;//玩家的出生点map[44][23] = map[46][23] = map[45][22] = map[45][24] = map[46][22] = map[46][24] = 2;player.life = 3;player.score = 0;player.dir = 1;player.str = 1;player.mc = 3;player.sc = 10;player.maxl = 3;FlyBullet_P_C = 1;FlyBullet_E_C = 3;enemyA.life = enemyB.life = enemyC.life = enemyD.life = enemyE.life = -1;enemyA.dir = enemyB.dir = enemyC.dir = enemyD.dir = enemyE.dir = 2;enemyA.rdir = enemyB.rdir = enemyC.rdir = enemyD.rdir = enemyE.rdir = 2;int Enemy[3][3]{ {15,15,0},{0,20,15},{15,15,0} };//敌人的坦克for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {if (Enemy[i][j]) {enemyA.shape[i][j] = Enemy[i][j];//敌人A  中心为20 外壳为15enemyB.shape[i][j] = Enemy[i][j] + 1;//敌人B  中心为21 外壳为16enemyC.shape[i][j] = Enemy[i][j] + 2;//敌人C  中心为22 外壳为17enemyD.shape[i][j] = Enemy[i][j] + 3;//敌人D  中心为23 外壳为18enemyE.shape[i][j] = Enemy[i][j] + 4;//敌人E  中心为24 外壳为19}}}//地图地形for (int i = 0; i < 5; i++) map[10][10 + i] = map[37][10 + i] = map[10][37 - i] = map[37][37 - i] = 1;for (int i = 0; i < 4; i++) map[11 + i][10] = map[36 - i][10] = map[11 + i][37] = map[36 - i][37] = 1;map[23][23] = map[23][24] = map[24][23] = map[24][24] = 1;//初始化敌人的刷新点cp[0].x = 2;cp[0].y = 2;cp[1].x = 24;cp[1].y = 2;cp[2].x = 45;cp[2].y = 2;cp[3].x = 2;cp[3].y = 23;cp[4].x = 45;cp[4].y = 23;//道具的刷新率propt = 0;propc = 300;propflag = -1;
}//绘制地图
void DrawMap() {for (int y = 1; y < ROW-1; y++) {//y轴向下for (int x = 1; x < ROW-1; x++) {//x轴向右switch (map[y][x]) {case 0:break;case 1:setlinecolor(BLACK);setlinestyle(NULL, 1);setfillcolor(RGB(213,222,217));//灰色fillrectangle(x * 10, y * 10 + 10, x * 10 + 10, y * 10);break;//墙壁case 2://玩家坦克的外壳case 4://玩家的中心点setlinecolor(BLACK);setlinestyle(NULL, 1);setfillcolor(RGB(0, 140, 158));//青蓝色fillrectangle(x * 10, y * 10 + 10, x * 10 + 10, y * 10);break;case 19://敌人E的外壳setlinecolor(BLACK);setlinestyle(NULL, 1);setfillcolor(RED);fillrectangle(x * 10, y * 10 + 10, x * 10 + 10, y * 10);break;case 18://敌人D的外壳case 17://敌人C的外壳setlinecolor(BLACK);setlinestyle(NULL, 1);setfillcolor(RGB(89, 79, 79));//褐色fillrectangle(x * 10, y * 10 + 10, x * 10 + 10, y * 10);break;case 16://敌人B的外壳case 15://敌人A的外壳setlinecolor(BLACK);setlinestyle(NULL, 1);setfillcolor(RGB(85, 98, 112));//深灰色fillrectangle(x * 10, y * 10 + 10, x * 10 + 10, y * 10);break;case 24://敌人E的中心点setlinecolor(BLACK);setlinestyle(NULL, 2);switch (enemyE.life) {case 0:setfillcolor(RGB(255, 255, 255)); break;case 1:setfillcolor(RGB(255, 0, 0)); break;case 2:setfillcolor(RGB(255, 165, 0)); break;case 3:setfillcolor(RGB(255, 255, 0)); break;case 4:setfillcolor(RGB(0, 255, 0)); break;case 5:setfillcolor(RGB(0, 255, 255)); break;case 6:setfillcolor(RGB(0, 0, 255)); break;case 7:setfillcolor(RGB(160, 32, 240)); break;}【】fillrectangle(x * 10, y * 10 + 10, x * 10 + 10, y * 10);//边框填充矩形break;case 23://敌人D的中心点setlinecolor(BLACK);setlinestyle(NULL, 2);switch (enemyD.life) {case 0:setfillcolor(RGB(255, 255, 255)); break;case 1:setfillcolor(RGB(255, 0, 0)); break;case 2:setfillcolor(RGB(255, 165, 0)); break;case 3:setfillcolor(RGB(255, 255, 0)); break;case 4:setfillcolor(RGB(0, 255, 0)); break;case 5:setfillcolor(RGB(0, 255, 255)); break;case 6:setfillcolor(RGB(0, 0, 255)); break;case 7:setfillcolor(RGB(160, 32, 240)); break;}fillrectangle(x * 10, y * 10 + 10, x * 10 + 10, y * 10);break;case 22://敌人C的中心点setlinecolor(BLACK);setlinestyle(NULL, 2);switch (enemyC.life) {case 0:setfillcolor(RGB(255, 255, 255)); break;case 1:setfillcolor(RGB(255, 0, 0)); break;case 2:setfillcolor(RGB(255, 165, 0)); break;case 3:setfillcolor(RGB(255, 255, 0)); break;case 4:setfillcolor(RGB(0, 255, 0)); break;case 5:setfillcolor(RGB(0, 255, 255)); break;case 6:setfillcolor(RGB(0, 0, 255)); break;case 7:setfillcolor(RGB(160, 32, 240)); break;}fillrectangle(x * 10, y * 10 + 10, x * 10 + 10, y * 10);break;case 21://敌人B的中心点setlinecolor(BLACK);setlinestyle(NULL, 2);switch (enemyB.life) {case 0:setfillcolor(RGB(255, 255, 255)); break;case 1:setfillcolor(RGB(255, 0, 0)); break;case 2:setfillcolor(RGB(255, 165, 0)); break;case 3:setfillcolor(RGB(255, 255, 0)); break;case 4:setfillcolor(RGB(0, 255, 0)); break;case 5:setfillcolor(RGB(0, 255, 255)); break;case 6:setfillcolor(RGB(0, 0, 255)); break;case 7:setfillcolor(RGB(160, 32, 240)); break;}fillrectangle(x * 10, y * 10 + 10, x * 10 + 10, y * 10);break;case 20://敌人A的中心点       setlinecolor(BLACK);setlinestyle(NULL, 2);switch (enemyA.life) {case 0:setfillcolor(RGB(255, 255, 255)); break;//黑case 1:setfillcolor(RGB(255, 0, 0)); break;//红case 2:setfillcolor(RGB(255, 165, 0)); break;//橙case 3:setfillcolor(RGB(255, 255, 0)); break;//黄case 4:setfillcolor(RGB(0, 255, 0)); break;//绿case 5:setfillcolor(RGB(0, 255, 255)); break;//青case 6:setfillcolor(RGB(0, 0, 255)); break;//蓝case 7:setfillcolor(RGB(160, 32, 240)); break;//紫}fillrectangle(x * 10, y * 10 + 10, x * 10 + 10, y * 10);break;case 5://玩家向上的子弹case 6://玩家向右的子弹case 7://玩家向下的子弹case 8://玩家向左的子弹setlinecolor(BLACK);setlinestyle(NULL, 1);circle(x * 10 + 5, y * 10 + 5, 3);//空心圆 玩家的子弹break;case 11://敌人向上的子弹case 12://敌人向右的子弹case 13://敌人向下的子弹case 14://敌人向左的子弹setlinecolor(BLACK);setlinestyle(NULL, 1);setfillcolor(BLACK);fillcircle(x * 10 + 5, y * 10 + 5, 3);//黑色实心圆 敌人的子弹break;case 25://装道具的盒子switch (propbox) {case 1:setlinecolor(BLACK);setlinestyle(NULL, 2);setfillcolor(RED);fillcircle(x * 10 + 5, y * 10 + 5, 5);break;case 2:setlinecolor(BLACK);setlinestyle(NULL, 2);setfillcolor(RGB(242, 196, 90));fillcircle(x * 10 + 5, y * 10 + 5, 5);break;case 3:setlinecolor(BLACK);setlinestyle(NULL, 2);setfillcolor(RGB(77, 188, 233));fillcircle(x * 10 + 5, y * 10 + 5, 5);break;case 4:setlinecolor(BLACK);setlinestyle(NULL, 2);setfillcolor(RGB(42, 4, 74));fillcircle(x * 10 + 5, y * 10 + 5, 5);break;case 5:setlinecolor(BLACK);setlinestyle(NULL, 5);setfillcolor(RGB(254, 67, 101));fillrectangle(x * 10, y * 10 + 10, x * 10 + 10, y * 10);break;}break;case 10:setfillcolor(RGB(250, 105, 0));setlinecolor(RGB(204, 51, 63));setlinestyle(NULL, 2);POINT pts[] = { {x * 10 - 10, y * 10 - 8}, {x * 10, y * 10}, {x * 10 - 10, y * 10 + 5},{x * 10 + 1,y * 10 + 7},{x * 10 - 5,y * 10 + 11},{x * 10 + 4,y * 10 + 12},{x * 10 + 3,y * 10 + 18},{x * 10 + 8,y * 10 + 11},{x * 10 + 12,y * 10 + 20},{x * 10 + 10,y * 10 + 9},{x * 10 + 20,y * 10 + 11},{x * 10 + 13,y * 10 + 5},{x * 10 + 20,y * 10 - 4},{x * 10 + 10,y * 10 + 2},{x * 10 + 10,y * 10 - 10},{x * 10 + 7,y * 10 - 2} };fillpolygon(pts, 16);break;//爆炸效果}}}
}//右半部分显示游戏状态
void GameState() {//刷新的帧数char s[10];settextcolor(BLUE);sprintf(s, "%d", refresh);outtextxy(490, 460, s);outtextxy(490, 0, "当前生命值:");//显示生命值if (player.life > 0) {setfillcolor(RGB(254, 67, 101));}else {setfillcolor(BLACK);}setlinecolor(RED);setlinestyle(NULL, 2);//第一颗心POINT pts[] = { {490, 30}, {498, 22}, {505, 30},{512, 22},{520, 30},{505, 45} };fillpolygon(pts, 6);if (player.life > 1) {setfillcolor(RGB(254, 67, 101));}else {setfillcolor(BLACK);}//第二颗心POINT pts1[] = { {530, 30}, {538, 22}, {545, 30},{552, 22},{560, 30},{545, 45} };fillpolygon(pts1, 6);if (player.life > 2) {setfillcolor(RGB(254, 67, 101));}else {setfillcolor(BLACK);}//第三颗心POINT pts2[] = { {570, 30}, {578, 22}, {585, 30},{592, 22},{600, 30},{585, 45} };fillpolygon(pts2, 6);if (player.maxl > 3) {setlinecolor(RED);}else {setlinecolor(BLACK);}if (player.life > 3) {setfillcolor(RGB(254, 67, 101));}else {setfillcolor(BLACK);}//第四颗心POINT pts3[] = { {510, 55}, {518, 47}, {525, 55},{532, 47},{540, 55},{525, 70} };fillpolygon(pts3, 6);if (player.maxl > 4) {setlinecolor(RED);}else {setlinecolor(BLACK);}if (player.life > 4) {setfillcolor(RGB(254, 67, 101));}else {setfillcolor(BLACK);}//第五颗心POINT pts4[] = { {550, 55}, {558, 47}, {565, 55},{572, 47},{580, 55},{565, 70} };fillpolygon(pts4, 6);//伤害面板outtextxy(490, 75, "伤害:");setlinecolor(RGB(255, 130, 58));setlinestyle(NULL, 2);if (player.str > 1) {setfillcolor(RGB(242, 196, 90));}else {setfillcolor(BLACK);}fillrectangle(545, 75, 570, 92);if (player.str > 2) {setfillcolor(RGB(242, 196, 90));}else {setfillcolor(BLACK);}fillrectangle(575, 75, 600, 92);if (player.str > 3) {setfillcolor(RGB(242, 196, 90));}else {setfillcolor(BLACK);}fillrectangle(605, 75, 630, 92);//速度面板outtextxy(490, 100, "速度:");setlinecolor(RGB(38, 173, 228));setlinestyle(NULL, 2);if (player.mc < 3) {setfillcolor(RGB(77, 188, 233));}else {setfillcolor(BLACK);}fillrectangle(545, 100, 570, 117);if (player.mc < 2) {setfillcolor(RGB(77, 188, 233));}else {setfillcolor(BLACK);}fillrectangle(575, 100, 600, 117);if (player.mc < 1) {setfillcolor(RGB(77, 188, 233));}else {setfillcolor(BLACK);}fillrectangle(605, 100, 630, 117);//射速面板outtextxy(490, 125, "射速:");setlinecolor(RGB(108, 91, 123)); setlinestyle(NULL, 2);if (player.sc <= 7) {setfillcolor(RGB(42, 4, 74));}else {setfillcolor(BLACK);}fillrectangle(545, 125, 570, 142);if (player.sc <= 4) {setfillcolor(RGB(42, 4, 74));}else {setfillcolor(BLACK);}fillrectangle(575, 125, 600, 142);if (player.sc <= 2) {setfillcolor(RGB(42, 4, 74));}else {setfillcolor(BLACK);}fillrectangle(605, 125, 630, 142);//显示分数outtextxy(490, 400, "当前分数:");char sco[10];settextcolor(BLUE);sprintf(sco, "%d", player.score);outtextxy(600, 400, sco);outtextxy(490, 440, "WSAD移动,Q射击");
}//生成道具
void Create_prop() {if ((refresh - propt > propc)&& propflag==1) {int x = rand() % 47 + 1, y = rand() % 47 + 1;if (map[y][x] == 0) {map[y][x] = 25;int n = rand() % 7;switch (n) {case 0:case 1:case 2:propbox = 5; break;case 3:if (player.maxl < 5) {propbox = 1;}else {propbox = 5;}break;case 4: if (player.str < 4) {propbox = 2;}else {propbox = 5;}break;case 5:if (player.mc > 0) {propbox = 3;}else {propbox = 5;}break;case 6:if (player.sc > 2) {propbox = 4;}else {propbox = 5;}break;}}}
}//触发道具效果
void Prop() {switch (propbox) {case 1:player.maxl++;player.life++;if (player.maxl > 5) {player.maxl = 5;}if (player.life > player.maxl) {player.life = player.maxl;}break;case 2:player.str++;if (player.str > 4) {player.str = 4;}break;case 3:player.mc--;if (player.mc < 0) {player.mc = 0;}break;case 4:player.sc -= 3;if (player.sc < 2) {player.sc = 2;}break;case 5:player.life++;if (player.life > player.maxl) {player.life = player.maxl;}break;}propt = refresh;
}//玩家子弹飞行
void FlyBullet_player() {if (refresh % FlyBullet_P_C == 0) {for (int i = 1; i < ROW - 1; i++) {for (int j = 1; j < ROW - 1; j++) {if (map[i][j] == 5) {if (map[i - 1][j] == 0) {map[i - 1][j] = 5;map[i][j] = 0;}else {map[i][j] = 0;switch (map[i - 1][j]) {case 15:enemyA.life -= player.str;if (enemyA.life <= 0) {enemyA.life = 0;enemyA.dietime = refresh;player.score += enemyA.score;}break;case 20:enemyA.life -= player.str * 2;if (enemyA.life <= 0) {enemyA.life = 0;enemyA.dietime = refresh;player.score += enemyA.score * 2;}break;case 16:enemyB.life -= player.str;if (enemyB.life <= 0) {enemyB.life = 0;enemyB.dietime = refresh;player.score += enemyB.score;}break;case 21:enemyB.life -= player.str * 2;if (enemyB.life <= 0) {enemyB.life = 0;enemyB.dietime = refresh;player.score += enemyB.score * 2;}break;case 17:enemyC.life -= player.str;if (enemyC.life <= 0) {enemyC.life = 0;enemyC.dietime = refresh;player.score += enemyC.score;}break;case 22:enemyC.life -= player.str * 2;if (enemyC.life <= 0) {enemyC.life = 0;enemyC.dietime = refresh;player.score += enemyC.score * 2;}break;case 18:enemyD.life -= player.str;if (enemyD.life <= 0) {enemyD.life = 0;enemyD.dietime = refresh;player.score += enemyD.score;}break;case 23:enemyD.life -= player.str * 2;if (enemyD.life <= 0) {enemyD.life = 0;enemyD.dietime = refresh;player.score += enemyD.score * 2;}break;case 19:enemyE.life -= player.str;if (enemyE.life <= 0) {enemyE.life = 0;enemyE.dietime = refresh;player.score += enemyE.score;}break;case 24:enemyE.life -= player.str * 2;if (enemyE.life <= 0) {enemyE.life = 0;enemyE.dietime = refresh;player.score += enemyE.score * 2;}break;}}}if (map[i][j] == 8) {if (map[i][j - 1] == 0) {map[i][j - 1] = 8;map[i][j] = 0;}else {map[i][j] = 0;switch (map[i][j - 1]) {case 15:enemyA.life -= player.str;if (enemyA.life <= 0) {enemyA.life = 0;enemyA.dietime = refresh;player.score += enemyA.score;}break;case 20:enemyA.life -= player.str * 2;if (enemyA.life <= 0) {enemyA.life = 0;enemyA.dietime = refresh;player.score += enemyA.score * 2;}break;case 16:enemyB.life -= player.str;if (enemyB.life <= 0) {enemyB.life = 0;enemyB.dietime = refresh;player.score += enemyB.score;}break;case 21:enemyB.life -= player.str * 2;if (enemyB.life <= 0) {enemyB.life = 0;enemyB.dietime = refresh;player.score += enemyB.score * 2;}break;case 17:enemyC.life -= player.str;if (enemyC.life <= 0) {enemyC.life = 0;enemyC.dietime = refresh;player.score += enemyC.score;}break;case 22:enemyC.life -= player.str * 2;if (enemyC.life <= 0) {enemyC.life = 0;enemyC.dietime = refresh;player.score += enemyC.score * 2;}break;case 18:enemyD.life -= player.str;if (enemyD.life <= 0) {enemyD.life = 0;enemyD.dietime = refresh;player.score += enemyD.score;}break;case 23:enemyD.life -= player.str * 2;if (enemyD.life <= 0) {enemyD.life = 0;enemyD.dietime = refresh;player.score += enemyD.score * 2;}break;case 19:enemyE.life -= player.str;if (enemyE.life <= 0) {enemyE.life = 0;enemyE.dietime = refresh;player.score += enemyE.score;}break;case 24:enemyE.life -= player.str * 2;if (enemyE.life <= 0) {enemyE.life = 0;enemyE.dietime = refresh;player.score += enemyE.score * 2;}break;}}}if (map[ROW - 1 - i][ROW - 1 - j] == 6) {if (map[ROW - 1 - i][ROW - j] == 0) {map[ROW - 1 - i][ROW - j] = 6;map[ROW - 1 - i][ROW - 1 - j] = 0;}else {map[ROW - 1 - i][ROW - 1 - j] = 0;switch (map[ROW - 1 - i][ROW - j]) {case 15:enemyA.life -= player.str;if (enemyA.life <= 0) {enemyA.life = 0;enemyA.dietime = refresh;player.score += enemyA.score;}break;case 20:enemyA.life -= player.str * 2;if (enemyA.life <= 0) {enemyA.life = 0;enemyA.dietime = refresh;player.score += enemyA.score * 2;}break;case 16:enemyB.life -= player.str;if (enemyB.life <= 0) {enemyB.life = 0;enemyB.dietime = refresh;player.score += enemyB.score;}break;case 21:enemyB.life -= player.str * 2;if (enemyB.life <= 0) {enemyB.life = 0;enemyB.dietime = refresh;player.score += enemyB.score * 2;}break;case 17:enemyC.life -= player.str;if (enemyC.life <= 0) {enemyC.life = 0;enemyC.dietime = refresh;player.score += enemyC.score;}break;case 22:enemyC.life -= player.str * 2;if (enemyC.life <= 0) {enemyC.life = 0;enemyC.dietime = refresh;player.score += enemyC.score * 2;}break;case 18:enemyD.life -= player.str;if (enemyD.life <= 0) {enemyD.life = 0;enemyD.dietime = refresh;player.score += enemyD.score;}break;case 23:enemyD.life -= player.str * 2;if (enemyD.life <= 0) {enemyD.life = 0;enemyD.dietime = refresh;player.score += enemyD.score * 2;}break;case 19:enemyE.life -= player.str;if (enemyE.life <= 0) {enemyE.life = 0;enemyE.dietime = refresh;player.score += enemyE.score;}break;case 24:enemyE.life -= player.str * 2;if (enemyE.life <= 0) {enemyE.life = 0;enemyE.dietime = refresh;player.score += enemyE.score * 2;}break;}}}if (map[ROW - 1 - i][ROW - 1 - j] == 7) {if (map[ROW - i][ROW - 1 - j] == 0) {map[ROW - i][ROW - 1 - j] = 7;map[ROW - 1 - i][ROW - 1 - j] = 0;}else {map[ROW - 1 - i][ROW - 1 - j] = 0;switch (map[ROW - i][ROW - 1 - j]) {case 15:enemyA.life -= player.str;if (enemyA.life <= 0) {enemyA.life = 0;enemyA.dietime = refresh;player.score += enemyA.score;}break;case 20:enemyA.life -= player.str * 2;if (enemyA.life <= 0) {enemyA.life = 0;enemyA.dietime = refresh;player.score += enemyA.score * 2;}break;case 16:enemyB.life -= player.str;if (enemyB.life <= 0) {enemyB.life = 0;enemyB.dietime = refresh;player.score += enemyB.score;}break;case 21:enemyB.life -= player.str * 2;if (enemyB.life <= 0) {enemyB.life = 0;enemyB.dietime = refresh;player.score += enemyB.score * 2;}break;case 17:enemyC.life -= player.str;if (enemyC.life <= 0) {enemyC.life = 0;enemyC.dietime = refresh;player.score += enemyC.score;}break;case 22:enemyC.life -= player.str * 2;if (enemyC.life <= 0) {enemyC.life = 0;enemyC.dietime = refresh;player.score += enemyC.score * 2;}break;case 18:enemyD.life -= player.str;if (enemyD.life <= 0) {enemyD.life = 0;enemyD.dietime = refresh;player.score += enemyD.score;}break;case 23:enemyD.life -= player.str * 2;if (enemyD.life <= 0) {enemyD.life = 0;enemyD.dietime = refresh;player.score += enemyD.score * 2;}break;case 19:enemyE.life -= player.str;if (enemyE.life <= 0) {enemyE.life = 0;enemyE.dietime = refresh;player.score += enemyE.score;}break;case 24:enemyE.life -= player.str * 2;if (enemyE.life <= 0) {enemyE.life = 0;enemyE.dietime = refresh;player.score += enemyE.score * 2;}break;}}}}}}
}//敌人子弹飞行
void FlyBullet_enemy() {if (refresh % FlyBullet_E_C == 0) {for (int i = 1; i < ROW - 1; i++) {for (int j = 1; j < ROW - 1; j++) {if (map[i][j] == 11) {if (map[i - 1][j] == 0) {map[i - 1][j] = 11;map[i][j] = 0;}else {map[i][j] = 0;if (map[i - 1][j] == 2 || map[i - 1][j] == 4) {if (player.life > 0) {player.life--;player.dietime = refresh;}}}}if (map[i][j] == 14) {if (map[i][j - 1] == 0) {map[i][j - 1] = 14;map[i][j] = 0;}else {map[i][j] = 0;if (map[i][j - 1] == 2 || map[i][j - 1] == 4) {if (player.life > 0) {player.life--;player.dietime = refresh;}}}}if (map[ROW - 1 - i][ROW - 1 - j] == 12) {if (map[ROW - 1 - i][ROW - j] == 0) {map[ROW - 1 - i][ROW - j] = 12;map[ROW - 1 - i][ROW - 1 - j] = 0;}else {map[ROW - 1 - i][ROW - 1 - j] = 0;if (map[ROW - 1 - i][ROW - j] == 2 || map[ROW - 1 - i][ROW - j] == 4) {if (player.life > 0) {player.life--;player.dietime = refresh;}}}}if (map[ROW - 1 - i][ROW - 1 - j] == 13) {if (map[ROW - i][ROW - 1 - j] == 0) {map[ROW - i][ROW - 1 - j] = 13;map[ROW - 1 - i][ROW - 1 - j] = 0;}else {map[ROW - 1 - i][ROW - 1 - j] = 0;if (map[ROW - i][ROW - 1 - j] == 2 || map[ROW - i][ROW - 1 - j] == 4) {if (player.life > 0) {player.life--;player.dietime = refresh;}}}}}}}
}//敌人A移动——碰到障碍逆时针转圈,周期随机改变方向
void EnemyA_Move() {int i, j;if (enemyA.life > 0) {if (refresh - enemyA.mt > enemyA.mc) {if (refresh - enemyA.dirt > enemyA.dirc) {enemyA.rdir = rand() % 4 + 1;enemyA.dirt = refresh;}switch (enemyA.rdir) {case 1:if (map[enemyA.y - 2][enemyA.x] == 0 && map[enemyA.y - 2][enemyA.x - 1] == 0 && map[enemyA.y - 2][enemyA.x + 1] == 0) {for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {empty[2 - j][i] = enemyA.shape[i][j];}}for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[enemyA.y - 2 + i][enemyA.x - 1 + j] = empty[i][j];}}for (j = 0; j < 3; j++)map[enemyA.y - 2 + i][enemyA.x - 1 + j] = 0;enemyA.dir = 1;enemyA.mt = refresh;}else {enemyA.rdir = 2;enemyA.dirt = refresh;}break;case 2:if (map[enemyA.y][enemyA.x + 2] == 0 && map[enemyA.y - 1][enemyA.x + 2] == 0 && map[enemyA.y + 1][enemyA.x + 2] == 0) {for (i = 0; i < 3; i++)map[enemyA.y - 1 + i][enemyA.x - 1] = 0;for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[enemyA.y - 1 + i][enemyA.x + j] = enemyA.shape[i][j];}}enemyA.dir = 2;enemyA.mt = refresh;}else {enemyA.rdir = 3; enemyA.dirt = refresh;}break;case 3:if (map[enemyA.y + 2][enemyA.x] == 0 && map[enemyA.y + 2][enemyA.x - 1] == 0 && map[enemyA.y + 2][enemyA.x + 1] == 0) {for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {empty[j][2 - i] = enemyA.shape[i][j];}}for (j = 0; j < 3; j++)map[enemyA.y - 1][enemyA.x - 1 + j] = 0;for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[enemyA.y + i][enemyA.x - 1 + j] = empty[i][j];}}enemyA.dir = 3;enemyA.mt = refresh;}else {enemyA.rdir = 4;enemyA.dirt = refresh;}break;case 4:if (map[enemyA.y][enemyA.x - 2] == 0 && map[enemyA.y - 1][enemyA.x - 2] == 0 && map[enemyA.y + 1][enemyA.x - 2] == 0) {for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {empty[i][j] = enemyA.shape[i][2 - j];}}for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[enemyA.y - 1 + i][enemyA.x - 2 + j] = empty[i][j];}}for (i = 0; i < 3; i++)map[enemyA.y - 1 + i][enemyA.x - 2 + j] = 0;enemyA.dir = 4;enemyA.mt = refresh;}else {enemyA.rdir = 1;enemyA.dirt = refresh;}break;}}if (refresh - enemyA.st > enemyA.sc) {//生成子弹if (enemyA.dir == 1 && map[enemyA.y - 2][enemyA.x] == 0) {map[enemyA.y - 2][enemyA.x] = 11;enemyA.st = refresh;}else if (enemyA.dir == 2 && map[enemyA.y][enemyA.x + 2] == 0) {map[enemyA.y][enemyA.x + 2] = 12;enemyA.st = refresh;}else if (enemyA.dir == 3 && map[enemyA.y + 2][enemyA.x] == 0) {map[enemyA.y + 2][enemyA.x] = 13;enemyA.st = refresh;}else if (enemyA.dir == 4 && map[enemyA.y][enemyA.x - 2] == 0) {map[enemyA.y][enemyA.x - 2] = 14;enemyA.st = refresh;};}}if(enemyA.life == 0)//被击毁了{if (refresh - enemyA.dietime == 0) {for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[enemyA.y - 1 + i][enemyA.x - 1 + j] = 0;}}}else if (refresh - enemyA.dietime < 5) {map[enemyA.y][enemyA.x] = 10;}else if(refresh - enemyA.dietime >= 5 && refresh - enemyA.dietime < 10) {map[enemyA.y][enemyA.x] = 20;}else if (refresh - enemyA.dietime >= 10&& refresh - enemyA.dietime < 15) {map[enemyA.y][enemyA.x] = 10;}else if (refresh - enemyA.dietime == 15) {map[enemyA.y][enemyA.x] = 0;enemyA.life = -1;//刷新新坦克}}
}//敌人B移动——碰到障碍顺时针转圈,周期随机改变方向
void EnemyB_Move() {int i, j;if (enemyB.life > 0) {if (refresh - enemyB.mt > enemyB.mc) {if (refresh - enemyB.dirt > enemyB.dirc) {enemyB.rdir = rand() % 4 + 1;enemyB.dirt = refresh;}switch (enemyB.rdir) {case 1:if (map[enemyB.y - 2][enemyB.x] == 0 && map[enemyB.y - 2][enemyB.x - 1] == 0 && map[enemyB.y - 2][enemyB.x + 1] == 0) {for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {empty[2 - j][i] = enemyB.shape[i][j];}}for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[enemyB.y - 2 + i][enemyB.x - 1 + j] = empty[i][j];}}for (j = 0; j < 3; j++)map[enemyB.y - 2 + i][enemyB.x - 1 + j] = 0;enemyB.dir = 1;enemyB.mt = refresh;}else {enemyB.rdir = 4;enemyB.dirt = refresh;}break;case 2:if (map[enemyB.y][enemyB.x + 2] == 0 && map[enemyB.y - 1][enemyB.x + 2] == 0 && map[enemyB.y + 1][enemyB.x + 2] == 0) {for (i = 0; i < 3; i++)map[enemyB.y - 1 + i][enemyB.x - 1] = 0;for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[enemyB.y - 1 + i][enemyB.x + j] = enemyB.shape[i][j];}}enemyB.dir = 2;enemyB.mt = refresh;}else {enemyB.rdir = 1;enemyB.dirt = refresh;}break;case 3:if (map[enemyB.y + 2][enemyB.x] == 0 && map[enemyB.y + 2][enemyB.x - 1] == 0 && map[enemyB.y + 2][enemyB.x + 1] == 0) {for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {empty[j][2 - i] = enemyB.shape[i][j];}}for (j = 0; j < 3; j++)map[enemyB.y - 1][enemyB.x - 1 + j] = 0;for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[enemyB.y + i][enemyB.x - 1 + j] = empty[i][j];}}enemyB.dir = 3;enemyB.mt = refresh;}else {enemyB.rdir = 2;enemyB.dirt = refresh;}break;case 4:if (map[enemyB.y][enemyB.x - 2] == 0 && map[enemyB.y - 1][enemyB.x - 2] == 0 && map[enemyB.y + 1][enemyB.x - 2] == 0) {for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {empty[i][j] = enemyB.shape[i][2 - j];}}for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[enemyB.y - 1 + i][enemyB.x - 2 + j] = empty[i][j];}}for (i = 0; i < 3; i++)map[enemyB.y - 1 + i][enemyB.x - 2 + j] = 0;enemyB.dir = 4;enemyB.mt = refresh;}else {enemyB.rdir = 3;enemyB.dirt = refresh;}break;}}if (refresh - enemyB.st > enemyB.sc) {//生成子弹if (enemyB.dir == 1 && map[enemyB.y - 2][enemyB.x] == 0) {map[enemyB.y - 2][enemyB.x] = 11;enemyB.st = refresh;}else if (enemyB.dir == 2 && map[enemyB.y][enemyB.x + 2] == 0) {map[enemyB.y][enemyB.x + 2] = 12;enemyB.st = refresh;}else if (enemyB.dir == 3 && map[enemyB.y + 2][enemyB.x] == 0) {map[enemyB.y + 2][enemyB.x] = 13;enemyB.st = refresh;}else if (enemyB.dir == 4 && map[enemyB.y][enemyB.x - 2] == 0) {map[enemyB.y][enemyB.x - 2] = 14;enemyB.st = refresh;};}}if (enemyB.life == 0)//被击毁了{if (refresh - enemyB.dietime == 0) {for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[enemyB.y - 1 + i][enemyB.x - 1 + j] = 0;}}}else if (refresh - enemyB.dietime < 5) {map[enemyB.y][enemyB.x] = 10;}else if (refresh - enemyB.dietime >= 5 && refresh - enemyB.dietime < 10) {map[enemyB.y][enemyB.x] = 21;}else if (refresh - enemyB.dietime >= 10 && refresh - enemyB.dietime < 15) {map[enemyB.y][enemyB.x] = 10;}else if (refresh - enemyB.dietime == 15) {map[enemyB.y][enemyB.x] = 0;enemyB.life = -1;//刷新新坦克}}
}//敌人C移动——碰到障碍顺时针转圈,周期随机改变方向
void EnemyC_Move() {int i, j;if (enemyC.life > 0) {if (refresh - enemyC.mt > enemyC.mc) {if (refresh - enemyC.dirt > enemyC.dirc) {enemyC.rdir = rand() % 4 + 1;enemyC.dirt = refresh;}switch (enemyC.rdir) {case 1:if (map[enemyC.y - 2][enemyC.x] == 0 && map[enemyC.y - 2][enemyC.x - 1] == 0 && map[enemyC.y - 2][enemyC.x + 1] == 0) {for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {empty[2 - j][i] = enemyC.shape[i][j];}}for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[enemyC.y - 2 + i][enemyC.x - 1 + j] = empty[i][j];}}for (j = 0; j < 3; j++)map[enemyC.y - 2 + i][enemyC.x - 1 + j] = 0;enemyC.dir = 1;enemyC.mt = refresh;}else {enemyC.rdir = 4;enemyC.dirt = refresh;}break;case 2:if (map[enemyC.y][enemyC.x + 2] == 0 && map[enemyC.y - 1][enemyC.x + 2] == 0 && map[enemyC.y + 1][enemyC.x + 2] == 0) {for (i = 0; i < 3; i++)map[enemyC.y - 1 + i][enemyC.x - 1] = 0;for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[enemyC.y - 1 + i][enemyC.x + j] = enemyC.shape[i][j];}}enemyC.dir = 2;enemyC.mt = refresh;}else {enemyC.rdir = 1;enemyC.dirt = refresh;}break;case 3:if (map[enemyC.y + 2][enemyC.x] == 0 && map[enemyC.y + 2][enemyC.x - 1] == 0 && map[enemyC.y + 2][enemyC.x + 1] == 0) {for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {empty[j][2 - i] = enemyC.shape[i][j];}}for (j = 0; j < 3; j++)map[enemyC.y - 1][enemyC.x - 1 + j] = 0;for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[enemyC.y + i][enemyC.x - 1 + j] = empty[i][j];}}enemyC.dir = 3;enemyC.mt = refresh;}else {enemyC.rdir = 2;enemyC.dirt = refresh;}break;case 4:if (map[enemyC.y][enemyC.x - 2] == 0 && map[enemyC.y - 1][enemyC.x - 2] == 0 && map[enemyC.y + 1][enemyC.x - 2] == 0) {for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {empty[i][j] = enemyC.shape[i][2 - j];}}for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[enemyC.y - 1 + i][enemyC.x - 2 + j] = empty[i][j];}}for (i = 0; i < 3; i++)map[enemyC.y - 1 + i][enemyC.x - 2 + j] = 0;enemyC.dir = 4;enemyC.mt = refresh;}else {enemyC.rdir = 3;enemyC.dirt = refresh;}break;}}if (refresh - enemyC.st > enemyC.sc) {//生成子弹if (enemyC.dir == 1 && map[enemyC.y - 2][enemyC.x] == 0) {map[enemyC.y - 2][enemyC.x] = 11;enemyC.st = refresh;}else if (enemyC.dir == 2 && map[enemyC.y][enemyC.x + 2] == 0) {map[enemyC.y][enemyC.x + 2] = 12;enemyC.st = refresh;}else if (enemyC.dir == 3 && map[enemyC.y + 2][enemyC.x] == 0) {map[enemyC.y + 2][enemyC.x] = 13;enemyC.st = refresh;}else if (enemyC.dir == 4 && map[enemyC.y][enemyC.x - 2] == 0) {map[enemyC.y][enemyC.x - 2] = 14;enemyC.st = refresh;};}}if (enemyC.life == 0)//被击毁了{if (refresh - enemyC.dietime == 0) {for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[enemyC.y - 1 + i][enemyC.x - 1 + j] = 0;}}}else if (refresh - enemyC.dietime < 5) {map[enemyC.y][enemyC.x] = 10;}else if (refresh - enemyC.dietime >= 5 && refresh - enemyC.dietime < 10) {map[enemyC.y][enemyC.x] = 22;}else if (refresh - enemyC.dietime >= 10 && refresh - enemyC.dietime < 15) {map[enemyC.y][enemyC.x] = 10;}else if (refresh - enemyC.dietime == 15) {map[enemyC.y][enemyC.x] = 0;enemyC.life = -1;//刷新新坦克}}
}//敌人D移动——碰到障碍逆时针转圈,周期随机改变方向
void EnemyD_Move() {int i, j;if (enemyD.life > 0) {if (refresh - enemyD.mt > enemyD.mc) {if (refresh - enemyD.dirt > enemyD.dirc) {enemyD.rdir = rand() % 4 + 1;enemyD.dirt = refresh;}switch (enemyD.rdir) {case 1:if (map[enemyD.y - 2][enemyD.x] == 0 && map[enemyD.y - 2][enemyD.x - 1] == 0 && map[enemyD.y - 2][enemyD.x + 1] == 0) {for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {empty[2 - j][i] = enemyD.shape[i][j];}}for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[enemyD.y - 2 + i][enemyD.x - 1 + j] = empty[i][j];}}for (j = 0; j < 3; j++)map[enemyD.y - 2 + i][enemyD.x - 1 + j] = 0;enemyD.dir = 1;enemyD.mt = refresh;}else {enemyD.rdir = 2;enemyD.dirt = refresh;}break;case 2:if (map[enemyD.y][enemyD.x + 2] == 0 && map[enemyD.y - 1][enemyD.x + 2] == 0 && map[enemyD.y + 1][enemyD.x + 2] == 0) {for (i = 0; i < 3; i++)map[enemyD.y - 1 + i][enemyD.x - 1] = 0;for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[enemyD.y - 1 + i][enemyD.x + j] = enemyD.shape[i][j];}}enemyD.dir = 2;enemyD.mt = refresh;}else {enemyD.rdir = 3;enemyD.dirt = refresh;}break;case 3:if (map[enemyD.y + 2][enemyD.x] == 0 && map[enemyD.y + 2][enemyD.x - 1] == 0 && map[enemyD.y + 2][enemyD.x + 1] == 0) {for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {empty[j][2 - i] = enemyD.shape[i][j];}}for (j = 0; j < 3; j++)map[enemyD.y - 1][enemyD.x - 1 + j] = 0;for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[enemyD.y + i][enemyD.x - 1 + j] = empty[i][j];}}enemyD.dir = 3;enemyD.mt = refresh;}else {enemyD.rdir = 4;enemyD.dirt = refresh;}break;case 4:if (map[enemyD.y][enemyD.x - 2] == 0 && map[enemyD.y - 1][enemyD.x - 2] == 0 && map[enemyD.y + 1][enemyD.x - 2] == 0) {for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {empty[i][j] = enemyD.shape[i][2 - j];}}for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[enemyD.y - 1 + i][enemyD.x - 2 + j] = empty[i][j];}}for (i = 0; i < 3; i++)map[enemyD.y - 1 + i][enemyD.x - 2 + j] = 0;enemyD.dir = 4;enemyD.mt = refresh;}else {enemyD.rdir = 1;enemyD.dirt = refresh;}break;}}if (refresh - enemyD.st > enemyD.sc) {//生成子弹if (enemyD.dir == 1 && map[enemyD.y - 2][enemyD.x] == 0) {map[enemyD.y - 2][enemyD.x] = 11;enemyD.st = refresh;}else if (enemyD.dir == 2 && map[enemyD.y][enemyD.x + 2] == 0) {map[enemyD.y][enemyD.x + 2] = 12;enemyD.st = refresh;}else if (enemyD.dir == 3 && map[enemyD.y + 2][enemyD.x] == 0) {map[enemyD.y + 2][enemyD.x] = 13;enemyD.st = refresh;}else if (enemyD.dir == 4 && map[enemyD.y][enemyD.x - 2] == 0) {map[enemyD.y][enemyD.x - 2] = 14;enemyD.st = refresh;};}}if (enemyD.life == 0)//被击毁了{if (refresh - enemyD.dietime == 0) {for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[enemyD.y - 1 + i][enemyD.x - 1 + j] = 0;}}}else if (refresh - enemyD.dietime < 5) {map[enemyD.y][enemyD.x] = 10;}else if (refresh - enemyD.dietime >= 5 && refresh - enemyD.dietime < 10) {map[enemyD.y][enemyD.x] = 23;}else if (refresh - enemyD.dietime >= 10 && refresh - enemyD.dietime < 15) {map[enemyD.y][enemyD.x] = 10;}else if (refresh - enemyD.dietime == 15) {map[enemyD.y][enemyD.x] = 0;enemyD.life = -1;//刷新新坦克}}
}//敌人E移动——智(障)能移动
void EnemyE_Move() {int i, j;if (enemyE.life > 0) {if (enemyE.x > player.x) {enemyE.rdir = 4;}else if(enemyE.x < player.x) {enemyE.rdir = 2;}else {if (enemyE.y > player.y) {enemyE.rdir = 1;}else {enemyE.rdir = 3;}}if (refresh - enemyE.mt > enemyE.mc) {switch (enemyE.rdir) {case 1:if (map[enemyE.y - 2][enemyE.x] == 0 && map[enemyE.y - 2][enemyE.x - 1] == 0 && map[enemyE.y - 2][enemyE.x + 1] == 0) {for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {empty[2 - j][i] = enemyE.shape[i][j];}}for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[enemyE.y - 2 + i][enemyE.x - 1 + j] = empty[i][j];}}for (j = 0; j < 3; j++)map[enemyE.y - 2 + i][enemyE.x - 1 + j] = 0;enemyE.dir = 1;enemyE.mt = refresh;}else {enemyE.rdir = 2;}break;case 2:if (map[enemyE.y][enemyE.x + 2] == 0 && map[enemyE.y - 1][enemyE.x + 2] == 0 && map[enemyE.y + 1][enemyE.x + 2] == 0) {for (i = 0; i < 3; i++)map[enemyE.y - 1 + i][enemyE.x - 1] = 0;for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[enemyE.y - 1 + i][enemyE.x + j] = enemyE.shape[i][j];}}enemyE.dir = 2;enemyE.mt = refresh;}else {enemyE.rdir = 3;}break;case 3:if (map[enemyE.y + 2][enemyE.x] == 0 && map[enemyE.y + 2][enemyE.x - 1] == 0 && map[enemyE.y + 2][enemyE.x + 1] == 0) {for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {empty[j][2 - i] = enemyE.shape[i][j];}}for (j = 0; j < 3; j++)map[enemyE.y - 1][enemyE.x - 1 + j] = 0;for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[enemyE.y + i][enemyE.x - 1 + j] = empty[i][j];}}enemyE.dir = 3;enemyE.mt = refresh;}else {enemyE.rdir = 4;}break;case 4:if (map[enemyE.y][enemyE.x - 2] == 0 && map[enemyE.y - 1][enemyE.x - 2] == 0 && map[enemyE.y + 1][enemyE.x - 2] == 0) {for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {empty[i][j] = enemyE.shape[i][2 - j];}}for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[enemyE.y - 1 + i][enemyE.x - 2 + j] = empty[i][j];}}for (i = 0; i < 3; i++)map[enemyE.y - 1 + i][enemyE.x - 2 + j] = 0;enemyE.dir = 4;enemyE.mt = refresh;}else {enemyE.rdir = 1;}break;}}if (refresh - enemyE.st > enemyE.sc) {//生成子弹if (enemyE.dir == 1 && map[enemyE.y - 2][enemyE.x] == 0) {map[enemyE.y - 2][enemyE.x] = 11;enemyE.st = refresh;}else if (enemyE.dir == 2 && map[enemyE.y][enemyE.x + 2] == 0) {map[enemyE.y][enemyE.x + 2] = 12;enemyE.st = refresh;}else if (enemyE.dir == 3 && map[enemyE.y + 2][enemyE.x] == 0) {map[enemyE.y + 2][enemyE.x] = 13;enemyE.st = refresh;}else if (enemyE.dir == 4 && map[enemyE.y][enemyE.x - 2] == 0) {map[enemyE.y][enemyE.x - 2] = 14;enemyE.st = refresh;};}}if (enemyE.life == 0)//被击毁了{if (refresh - enemyE.dietime == 0) {for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[enemyE.y - 1 + i][enemyE.x - 1 + j] = 0;}}}else if (refresh - enemyE.dietime < 5) {map[enemyE.y][enemyE.x] = 10;}else if (refresh - enemyE.dietime >= 5 && refresh - enemyE.dietime < 10) {map[enemyE.y][enemyE.x] = 24;}else if (refresh - enemyE.dietime >= 10 && refresh - enemyE.dietime < 15) {map[enemyE.y][enemyE.x] = 10;}else if (refresh - enemyE.dietime == 15) {map[enemyE.y][enemyE.x] = 0;enemyE.life = -1;//刷新新坦克}}
}//敌人的移动模式一
void EnemyMove_mode1(int y,int x,int *dir,int life,int mt,int st,int dietime,int shape[3][3]) {//逆时针转圈,周期随机改变方向int i, j;if (life > 0) {if (refresh % 350 == 0) {*dir = rand() % 4 + 1;}if (refresh - mt > 30) {switch (*dir) {case 1:if (map[y - 2][x] == 0 && map[y - 2][x - 1] == 0 && map[y - 2][x + 1] == 0) {for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {empty[2 - j][i] = shape[i][j];}}for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[y - 2 + i][x - 1 + j] = empty[i][j];}}for (j = 0; j < 3; j++) map[y - 2 + i][x - 1 + j] = 0;mt = refresh;}else *dir = 2;break;case 2:if (map[y][x + 2] == 0 && map[y - 1][x + 2] == 0 && map[y + 1][x + 2] == 0) {for (i = 0; i < 3; i++)map[y - 1 + i][x - 1] = 0;for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[y - 1 + i][x + j] = shape[i][j];}}mt = refresh;}else *dir = 3;break;case 3:if (map[y + 2][x] == 0 && map[y + 2][x - 1] == 0 && map[y + 2][x + 1] == 0) {for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {empty[j][2 - i] = shape[i][j];}}for (j = 0; j < 3; j++)map[y - 1][x - 1 + j] = 0;for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[y + i][x - 1 + j] = empty[i][j];}}mt = refresh;}else *dir = 4;break;case 4:if (map[y][x - 2] == 0 && map[y - 1][x - 2] == 0 && map[y + 1][x - 2] == 0) {for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {empty[i][j] = shape[i][2 - j];}}for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[y - 1 + i][x - 2 + j] = empty[i][j];}}for (i = 0; i < 3; i++)map[y - 1 + i][x - 2 + j] = 0;mt = refresh;}else *dir = 1;break;}}else if (refresh - st > 60) {if (*dir == 1 && map[y - 2][x] == 0) {map[y - 2][x] = 11;st = refresh;}else if (*dir == 2 && map[y][x + 2] == 0) {map[y][x + 2] = 12;st = refresh;}else if (*dir == 3 && map[y + 2][x] == 0) {map[y + 2][x] = 13;st = refresh;}else if (*dir == 4 && map[y][x - 2] == 0) {map[y][x - 2] = 14;st = refresh;};}}if (life == 0)//被击毁了{if (refresh - dietime < 5) {for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[y - 1 + i][x - 1 + j] = 0;}}map[y][x] = 10;}else if (refresh - dietime >= 5 && refresh - dietime < 10) {map[y][x] = 21;}else if (refresh - dietime >= 10 && refresh - dietime < 15) {map[y][x] = 10;}else if (refresh - dietime == 15) {map[y][x] = 0;life = -1;//刷新新坦克}}
}//判断当前刷新点的九个格子是否都为空
int CreatePoint(int y, int x) {int flag = 0;for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {if (map[y - 1 + i][x - 1 + j] == 0) {flag++;}}}if (flag == 9) {return 1;}else {return 0;}
}//创建敌人
void Create_Enemy() {EnemyA_Move();//EnemyMove_mode1(enemyA.y,enemyA.x,enemyA.dir,enemyA.life,enemyA.mt,enemyA.st,enemyA.dietime,enemyA.shape);if (enemyA.life == -1 && refresh - enemyA.dietime > 140) {int n = rand() % 5;enemyA.dir = rand() % 4 + 1;if (CreatePoint(cp[n].y, cp[n].x)) {for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {map[cp[n].y - 1 + i][cp[n].x - 1 + j] = enemyA.shape[i][j];}}enemyA.score = 1;enemyA.life = 2;enemyA.mc = 25;enemyA.sc = 60;enemyA.rdir = 2;enemyA.dirc = 1000;}}EnemyB_Move();//EnemyMove_mode1(enemyB.y, enemyB.x, enemyB.dir, enemyB.life, enemyB.mt, enemyB.st, enemyB.dietime, enemyB.shape);if (enemyB.life == -1 && refresh - enemyB.dietime > 30) {int n = rand() % 5;enemyB.dir = rand() % 4 + 1;if (CreatePoint(cp[n].y, cp[n].x)) {for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {map[cp[n].y - 1 + i][cp[n].x - 1 + j] = enemyB.shape[i][j];}}enemyB.score = 1;enemyB.life = 2;enemyB.mc = 25;enemyB.sc = 50;enemyB.dirc = 300;}}EnemyC_Move();if (enemyC.life == -1 && refresh - enemyC.dietime > 80) {int n = rand() % 5;enemyC.dir = rand() % 4 + 1;if (CreatePoint(cp[n].y, cp[n].x)) {for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {map[cp[n].y - 1 + i][cp[n].x - 1 + j] = enemyC.shape[i][j];}}enemyC.score = 2;enemyC.life = 4;enemyC.mc = 10;enemyC.sc = 25;enemyC.dirc = 80;}}EnemyD_Move();if (enemyD.life == -1 && refresh - enemyD.dietime > 150) {int n = rand() % 5;enemyD.dir = rand() % 4 + 1;if (CreatePoint(cp[n].y, cp[n].x)) {for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {map[cp[n].y - 1 + i][cp[n].x - 1 + j] = enemyD.shape[i][j];}}enemyD.score = 2;enemyD.life = 4;enemyD.mc = 8;enemyD.sc = 20;enemyD.dirc = 200;}}EnemyE_Move();if (enemyE.life == -1 && refresh - enemyE.dietime > 500) {int n = rand() % 5;enemyE.dir = rand() % 4 + 1;if (CreatePoint(cp[n].y, cp[n].x)) {for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {map[cp[n].y - 1 + i][cp[n].x - 1 + j] = enemyE.shape[i][j];}}enemyE.score = 5;enemyE.life = 7;enemyE.mc = 3;enemyE.sc = 10;}}
}//定位玩家和敌人的坐标
void Location() {int cont = 0;for (int y = 1; y < ROW - 1; y++) {for (int x = 1; x < ROW - 1; x++) {if (map[y][x] != 25) {cont++;}if (cont == (ROW - 2) * (ROW - 2)) {propflag = 1;}else {propflag = 0;}switch (map[y][x]) {case 4:player.x = x;player.y = y;break;case 20:enemyA.x = x;enemyA.y = y;break;case 21:enemyB.x = x;enemyB.y = y;break;case 22:enemyC.x = x;enemyC.y = y;break;case 23:enemyD.x = x;enemyD.y = y;break;case 24:enemyE.x = x;enemyE.y = y;break;}}}
}//玩家按键移动
void PlayGame() {int i, j;//判断玩家是否存活if (player.life == 0) {if (refresh - player.dietime < 10) {for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[player.y - 1 + i][player.x - 1 + j] = 0;}}map[player.y][player.x] = 10;return;}else if (refresh - player.dietime >= 10 && refresh - player.dietime < 20) {map[player.y][player.x] = 9;return;}else if (refresh - player.dietime >= 20 && refresh - player.dietime < 30) {map[player.y][player.x] = 10;return;}else {map[player.y][player.x] = 0;player.life = -1;//游戏结束 程序结束return;}}if (kbhit()) {if (refresh - player.mt > player.mc) {switch (_getch()) {case 'a'://左移动if ((map[player.y][player.x - 2] == 0 || map[player.y][player.x - 2] == 25)&& (map[player.y - 1][player.x - 2] == 0 || map[player.y - 1][player.x - 2] == 25)&& (map[player.y + 1][player.x - 2] == 0 || map[player.y + 1][player.x - 2] == 25)) {if (map[player.y][player.x - 2] == 25 || map[player.y - 1][player.x - 2] == 25 || map[player.y + 1][player.x - 2] == 25) {Prop();}player.dir = 4;for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {empty[2 - j][i] = Player[i][j];}}for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[player.y - 1 + i][player.x - 2 + j] = empty[i][j];}}for (i = 0; i < 3; i++)map[player.y - 1 + i][player.x - 2 + j] = 0;player.mt = refresh;}break;case 'd'://右移动if ((map[player.y][player.x + 2] == 0 || map[player.y][player.x + 2] == 25) && (map[player.y - 1][player.x + 2] == 0 || map[player.y - 1][player.x + 2] == 25) && (map[player.y + 1][player.x + 2] == 0 || map[player.y + 1][player.x + 2] == 25)) {if (map[player.y + 1][player.x + 2] == 25 || map[player.y - 1][player.x + 2] == 25 || map[player.y][player.x + 2] == 25) {Prop();}player.dir = 2;for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {empty[j][2 - i] = Player[i][j];}}for (i = 0; i < 3; i++)map[player.y - 1 + i][player.x - 1] = 0;for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[player.y - 1 + i][player.x + j] = empty[i][j];}}player.mt = refresh;}break;case 'w'://上移动if ((map[player.y - 2][player.x] == 0 || map[player.y - 2][player.x] == 25) && (map[player.y - 2][player.x - 1] == 0 || map[player.y - 2][player.x - 1] == 25) && (map[player.y - 2][player.x + 1] == 0 || map[player.y - 2][player.x + 1] == 25)) {if (map[player.y - 2][player.x] == 25 || map[player.y - 2][player.x - 1] == 25 || map[player.y - 2][player.x + 1] == 25) {Prop();}player.dir = 1;for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[player.y - 2 + i][player.x - 1 + j] = Player[i][j];}}for (j = 0; j < 3; j++)map[player.y - 2 + i][player.x - 1 + j] = 0;player.mt = refresh;}break;case 's'://下移动if ((map[player.y + 2][player.x] == 0 || map[player.y + 2][player.x] == 25) && (map[player.y + 2][player.x - 1] == 0 || map[player.y + 2][player.x - 1] == 25) && (map[player.y + 2][player.x + 1] == 0 || map[player.y + 2][player.x + 1] == 25)) {if (map[player.y + 2][player.x] == 25 || map[player.y + 2][player.x - 1] == 25 || map[player.y + 2][player.x + 1] == 25) {Prop();}player.dir = 3;for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {empty[i][j] = Player[2 - i][j];}}for (j = 0; j < 3; j++)map[player.y - 1][player.x - 1 + j] = 0;for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {map[player.y + i][player.x - 1 + j] = empty[i][j];}};player.mt = refresh;}break;case 'q'://射击 生成子弹if (refresh - player.st > player.sc) {if (player.dir == 1 && map[player.y - 2][player.x] == 0) {map[player.y - 2][player.x] = 5;}else if (player.dir == 2 && map[player.y][player.x + 2] == 0) {map[player.y][player.x + 2] = 6;}else if (player.dir == 3 && map[player.y + 2][player.x] == 0) {map[player.y + 2][player.x] = 7;}else if (player.dir == 4 && map[player.y][player.x - 2] == 0) {map[player.y][player.x - 2] = 8;};player.st = refresh;}break;}}}
}//清空地图内容(不包括地图的外部和框)
void Clear() {HRGN rgn = CreateRectRgn(11, 11, 470, 470);// 创建一个矩形区域setcliprgn(rgn);// 将该矩形区域设置为裁剪区DeleteObject(rgn);// 不再使用 rgn,清理 rgn 占用的系统资源clearcliprgn();//清空裁剪区的屏幕内容setcliprgn(NULL);// 取消之前设置的裁剪区
}//重开游戏
void Restart() {MOUSEMSG m;m = GetMouseMsg();setlinecolor(BLUE);setlinestyle(NULL, 3);setfillcolor(WHITE);settextcolor(RED);fillrectangle(520, 200, 600, 240);outtextxy(530, 213, "重新开始");fillrectangle(520, 250, 600, 290);outtextxy(530, 263, "结束游戏");if (m.x >= 520 && m.x <= 600 && m.y >= 200 && m.y <= 240) {Clear();GameStart();}if (m.x >= 520 && m.x <= 600 && m.y >= 250 && m.y <= 290) {exit(0);}
}int main() {srand((unsigned)time(NULL));GameStart();while (player.life>=0) {GameState();FlyBullet_enemy();FlyBullet_player();Create_Enemy();Clear();Location();PlayGame();DrawMap();Create_prop();Sleep(30);refresh++;}MessageBox(GetHWnd(), "游戏结束", "SORRY", MB_OK);exit(0);closegraph();
}

“坦克大战”小游戏(C语言)源代码及其详解注释相关推荐

  1. html实现经典坦克大战小游戏

    文章目录 1.设计来源 1.1 游戏主界面 1.2 游戏界面 2.效果和源码 2.1 动态效果 2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/w ...

  2. Java实现的经典坦克大战小游戏

    Java实现的经典坦克大战小游戏 先看一下游戏结构: 有点多,没有耐心的可以不用看,这里先给出链接吧! 云链接:经典坦克大战 提取码:s9ai 这里就不介绍功能了,贴了一张游戏运行的截图,具体的功能自 ...

  3. 【JAVA程序设计】基于JAVA的坦克大战小游戏--入门级小游戏

    基于JAVA的坦克大战小游戏--入门级小游戏 零.项目获取 一.项目简介 二.开发环境 三.游戏玩法 四.运行截图 零.项目获取 获取方式(点击下载):是云猿实战 项目经过多人测试运行,可以确保100 ...

  4. C++实用编程——坦克大战小游戏

    C++实用编程--坦克大战小游戏 Warning: 转载类 原文地址:*HTML https://yq.aliyun.com/articles/683666 改变速度的玩意坏了 我们直接看代码吧,适于 ...

  5. 【180930】坦克大战小游戏源码

    坦克大战小游戏源码程序实现了小霸王游戏机上坦克大战的功能,主要功能是开火.移动.3种不同的敌方坦克.用户自制地图等,缺点是有些小细节还处理的不好,感觉画面不够好,还没实现自动的下一关功能(主要是嫌做默 ...

  6. canvas+js实现简单的坦克大战小游戏

    使用canvas和js实现经典的坦克大战并不难,坦克和炮弹的绘制可以使用canvas的里API画出,而坦克的移动和炮弹的发射可以依赖于键盘事件和定时器来实现. 在这里我要实现的坦克大战是双人模式,有木 ...

  7. 用HTML语言写一段坦克大战小游戏

    好的,我会尽力帮助你. 你可以使用 HTML 写一个坦克大战的小游戏,代码大概长这样: <!-- 这是 HTML 代码 --> <html><head><ti ...

  8. python3小游戏代码教程_Python3制作仿“经典90坦克大战”小游戏|python3教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ 本文转载至知乎ID:Charles(白露未晞)知乎个人专栏 下载W3Cschool手机App,0基础随时随 ...

  9. Python3制作仿“经典90坦克大战”小游戏

    导语 本期我们将制作一个仿"经典90坦克大战"的小游戏.啊,想起来上一次玩这个游戏的时候才小学呢.T_T真是一款暴露年龄的游戏. 算了废话不多说,让我们愉快地开始吧~ 相关文件 百 ...

  10. 坦克大战小游戏关键技术总结

    这两天参照韩顺平的坦克大战游戏并在其基础上初步完善成一个小的页面游戏,最终js代码大约570行,html代码200多行,具体可参见https://github.com/Mrkaiyang/Art/tr ...

最新文章

  1. (转)【javascript基础】原型与原型链
  2. bbmail-小巧的邮件提示程序
  3. C++学习笔记-----std::pair作为unordered_map的key
  4. 方立勋_30天掌握JavaWeb_MySQL和表约束
  5. 第 7 节:前端面试指南 — 微信小程序篇(附面试题答案)
  6. 命令行查看图片_you-get:使用命令行工具下载网络资源,可下载 B 站视频
  7. 阅读吴军《信息时代对人才技能的要求》
  8. 向量的 加,减,乘 运算_2
  9. UNIX/Linux系统管理技术手册(1)----脚本和shell
  10. Collection集合 创建/添加/迭代
  11. javascript 自动化单元测试
  12. ServletContextAware、ServletRequestAware、ServletResponseAware、SessionAware
  13. 计算机制作3d电影属于,手把手教你如何自制简单3D眼镜在家看3D电影
  14. 苹果电脑写python体验好吗_苹果笔记本系统好用吗,浅谈Mac的优缺点
  15. C语言 3习题6 请编程序将China译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母。 3习题7 设圆半径r=1.5
  16. 十年生死两茫茫,当我们已不再年轻——焦版小李飞刀
  17. vue3.0父传子,父传孙,子传孙,孙传父,孙传子的传值
  18. 这就是裸金属服务器?
  19. PHP汉字转拼音函数
  20. Linux----vim、账号管理、进程管理、磁盘管理、java环境安装

热门文章

  1. stc12c5a60s2制作4*4*4,光立方c语言程序怎么写,基于STC12c5a60s2单片机的3D显示屏设计...
  2. HeadFirst 设计模式 笔记
  3. 利用OpenCV实现对车流量的统计
  4. java properties native2ascii_properties文件国际化之native2ascii
  5. python写小说阅读器_用python实现自己的小说阅读器
  6. microsoft visual studio 2010 旗舰版的产品密
  7. 挥泪推荐6款非常非常非常实用的软件!
  8. 用Excel做一个案例分析
  9. 【Python】基于Python的百度迁徙(2020年10月21日更)
  10. 百度文库文档免费下载功能