登录后签到切换到窄版
收藏本站 发布

从零开始实现扫雷游戏(C 语言控制台版)

[复制链接]
查看: 6|回复: 0
发表于 2026-10-28 11:16:39 | 显示全部楼层 |阅读模式

扫雷是很多人最早接触的电脑游戏之一。它规则简单,但非常适合练习 C 语言的二维数组、函数封装、多文件编程、随机数、字符处理等知识。
这篇文章会从扫雷的规则和设计思路讲起,再一步一步给出完整代码实现。最终实现一个 9×9 棋盘、默认 10 个雷的控制台扫雷游戏。

一、游戏功能说明

我们要实现的控制台扫雷包含以下功能:
  • 使用控制台运行经典扫雷游戏;
  • 游戏菜单可以开始游戏或退出;
  • 棋盘为 9×9;
  • 默认随机布置 10 个雷;
  • 玩家输入坐标排查雷:
    • 如果该位置是雷,游戏结束;
    • 如果该位置不是雷,显示周围 8 个格子中有几个雷;
  • 当所有非雷位置都被排查出来,游戏胜利;
  • 可以重复游玩。
二、整体设计思路

1. 多文件编程

为了让代码结构清晰,我们把程序拆成三个文件:
文件作用
test.c游戏整体逻辑、菜单循环、main 函数
game.c游戏具体函数的实现
game.h宏定义和函数声明这样做的好处是:main 函数只负责整体流程,具体功能封装成函数,代码更容易阅读和维护。

2. 为什么需要两个棋盘?

扫雷中有一个很关键的问题:
如果某个位置不是雷,我们要显示它周围有几个雷。但是“雷”本身也用数字表示时,容易和“周围雷数”冲突。
例如:
  • 用 1 表示雷;
  • 排查后发现周围有 1 个雷,也要显示 1;
  • 这样就分不清这个 1 到底是雷,还是提示数字。
因此我们使用两个二维数组:
  • mine 数组:存放雷的布置信息;
  • show 数组:存放展示给玩家的信息。
为了统一处理,两个数组都使用字符数组:
  • mine 数组初始化为 '0';
  • 布置雷时把对应位置改成 '1';
  • show 数组初始化为 '*',表示未排查;
  • 排查后把周围雷数转换成字符填入 show。
3. 为什么棋盘要变成 11×11?

排查一个坐标周围有几个雷时,需要访问它周围 8 个格子
4. 字符与数字的转换
mine 数组中存放的是字符 '0' 和 '1'。
统计周围雷数时,如果把 8 个字符相加,得到的是 ASCII 码值之和。
5. find_mine:排查雷

排查逻辑:
  • 展示当前 show 棋盘;
  • 输入坐标;
  • 判断坐标是否合法;
  • 判断该位置是否已经排查过;
  • 如果踩雷,游戏结束,并展示 mine 棋盘;
  • 如果不是雷,统计周围雷数,写入 show 数组;
  • 每成功排查一个非雷位置,remain--;
  • 当 remain == 0,说明所有非雷位置都排查完,游戏胜利。

五、运行效果示意

七、可以继续扩展的功能
这个版本是基础版扫雷,后续可以继续扩展:
  • 标记功能:输入坐标后选择“排查”或“插旗”;
  • 自动展开:如果周围雷数为 0,自动展开周围区域;
  • 难度选择:初级 9×9、中级 16×16、高级 16×30;
  • 计时功能;
  • 显示剩余雷数;
  • 防止第一次踩雷:第一次排查的位置一定不是雷。
总结

通过这个扫雷小游戏,我们练习了:
  • 二维数组的使用;
  • 多文件编程;
  • 函数封装;
  • 随机数生成;
  • 字符与数字的 ASCII 转换;
  • 边界处理;
  • 游戏循环与状态判断。
扫雷虽然规则简单,但非常适合作为 C 语言阶段性练习项目。建议你先照着代码运行一遍,再尝试自己加入“插旗”和“自动展开”功能,这样对数组和函数封装的理解会更深入。



21

主题

0

回帖

235

积分

管理员

积分
235
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

春风AI技术论坛

在本版发帖返回顶部