用织梦后台修改网站logo,wordpress怎样,门户网站兴化建设局,wordpress 主页不显示图片扫雷作为 Windows 经典自带小游戏#xff0c;是很多人的编程启蒙练习 —— 用 C 语言实现一个控制台版本的扫雷#xff0c;既能巩固二维数组、递归、流程控制等核心知识点#xff0c;又能做出一个可玩的小游戏#xff0c;成就感拉满#xff01;本文会从「设计思路」到「完…扫雷作为 Windows 经典自带小游戏是很多人的编程启蒙练习 —— 用 C 语言实现一个控制台版本的扫雷既能巩固二维数组、递归、流程控制等核心知识点又能做出一个可玩的小游戏成就感拉满本文会从「设计思路」到「完整代码」一步步带你实现这个经典游戏。一、写在前面为什么选扫雷练手对 C 语言初学者来说扫雷是绝佳的实战案例核心逻辑不复杂但覆盖「随机数生成」「递归遍历」「边界检查」「用户输入处理」等高频考点控制台版本无需图形库纯原生 C 语言就能实现零环境依赖功能可拓展性强难度选择、计时、排行榜等能逐步进阶。二、扫雷核心规则回顾先明确游戏的核心玩法避免偏离方向游戏界面是 ROWS×COLS 的网格随机隐藏指定数量的地雷玩家可执行两种操作「揭开格子」输入坐标若踩中地雷则游戏失败若未踩雷显示该格子周围 8 邻域的地雷数若周围无雷自动递归揭开相邻格子「标记地雷」对疑似地雷的格子做标记避免误点可取消标记当所有非地雷格子都被揭开时游戏胜利。三、核心设计思路1. 数据结构用二维数组存储游戏状态我们需要两个核心数组分别存储「地雷分布」和「界面显示状态」数组名类型作用说明mine_mapint[][]1 地雷0 非地雷玩家不可见show_mapchar[][]* 未揭开? 标记地雷数字 周围地雷数通过宏定义固定行列数、地雷数方便后续调整难度#define ROWS 10 // 行数#define COLS 10 // 列数#define MINE_NUM 10 // 地雷数量2. 关键逻辑拆解1随机生成地雷利用 rand() 生成随机坐标避免重复放置地雷核心是「先判断坐标是否已有雷再放置」srand((unsigned int)time(NULL)); // 随机数种子基于系统时间while (已放置地雷数 总地雷数) {随机生成行x、列yif (mine_map[x][y] 0) { // 无雷则放置mine_map[x][y] 1;已放置地雷数;}}2计算周围地雷数遍历目标格子的 8 邻域统计其中地雷的数量重点是「边界检查」避免数组越界int count_mine(int x, int y) {int count 0;// 遍历8个方向x-1~x1y-1~y1for (int i x-1; i x1; i) {for (int j y-1; j y1; j) {// 确保坐标在有效范围内if (i 0 i ROWS j 0 j COLS) {if (mine_map[i][j] 1) count;}}}return count;}3递归揭开空白格子这是扫雷的核心体验 —— 点击无雷且周围无雷的格子时自动揭开所有相邻空白区域void open_cell(int x, int y) {// 边界/状态检查越界、已揭开、已标记 → 直接返回if (x0 || xROWS || y0 || yCOLS || show_map[x][y]!*) return;int mine_count count_mine(x, y);// 显示地雷数0则显示空格视觉更友好show_map[x][y] (mine_count 0) ? : (mine_count 0);// 周围无雷 → 递归揭开8邻域if (mine_count 0) {open_cell(x-1, y-1); open_cell(x-1, y); open_cell(x-1, y1);open_cell(x, y-1); open_cell(x, y1);open_cell(x1, y-1); open_cell(x1, y); open_cell(x1, y1);}}4输赢判断胜利条件所有「非地雷且未揭开」的格子数量为 0int is_win() {int unopened_non_mine 0;for (int i0; iROWS; i) {for (int j0; jCOLS; j) {if (show_map[i][j] * mine_map[i][j] 0) {unopened_non_mine;}}}return unopened_non_mine 0; // 无未揭开的非雷格子 → 胜利}四、完整可运行代码以下是完整代码包含「初始化」「界面打印」「输入处理」「游戏主逻辑」注释详细可直接复制编译#include stdio.h#include stdlib.h#include time.h#include conio.h // Windows下获取按键Linux替换为ncurses库// 游戏配置可自定义难度#define ROWS 10#define COLS 10#define MINE_NUM 10// 全局数组地雷地图显示地图int mine_map[ROWS][COLS] {0}; // 1雷0非雷char show_map[ROWS][COLS]; // *未开?标记数字雷数// 初始化地雷地图随机放置地雷void init_mine_map() {int i, j, count 0;srand((unsigned int)time(NULL)); // 随机数种子while (count MINE_NUM) {i rand() % ROWS;j rand() % COLS;if (mine_map[i][j] 0) { // 避免重复放雷mine_map[i][j] 1;count;}}}// 初始化显示地图默认全为*void init_show_map() {for (int i 0; i ROWS; i) {for (int j 0; j COLS; j) {show_map[i][j] *;}}}// 计算指定坐标周围的地雷数量int count_mine(int x, int y) {int count 0;for (int i x-1; i x1; i) {for (int j y-1; j y1; j) {if (i 0 i ROWS j 0 j COLS) {if (mine_map[i][j] 1) count;}}}return count;}// 递归揭开格子核心逻辑void open_cell(int x, int y) {if (x 0 || x ROWS || y 0 || y COLS || show_map[x][y] ! *) {return;}int mine_count count_mine(x, y);show_map[x][y] (mine_count 0) ? : (mine_count 0);// 周围无雷递归揭开相邻格子if (mine_count 0) {open_cell(x-1, y-1); open_cell(x-1, y); open_cell(x-1, y1);open_cell(x, y-1); open_cell(x, y1);open_cell(x1, y-1); open_cell(x1, y); open_cell(x1, y1);}}// 打印游戏界面带行列号操作提示void print_map() {system(cls); // Windows清屏Linux替换为system(clear)// 打印列号printf( );for (int j 0; j COLS; j) {printf(%d , j);}printf(\n);// 打印行号地图for (int i 0; i ROWS; i) {printf(%d , i);for (int j 0; j COLS; j) {printf(%c , show_map[i][j]);}printf(\n);}// 操作说明printf(\n【操作说明】\n);printf(1. 揭开格子输入坐标如 2 3→ 回车\n);printf(2. 标记地雷输入 m 坐标如 m 2 3→ 回车\n);printf(3. 退出游戏输入 q → 回车\n);}// 标记/取消标记地雷void mark_mine(int x, int y) {if (x 0 || x ROWS || y 0 || y COLS) {printf(坐标越界按任意键继续...);_getch();return;}if (show_map[x][y] *) {show_map[x][y] ?; // 标记} else if (show_map[x][y] ?) {show_map[x][y] *; // 取消标记} else {printf(该格子已揭开无法标记按任意键继续...);_getch();}}// 判断是否胜利所有非雷格子都已揭开int is_win() {int unopened 0;for (int i 0; i ROWS; i) {for (int j 0; j COLS; j) {if (show_map[i][j] * mine_map[i][j] 0) {unopened;}}}return unopened 0;}// 游戏主逻辑void game() {int x, y;char op; // 操作类型m标记q退出数字揭开// 初始化地图init_mine_map();init_show_map();while (1) {print_map();// 读取用户操作printf(\n请输入操作);op getchar();if (op q || op Q) { // 退出游戏printf(游戏退出\n);exit(0);} else if (op m || op M) { // 标记地雷scanf(%d %d, x, y);getchar(); // 吸收回车符mark_mine(x, y);} else if (op 0 op 9) { // 揭开格子首字符是行号ungetc(op, stdin); // 把行号放回输入流scanf(%d %d, x, y);getchar(); // 吸收回车符// 边界检查if (x 0 || x ROWS || y 0 || y COLS) {printf(坐标越界按任意键继续...);_getch();continue;}// 踩雷 → 游戏失败if (mine_map[x][y] 1) {print_map();printf( 踩雷了游戏结束 \n);// 显示所有地雷位置for (int i 0; i ROWS; i) {for (int j 0; j COLS; j) {if (mine_map[i][j] 1) {show_map[i][j] ; // 表示地雷}}}print_map();printf(按任意键退出...);_getch();break;}// 揭开格子open_cell(x, y);// 判断胜利if (is_win()) {print_map();printf( 恭喜扫雷成功 \n);printf(按任意键退出...);_getch();break;}} else { // 无效输入getchar(); // 吸收多余字符printf(输入格式错误按任意键继续...);_getch();}}}// 主函数程序入口int main() {printf( C语言控制台扫雷 \n);printf(按任意键开始游戏...\n);_getch(); // 等待按键game();return 0;}五、运行指南不同系统适配1. Windows 系统编译器Dev-C、Visual Studio、MinGW 均可直接编译运行即可conio.h 是 Windows 自带库无需额外安装。2. Linux/macOS 系统需要适配两个点conio.h 是 Windows 专属替换头文件#include conio.h → #include ncurses.h需先安装 ncurses 库sudo apt install libncurses5-dev替换函数_getch() → getch()system(cls) → system(clear)编译时链接 ncurses 库gcc mine_sweeper.c -o mine_sweeper -lncurses。六、游戏操作演示运行程序后按任意键开始游戏揭开格子输入行号 列号如 3 5回车即可揭开该位置标记地雷输入 m 行号 列号如 m 3 5回车标记再次输入可取消标记退出游戏输入 q 回车即可。七、功能扩展思路进阶练习如果想进一步优化可以尝试这些方向难度选择增加初级9×910 雷、中级16×1640 雷、高级16×3099 雷计时功能用 clock() 统计通关时间显示在界面上排行榜将通关时间写入文件实现排行榜功能界面美化用颜色区分地雷、数字、标记Windows 用SetConsoleTextAttributeLinux 用 ncurses 颜色函数鼠标操作结合图形库如 EasyX、SDL实现鼠标点击操作。八、总结这个控制台扫雷游戏虽然简单但完整覆盖了 C 语言的核心知识点二维数组的使用、递归逻辑、边界处理、用户输入容错、随机数生成等。通过实现这个小游戏不仅能加深对语法的理解还能培养「拆解问题→设计逻辑→编码实现」的编程思维。如果你是初学者建议先照着代码敲一遍理解每个函数的作用再尝试修改参数比如调整行列数、地雷数最后动手实现扩展功能 —— 编程的核心是「动手实践」只有多写多改才能真正掌握知识点。