用C语言做扫雷游戏(上)

在学完函数及多文件分装后,我们便可以用所学的知识在VS2026上写一个简单的9*9扫雷游戏,下面我将手把手教你完成这个较为复杂的C语言工程,Come on!(我的扫雷作品放在了git仓库:毛毛C语言/code_small project - Gitee.com,已开源,建议看一看,便于下面讲解。在(下)的最后也有代码展示!)

目录

一. 效果演示:

二. 整体思路

三. 代码准备工作

框架:

菜单:

game函数:

棋盘说明:

灵活化:


一. 效果演示:

二. 整体思路

1. 文件分装:text.c用于装游戏的整体框架;game.c用于装游戏相关的重要函数;game.h用于装 游戏相关的函数及变量的声明。

2. 游戏思路:搭建出整体框架——》打印菜单(menu())——》玩家选择是否进入——》用数组(mine和show)建立棋 盘并初始化(init_board())——》打印棋盘(print_board()) ——》部署地雷(put_mine())——》 排查地雷(pai_mine())并给予提示(find_mine())——》成功或死亡——》循环下一局。已标注出 相关函数及数组名。

三. 代码准备工作

框架:

因为玩家要先进入游戏菜单选择游玩后在进入循环,所以先用do_while循环语句搭建出整体框架:

int main() { int input = 0; do { menu(); scanf("%d", &input); switch (input) { case 1: { game(); break; } case 0: { printf("退出\n"); break; } default: { printf("输入错误\n"); break; } } } while (input); return 0; }

菜单:

注意:玩家输入1为开始,0为退出,其他数字为输入错误,需重新输入。所以input非零可作为循环标志。menu()作为菜单打印函数单独分装在main函数上面,printf函数的头文件在game.h中:

void menu() { printf("------------------------\n"); printf("------ 1-开始 ------\n"); printf("------ 0-退出 ------\n"); printf("------------------------\n"); printf("请选择:"); }

game函数:

game()作为游戏主体函数,在game()中还有其他分工明确的子函数,他们是按照游戏思路进行排序:

void game() { //引入棋盘数组 char mine[11][11] = { 0 }; char show[11][11] = { 0 }; //初始化 init_board(mine, 11, 11, '0'); init_board(show, 11, 11, '*'); //打印 print_board(show, 11, 11); //部署雷 put_mine(mine, 11, 11); //排雷 pai_mine(mine, show, 11, 11); }

这些子函数都是我们提前规划好各自作用的,要在game.c中实现(下一篇讲解)并在game.h(下面演示)中声明:

//初始化 void init_board(int arr[11][11], int r, int c, char in); //打印 void print_board(char arr[ROWS][COLS], int r, int c); //部雷 void put_mine(char mine[ROWS][COLS], int r, int c); //排雷 void pai_mine(mine, show, r, c);

棋盘说明:

在game中棋盘数组有两个:mine是内部部署地雷棋盘,用于判断玩家排雷状态;show是外部显示棋盘,用于打印在显示屏上给玩家判断。这时细心的同学就发现我们要做9*9扫雷游戏,但两个数组均为11*11的。是我写错了吗?当然不是,这是因为在9*9的数组中,当玩家排查地雷时,游戏需要判断周围8格地雷个数,当在边缘时,数组访问可能会越界,所以用11*11的数组更加方便判断,下面有配图:

灵活化:

这时为了让期盼类型更加灵活,可以将棋盘相关参数转变为变量,行:ROWS,列:COLS,效果如下:

void game() { //棋盘数组 char mine[ROWS][COLS] = { 0 }; char show[ROWS][COLS] = { 0 }; //初始化 init_board(mine, ROWS, COLS, '0'); init_board(show, ROWS, COLS, '*'); //打印 print_board(show, ROWS, COLS); //部署雷 put_mine(mine, ROWS, COLS); //排雷 pai_mine(mine, show, ROWS, COLS); }

这些相关变量在game.h中进行声名:

#define ROW 9//行 #define COL 9//列 #define ROWS ROW+2 #define COLS COL+2

ROW和COL分别表示游戏区域的行和列,ROWS和COLS表示整个棋盘行和列,因为后者要比前者大一圈,所以ROWS=ROW+2,COLS=COL+2。

好了,以上是准备工作,下一篇博客,我将对game函数中的子函数进行逐一讲解,敬请期待!