编辑代码

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

#define TOTAL_NUMBERS 20
#define MINES_COUNT 5

int main() {
    int mines[TOTAL_NUMBERS + 1] = {0};  // 地雷标记数组,索引1-20有效
    int revealed[TOTAL_NUMBERS + 1] = {0}; // 已揭示标记数组
    int score = 0;
    int remaining = TOTAL_NUMBERS - MINES_COUNT;
    
    // 初始化随机数种子
    srand(time(0));
    
    // 随机生成5个地雷位置
    printf("正在生成地雷位置...\n");
    int mines_placed = 0;
    while (mines_placed < MINES_COUNT) {
        int pos = rand() % TOTAL_NUMBERS + 1;
        if (!mines[pos]) {
            mines[pos] = 1;
            mines_placed++;
        }
    }
    
    printf("欢迎来到数字地雷游戏!\n");
    printf("规则:\n");
    printf("1. 1-%d中有%d个地雷\n", TOTAL_NUMBERS, MINES_COUNT);
    printf("2. 选择数字,如果安全则得分\n");
    printf("3. 安全数字会显示周围4个数字中的地雷数量\n");
    printf("4. 找出所有%d个安全数字获胜!\n\n", remaining);
    
    while (remaining > 0) {
        int guess;
        printf("\n当前得分:%d | 剩余安全数字:%d\n", score, remaining);
        printf("请输入要选择的数字(1-%d): ", TOTAL_NUMBERS);
        scanf("%d", &guess);
        
        // 验证输入有效性
        if (guess < 1 || guess > TOTAL_NUMBERS) {
            printf("无效输入!请输入1-%d之间的数字。\n", TOTAL_NUMBERS);
            continue;
        }
        
        // 检查是否已选择过
        if (revealed[guess]) {
            printf("此数字已被选择过,请选其他数字。\n");
            continue;
        }
        
        revealed[guess] = 1; // 标记为已揭示
        
        // 检查是否为地雷
        if (mines[guess]) {
            printf("\n*** 轰!你踩中了地雷! ***\n");
            printf("游戏结束!最终得分:%d\n", score);
            return 0;
        }
        
        // 安全数字处理
        score++;
        remaining--;
        
        // 计算最近4个数字中的地雷数量
        int near_mines = 0;
        int start = (guess - 2 < 1) ? 1 : guess - 2;
        int end = (guess + 2 > TOTAL_NUMBERS) ? TOTAL_NUMBERS : guess + 2;
        
        for (int i = start; i <= end; i++) {
            if (i != guess && mines[i]) { // 不包括自身
                near_mines++;
            }
        }
        
        printf("安全!数字 %d 附近的地雷数: %d\n", guess, near_mines);
    }
    
    // 获胜处理
    printf("\n************************************\n");
    printf("* 恭喜!你找到了所有安全数字! *\n");
    printf("* 最终得分:%d/%d                  *\n", score, TOTAL_NUMBERS - MINES_COUNT);
    printf("************************************\n");
    
    return 0;
}