
头文件头文件部分主要完成以下工作#include stdio.h #include stdlib.h #include time.h // 定义棋盘尺寸 #define ROW 9 // 玩家可见的行数9×9 棋盘 #define COL 9 // 玩家可见的列数 #define ROWS (ROW 2) // 实际存储时增加一圈边界总行数为 11 #define COLS (COL 2) // 实际存储时增加一圈边界总列数为 11 // 定义雷的数量简单模式 #define EASY_COUNT 10 // 共布置 10 颗雷 // 声明四个核心函数的原型 void InitBoard(char board[ROWS][COLS], int row, int col, char ch); // 初始化棋盘用指定字符填充 void PrintBoard(char board[ROWS][COLS], int row, int col); // 打印当前棋盘状态玩家视角 void SetMine(char board[ROWS][COLS], int row, int col); // 布置雷随机放置 EASY_COUNT 颗雷 void FindMine(char board[ROWS][COLS], int row, int col); // 排雷逻辑根据用户输入坐标进行探查实现细节#pragma once用于防止头文件被重复包含避免编译时出现重复定义错误。ROW和COL定义为 9表示玩家实际可见的棋盘尺寸ROWS和COLS定义为 11即在 9×9 棋盘外围额外增加一圈。这样在统计边界格子周围雷数时无需额外判断越界情况可直接访问外圈数据。EASY_COUNT设为 10表示简单模式下布置 10 颗雷该数值可根据难度需求灵活调整。四个函数原型分别对应初始化棋盘InitBoard、打印棋盘DisplayBoard、布置雷SetMine和排查雷FindMine其具体实现均位于功能模块中#pragma once #includestdio.h #includestdlib.h #includetime.h #define ROW 9 #define COL 9 #define ROWS ROW2 #define COLS COL2 #define EASY_COUNT 10 //棋盘初始化 void InitBoard(char arr[ROWS][COLS], int rows,int cols,char set); //打印棋盘 void DisplayBoard(char arr[ROWS][COLS],int row,int col); //打印棋盘 void SetMine(char arr[ROWS][COLS], int row, int col); //排查雷 void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);功能模块功能模块是扫雷游戏的核心实现包含以下函数打印格式示例1 2 3 4 5 6 7 8 9 10 1 * * * * * * * * * * 2 * * * * * * * * * * 3 * * * * * * * * * * ...实现要点示例代码void DisplayBoard(char show[ROW][COL]) { printf( ); for (int j 0; j COL; j) { printf(%d , j 1); } printf(\n); for (int i 0; i ROW; i) { printf(%2d , i 1); // 行号 for (int j 0; j COL; j) { printf(%c , show[i][j]); } printf(\n); } }SetMine随机布置雷该函数负责在棋盘上随机放置指定数量的地雷由常量EASY_COUNT决定例如 10 颗。采用随机数生成器rand()和种子初始化srand(time(NULL))来保证每次运行结果不同。核心逻辑注意事项示例代码void SetMine(char board[ROW][COL]) { int count 0; while (count EASY_COUNT) { int x rand() % ROW; int y rand() % COL; if (board[x][y] 0) { // 未布雷 board[x][y] 1; // 布雷 count; } } }GetMine统计周围雷数静态辅助函数这是一个静态辅助函数用于计算某个特定坐标(row, col)周围 3×3 区域内的地雷总数。原理说明特别技巧示例代码static int GetMine(char board[ROW][COL], int row, int col) { int count 0; for (int i -1; i 1; i) { for (int j -1; j 1; j) { int nr row i; int nc col j; if (nr 0 nr ROW nc 0 nc COL) { if (board[nr][nc] 1) { count; } } } } return count; }FindMine玩家排雷主逻辑这是游戏的核心流程函数负责接收玩家输入、验证操作合法性并推进游戏进程。主要流程如下辅助优化建议示例结构框架void FindMine(char board[ROW][COL], char show[ROW][COL]) { int count 0; // 已排查的安全格子数 int totalSafe ROW * COL - EASY_COUNT; while (count totalSafe) { int row, col; printf(请输入要排查的行和列1~%d, 1~%d: , ROW, COL); scanf(%d %d, row, col); row--; col--; // 转换为0索引 // 校验坐标 if (row 0 || row ROW || col 0 || col COL) { printf(坐标超出范围请重新输入\n); continue; } // 检查是否已排查 if (show[row][col] ! *) { printf(该位置已排查请勿重复操作\n); continue; } // 检查是否踩雷 if (board[row][col] 1) { printf(你踩到雷了游戏结束\n); show[row][col] X; // 标记爆炸 DisplayBoard(show); return; } // 安全翻开 int mineCount GetMine(board, row, col); show[row][col] 0 mineCount; count; // 可选扩展展开逻辑递归 // ExpandSafeArea(board, show, row, col); DisplayBoard(show); } printf(恭喜你成功排雷游戏胜利\n); }✅ 总结以上五个函数共同构成了一个完整、可运行的简易扫雷游戏框架。它们分别承担初始化、可视化、布雷、智能统计与核心交互逻辑具备良好的模块化设计易于扩展如增加难度等级、标记功能、计时器等。适用于教学演示、算法练习或小型项目开发。### InitBoard初始化棋盘 该函数用于创建并初始化游戏棋盘将一个二维数组的所有元素设置为指定字符。在本游戏中棋盘分为两个区域 - **雷区隐藏区域**用字符 0 表示代表该位置尚未被探测可能藏有地雷。 - **显示区玩家可见区域**用字符 * 表示初始状态下所有格子均处于未揭示状态等待玩家点击排查。 具体实现步骤如下 1. 定义一个全局或局部的二维字符数组 board[ROW][COL]大小由宏定义控制如 #define ROW 9、#define COL 10。 2. 使用双重循环遍历整个棋盘将每个元素赋值为 0雷区表示待探测。 3. 同时为显示区创建另一个相同大小的二维数组 show[ROW][COL]初始化为 *用于呈现给玩家的界面。 示例代码片段 c void InitBoard(char board[ROW][COL], char show[ROW][COL]) { for (int i 0; i ROW; i) { for (int j 0; j COL; j) { board[i][j] 0; // 雷区默认为 0 show[i][j] *; // 显示区默认为 * } } }DisplayBoard打印棋盘此函数负责以清晰直观的方式展示当前游戏状态帮助玩家了解棋盘布局和已探查情况。功能特点包括输出顶部列号从 1 到COL便于定位列坐标每行前输出行号从 1 到ROW方便识别行位置逐行打印显示区内容根据show数组中的字符决定显示形式若为*则显示为未探测状态若为数字如1,2等则显示周围雷数若为 空格或其它特殊标记则表示已安全翻开且无邻雷。第一行先打印列号使用printf( )起始对齐使用嵌套循环遍历show数组每行开头打印行号注意格式化输出确保对齐整齐提升可读性。初始化随机种子通常在主函数中调用一次循环执行EASY_COUNT次每次生成一对随机坐标(x, y)判断该坐标是否已有雷即board[x][y] 1若无雷则将其设为1表示有雷重复直到布满所有雷为止。坐标范围应限制在[0, ROW-1]与[0, COL-1]之间可加入防重复机制避免同一位置多次布雷推荐使用do-while或while循环配合条件判断来确保不重复。以目标点为中心检查其上下左右及四个对角方向共 8 个相邻格子对每个有效邻居坐标进行越界检测防止访问数组越界若邻居格子为1则计数加一最终返回雷的数量以整数形式返回将数字转换为字符0 num可将数字转为对应字符由于board中存储的是字符因此比较时需注意类型匹配。循环接收坐标输入持续提示玩家输入要排查的位置行、列合法性校验检查坐标是否在有效范围内1~ROW和1~COL若超出范围提示“坐标无效请重新输入”重复排查检测检查该位置是否已被打开即show[row][col] ! *若已打开提示“该位置已排查请勿重复操作”踩雷判定若该位置是雷board[row][col] 1则触发失败逻辑打印“你踩到雷了游戏结束”并退出游戏安全翻开处理若非雷则调用GetMine获取周围雷数将结果显示在show数组中如1,2等记录已排查格子数count胜利判断当已排查格子数等于总格子数减去雷数即ROW*COL - EASY_COUNT时表示全部安全区域已打开提示“恭喜你成功排雷游戏胜利”并结束游戏。可引入递归或队列展开机制当某格子周围无雷时自动展开其相邻所有安全格子类似扫雷经典行为支持“标记雷”功能如输入flag指令增强策略性。实现细节InitBoard使用双重循环遍历整个 ROWS×COLS 数组将每个元素初始化为指定字符。雷区设为 0显示区域设为 *便于后续判断是否为雷——只需检查字符是否为 1。DisplayBoard先输出一行列号0 到 col方便玩家定位随后从第 1 行开始逐行打印每行先输出行号再依次输出该行各格内容使用%-2c确保对齐整齐。SetMine通过rand() % row 1生成 1 到 row 之间的随机行号同理生成列号若该位置当前为 0无雷则置为 1并减少剩余布雷数重复此过程直至成功布置 10 颗雷。GetMine以坐标 (x, y) 为中心遍历其周围的 3×3 区域将每个格子的字符转为数字减去 0后累加返回周围雷的总数。由于外围多出一圈边界格子也能安全访问。FindMine进入无限循环持续接收玩家输入坐标首先验证坐标是否在有效范围1 到 row/col内并检查该位置是否已被打开show[x][y] 是否仍为 *若踩中雷mine[x][y] 1则显示完整雷盘并结束游戏否则调用 GetMine 统计周围雷数写入显示盘并刷新界面每成功排查一格win 计数加一当 win 等于总格数减去雷数时提示玩家胜利#define _CRT_SECURE_NO_WARNINGS 1 #includegame_sl.h void InitBoard(char arr[ROWS][COLS], int rows, int cols,char set) { int i 0; for (i0;irows;i) { int j 0; for (j0;jcols;j) { arr[i][j] set; } } } void DisplayBoard(char arr[ROWS][COLS], int row, int col) { int i 0; //打印列号 printf(-------扫雷游戏------\n); for (i0;icol;i) { printf(%-2d ,i); } printf(\n); for (i1;irow;i) { int j 0; printf(%-2d ,i); for (j 1; j col; j) { printf(%-2c ,arr[i][j]); } printf(\n); } } void SetMine(char arr[ROWS][COLS], int row, int col) { int count EASY_COUNT; while (count) { int x rand() % row 1; int y rand() % col 1; if (arr[x][y]0) { arr[x][y] 1; count--; } } } static int GetMine(char mine[ROWS][COLS],int x,int y) { int i 0; int count 0; for (ix-1;ix1;i) { int j 0; for (jy-1;jy1;j) { count (mine[i][j] - 0); } } return count; } void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int x 0; int y 0; int win 0; while (1) { printf(请输入要排查的坐标); scanf(%d %d, x, y); //判断坐标有效性 if (x 1 x row y 1 y col) { if (show[x][y] *) { if (mine[x][y] 1) { printf(很遗憾你被炸死了\n); DisplayBoard(mine, ROW, COL); break; } else { //统计周围有几个雷 int count GetMine(mine, x, y); show[x][y] count 0; DisplayBoard(show, ROW, COL); win; } } else { printf(该坐标已经被排查了重新输入坐标\n); } } else { printf(坐标非法请重新输入\n); } } if (winrow*col-EASY_COUNT) { printf(恭喜你排雷成功\n); DisplayBoard(mine,ROW,COL); } }测试模块测试模块负责游戏的入口和流程控制menu打印游戏菜单提供开始游戏和退出游戏两个选项。game完成一局游戏的完整流程包括初始化棋盘、布置雷、打印棋盘和排雷。test主循环根据用户输入调用菜单和游戏函数支持反复游玩直到选择退出。main程序入口调用test()启动整个游戏。实现细节menu使用printf打印一个简单的菜单界面显示「1.玩游戏」和「0.退出游戏」两个选项供玩家选择。game先定义两个二维数组mine雷盘和show显示盘调用InitBoard分别用0和*初始化调用SetMine随机布置 10 颗雷调用DisplayBoard打印初始显示盘最后调用FindMine进入排雷流程。test先用srand((unsigned int)time(NULL))设置随机数种子保证每次运行雷的位置不同然后进入do-while循环打印菜单并读取用户输入用switch判断输入 1 调用game()开始游戏输入 0 打印退出信息并结束循环其他输入提示重新选择。main直接调用test()启动整个游戏流程返回 0 表示程序正常结束。#define _CRT_SECURE_NO_WARNINGS 1 #includegame_sl.h void menu() { printf(\n); printf( 1.玩游戏 \n); printf( 0.退出游戏 \n); printf(*\n); } void game() { //完成扫雷游戏 char mine[ROWS][COLS] {0}; char show[ROWS][COLS] {0}; //初始化棋盘 InitBoard(mine, ROWS, COLS,0); InitBoard(show, ROWS, COLS,*); //布置雷 SetMine(mine,ROW,COL); //DisplayBoard(mine, ROW, COL); // /打印棋盘 DisplayBoard(show, ROW, COL); //排查雷 FindMine(mine, show, ROW, COL); } void test() { int input 0; srand((unsigned int)time(NULL)); do { menu(); printf(请选择:); scanf(%d,input); switch (input) { case 1: //printf(扫雷\n); game(); break; case 0: printf(游戏结束退出游戏\n); break; default: printf(选择错误重新选择\n); break; } } while (input); } int main() { test(); return 0; }整体流程说明下图展示了扫雷游戏从启动到结束的完整流程每个步骤对应的函数名已标注在节点中。flowchart TD A[main 程序入口] -- B[test 主循环] B -- C[menu 打印菜单] C -- D{用户选择} D -- 输入 1 -- E[game 开始一局游戏] D -- 输入 0 -- F[退出游戏] D -- 其他输入 -- C E -- G[InitBoard 初始化棋盘] G -- H[SetMine 随机布置雷] H -- I[DisplayBoard 打印棋盘] I -- J[FindMine 玩家输入坐标] J -- K{坐标是否合法} K -- 否 -- J K -- 是 -- L{是否已排查} L -- 是 -- J L -- 否 -- M{是否踩雷} M -- 是 -- N[打印雷盘 游戏结束] M -- 否 -- O[GetMine 统计周围雷数] O -- P[更新显示盘并打印] P -- Q{已排查数是否等于总格数减雷数} Q -- 否 -- J Q -- 是 -- R[打印胜利信息 游戏结束] N -- B R -- B流程要点入口与循环main函数调用test()进入主循环首先打印菜单根据用户输入决定是否开始游戏或退出。开局准备game()函数依次执行InitBoard初始化雷盘与显示盘、SetMine随机布置 10 颗地雷并通过DisplayBoard输出初始棋盘状态。排雷循环FindMine进入核心循环玩家输入坐标后系统依次校验坐标的合法性、是否已排查过以及是否踩中地雷若未踩雷则调用GetMine统计该格周围地雷数量并更新显示盘。胜负判定若踩中地雷显示雷盘并结束本局当成功排查的格子数达到总格数减去地雷数时提示胜利随后返回主循环等待下一局开始。