#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
#define SIZE 5
#define ENEMY_COUNT 5
int playerX = 0, playerY = 0;
int enemies[ENEMY_COUNT][2];
int bullets = 7;
int gameOver = 0;
void initializeEnemies() {
srand(time(0));
for (int i = 0; i < ENEMY_COUNT; i++) {
int x, y, unique;
do {
unique = 1;
x = rand() % SIZE;
y = rand() % SIZE;
if (x == 0 && y == 0) {
unique = 0;
continue;
}
for (int j = 0; j < i; j++) {
if (enemies[j][0] == x && enemies[j][1] == y) {
unique = 0;
break;
}
}
} while (!unique);
enemies[i][0] = x;
enemies[i][1] = y;
}
}
int checkCollision() {
for (int i = 0; i < ENEMY_COUNT; i++) {
if (enemies[i][0] == -1) continue;
if (playerX == enemies[i][0] && playerY == enemies[i][1]) {
return 1;
}
}
return 0;
}
void displayMap() {
printf("\n");
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
if (i == playerX && j == playerY) {
printf("P ");
} else {
int enemyHere = 0;
for (int k = 0; k < ENEMY_COUNT; k++) {
if (enemies[k][0] == i && enemies[k][1] == j && enemies[k][0] != -1) {
enemyHere = 1;
break;
}
}
printf(enemyHere ? ". " : ". ");
}
}
printf("\n");
}
printf("炮弹剩余: %d\n", bullets);
printf("玩家位置: (%d,%d)\n", playerX + 1, playerY + 1);
}
void fireCannon(char direction) {
bullets--;
int dx = 0, dy = 0;
switch (tolower(direction)) {
case 'w': dx = -1; break;
case 's': dx = 1; break;
case 'a': dy = -1; break;
case 'd': dy = 1; break;
default: return;
}
int hit = 0;
int x = playerX, y = playerY;
while (x >= 0 && x < SIZE && y >= 0 && y < SIZE) {
x += dx;
y += dy;
for (int i = 0; i < ENEMY_COUNT; i++) {
if (enemies[i][0] == -1) continue;
if (x == enemies[i][0] && y == enemies[i][1]) {
printf("炮弹命中敌人于 (%d,%d)!\n", x + 1, y + 1);
enemies[i][0] = -1;
hit = 1;
break;
}
}
if (hit) break;
}
if (!hit) {
printf("炮弹未命中敌人!\n");
}
}
int checkWin() {
for (int i = 0; i < ENEMY_COUNT; i++) {
if (enemies[i][0] != -1) return 0;
}
return 1;
}
int main() {
initializeEnemies();
printf("===== 坦克利亚迷宫 =====\n");
printf("控制: W-上 S-下 A-左 D-右\n");
printf("开炮: F + 方向 (例: FW = 向上开炮)\n");
printf("目标: 消灭所有隐藏敌人!\n\n");
while (!gameOver) {
displayMap();
char input[3];
printf("输入指令 (例: W 移动, FW 向上开炮): ");
scanf("%s", input);
char move = tolower(input[0]);
if (move == 'f' && input[1] != '\0') {
if (bullets <= 0) {
printf("没有炮弹了!\n");
} else {
fireCannon(input[1]);
}
} else {
int newX = playerX, newY = playerY;
switch (move) {
case 'w': newX--; break;
case 's': newX++; break;
case 'a': newY--; break;
case 'd': newY++; break;
default: printf("无效指令!\n"); continue;
}
if (newX >= 0 && newX < SIZE && newY >= 0 && newY < SIZE) {
playerX = newX;
playerY = newY;
if (checkCollision()) {
displayMap();
printf("你碰到了敌人! 游戏结束!\n");
gameOver = 1;
}
} else {
printf("不能移出边界!\n");
}
}
if (checkWin()) {
displayMap();
printf("恭喜! 你消灭了所有敌人!\n");
gameOver = 1;
}
if (bullets <= 0 && !checkWin()) {
printf("警告: 炮弹已用尽!\n");
}
}
return 0;
}