编辑代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>

#define SIZE 5
#define ENEMY_COUNT 5

// 游戏状态变量
int playerX = 0, playerY = 0;      // 玩家位置 (0,0) 对应 (1,1)
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;
}