C 语言数组 + 函数实战|控制台扫雷游戏完整详解✨(多文件模块化)
目录前言扫雷游戏整体需求分析游戏核心设计思路 3.1 二维数组结构设计 3.2 数组防越界处理 ️3.3 模块化文件结构设计完整分文件代码实现 4.1 game.h 头文件代码 4.2 game.c 游戏功能函数实现 4.3 test.c 主逻辑与菜单交互游戏运行流程讲解▶️游戏进阶扩展功能本次项目核心知识点总结总结1. 前言扫雷作为经典怀旧桌面小游戏超级适合C 语言初学者练手二维数组、函数封装、多文件编程、随机数应用本文采用标准分文件规范写法逻辑清晰易懂、结构工整漂亮VS 直接复制就能编译运行✅零基础小白也能轻松看懂同时附带超多游戏拓展优化方向。2. 扫雷游戏整体需求分析本次控制台扫雷完美实现核心功能循环游戏菜单自由选择开始游戏、退出程序9*9 标准经典棋盘随机生成 10 个不重复地雷用户输入坐标排查格子踩到地雷游戏结束展示全部雷位未踩雷显示当前格子周围 8 格地雷数量排查完所有安全格子游戏胜利通关严格非法坐标判断❌防止输入错误导致程序崩溃双层棋盘分离数据雷信息与界面展示互不干扰3. 游戏核心设计思路3.1 二维数组结构设计游戏使用两个独立字符二维数组分工存储数据mine[11][11]隐藏神秘棋盘存放地雷真实布局0无雷安全区域1危险地雷区域show[11][11]玩家可视化棋盘初始全部为*隐藏未排查区域排查后自动显示周围地雷提示数字双数组分离设计避免地雷信息与提示数字冲突逻辑干净又规范。3.2 数组防越界处理️正常游戏区域是 99但是棋盘边缘格子统计周围 8 格地雷时坐标很容易超出数组下标造成数组越界程序崩溃❗超简单解决方案数组定义为 **1111**92只使用中间1~9行 1~9列作为游戏区域外围一圈当做安全缓冲边界完美规避越界问题3.3 模块化文件结构设计️严格遵循 C 语言工程化编程规范拆分为三个文件test.c主函数、菜单交互逻辑、游戏循环调用game.c初始化棋盘、打印棋盘、布置雷、排查雷全部功能实现game.h宏常量定义、头文件包含、函数声明自带防重复包含4. 完整分文件代码实现4.1 game.h 头文件#pragma once #include stdio.h #include stdlib.h #include time.h #define EASY_COUNT 10 #define ROW 9 #define COL 9 #define ROWS ROW2 #define COLS COL2 //初始化棋盘 void InitBoard(char board[ROWS][COLS], int rows, int cols, char set); //打印棋盘 void DisplayBoard(char board[ROWS][COLS], int row, int col); //布置雷 void SetMine(char board[ROWS][COLS], int row, int col); //排查雷 void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);4.2 game.c 游戏功能函数实现#include game.h void InitBoard(char board[ROWS][COLS], int rows, int cols, char set) { int i 0; for (i 0; i rows; i) { int j 0; for (j 0; j cols; j) { board[i][j] set; } } } void DisplayBoard(char board[ROWS][COLS], int row, int col) { int i 0; printf(--------扫雷游戏-------\n); for (i 0; i col; i) { printf(%d , i); } printf(\n); for (i 1; i row; i) { printf(%d , i); int j 0; for (j 1; j col; j) { printf(%c , board[i][j]); } printf(\n); } } void SetMine(char board[ROWS][COLS], int row, int col) { int count EASY_COUNT; while (count) { int x rand() % row 1; int y rand() % col 1; if (board[x][y] 0) { board[x][y] 1; count--; } } } int GetMineCount(char mine[ROWS][COLS], int x, int y) { return (mine[x-1][y]mine[x-1][y-1]mine[x][y - 1]mine[x1][y-1] mine[x1][y]mine[x1][y1]mine[x][y1]mine[x-1][y1] - 8 * 0); } void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int x 0; int y 0; int win 0; while (win row*col- EASY_COUNT) { printf(请输入要排查的坐标:); scanf(%d %d, x, y); if (x 1 x row y 1 y col) { if (mine[x][y] 1) { printf(很遗憾你被炸死了\n); DisplayBoard(mine, ROW, COL); break; } else { int count GetMineCount(mine, x, y); show[x][y] count 0; DisplayBoard(show, ROW, COL); win; } } else { printf(坐标非法重新输入\n); } } if (win row * col - EASY_COUNT) { printf(恭喜你排雷成功\n); DisplayBoard(mine, ROW, COL); } }4.3 test.c 主逻辑与菜单交互#include game.h void menu() { printf(***********************\n); printf(***** 1. play *****\n); printf(***** 0. exit *****\n); printf(***********************\n); } void game() { char mine[ROWS][COLS]; char show[ROWS][COLS]; InitBoard(mine, ROWS, COLS, 0); InitBoard(show, ROWS, COLS, *); DisplayBoard(show, ROW, COL); SetMine(mine, ROW, COL); FindMine(mine, show, ROW, COL); } int main() { int input 0; srand((unsigned int)time(NULL)); do { menu(); printf(请选择:); scanf(%d, input); switch (input) { case 1: game(); break; case 0: printf(退出游戏\n); break; default: printf(选择错误重新选择\n); break; } } while (input); return 0; }5. 游戏运行流程讲解▶️主函数初始化随机数种子保证每一局地雷位置都不一样打印精美游戏菜单玩家自由选择开始 / 退出双棋盘初始化雷盘全 0展示盘全*✨随机在 9*9 区域布置 10 个不重复地雷循环等待玩家输入坐标判断坐标合法性 → 判断是否踩到地雷安全格子自动计算周围雷数更新游戏界面清空所有安全格子✅胜利踩到地雷❌失败结束6. 游戏进阶扩展功能多难度切换⚖️简单 99/10 雷、中等 1616/40 雷、困难 30*16/99 雷修改宏定义一键切换空白区域递归自动展开周围无雷时自动连片翻开完美还原原版经典扫雷体验地雷标记插旗功能防止误点雷区手动标记可疑危险位置游戏计时功能⏱️记录玩家通关时长比拼最快排雷速度禁止重复点开同一格子增加逻辑判断避免计分异常、重复操作 bug7. 本次项目核心知识点总结二维字符数组棋盘存储与循环遍历操作函数模块化封装分工清晰、代码易维护C 语言多文件工程编程规范头文件声明 源文件实现rand()、srand()结合时间戳生成随机游戏坐标数组下标边界精细处理杜绝越界崩溃问题ASCII 码特性数字与字符轻松算术转换多层循环 分支判断胜利、失败、循环菜单完整逻辑8. 总结C 语言扫雷绝对是新手入门必做神仙小项目一次性串联数组、循环、分支、函数、分文件全部核心基础知识点。代码简洁工整无冗余复制到 VS 就能一键编译运行后续搭配递归即可实现自动展开游戏体验直接拉满新手亲手敲一遍代码二维数组和函数运用能力直接飞跃提升