还记得小时候电脑里那个「扫雷」吗?点开小格子,数字告诉你周围埋了几颗雷,一不留神就"炸"了。今天,我们试着用刚学的 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'」的小技巧。
- 当排除格数 = 总格数 − 雷数时,玩家获胜。
愿当下的花如你所见般美丽
评论交流
欢迎留下你的想法