“坦克大戰”小游戲(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语言)源代码及其详解注释的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。