还记得小时候电脑里那个「扫雷」吗?点开小格子,数字告诉你周围埋了几颗雷,一不留神就"炸"了。今天,我们试着用刚学的 C 语言知识,把它亲手复刻出来。

先想清楚:两张棋盘

游戏里其实藏着两张棋盘:

mine 棋盘:真正存雷的「幕后」,字符 1 表示有雷、0 表示没雷。

show 棋盘:玩家看到的「前台」,还没排查的地方用 * 盖住。

#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10   // 简单模式 10 颗雷

棋盘故意比实际大一圈(11×11),是为了排查边缘格子时,统计它周围 8 个格子不会越界。

第一步:初始化与打印

void InitBoard(char board[ROWS][COLS], int r, int c, char set) {
    for (int i = 0; i < r; i++)
        for (int j = 0; j < c; j++)
            board[i][j] = set;
}
// mine 用 '0' 初始化,show 用 '*' 初始化

第二步:随机埋雷

void SetMine(char mine[ROWS][COLS], int r, int c) {
    int count = EASY_COUNT;
    while (count) {
        int x = rand() % r + 1;   // 随机拿到 1~r
        int y = rand() % c + 1;
        if (mine[x][y] == '0') {  // 确保这个格子还没埋过
            mine[x][y] = '1';
            count--;
        }
    }
}

第三步:数一数周围几颗雷

static int GetMineCount(char mine[ROWS][COLS], int x, int y) {
    return mine[x-1][y-1] + mine[x-1][y] + mine[x-1][y+1]
         + mine[x][y-1]             + mine[x][y+1]
         + mine[x+1][y-1] + mine[x+1][y] + mine[x+1][y+1]
         - 8 * '0';   // 8 个格子的字符值相加减去 8 个 '0',就是雷的个数
}

第四步:排查逻辑

while (win < r * c - EASY_COUNT) {        // 还没排除完所有安全格
    // 输入坐标
    // 合法性判断:1~r 且 1~c
    //   踩到雷  → 结束,展示 mine 棋盘
    //   没排查过 → 统计周围雷数,更新 show,win++
    //   排查过  → 提示"这个坐标已经排查过了"
}

当 win 累加到「格子总数 − 雷数」时,就说明所有安全格都开了,恭喜你,排雷成功!

扫雷游戏的可爱插画
一张棋盘,两张面孔,藏起来的雷就等你来温柔地找出

✿ 摘要

  • 扫雷用两张棋盘:mine 存雷、show 给玩家看。
  • 棋盘比实际大一圈,方便统计边缘格子周围的雷。
  • 核心三步:初始化、随机埋雷、排查。
  • 数雷用「8 个格子字符值之和 − 8×'0'」的小技巧。
  • 当排除格数 = 总格数 − 雷数时,玩家获胜。

愿当下的花如你所见般美丽