【C语言】实现简单扫雷游戏(详解)

🍃内容专栏:【C语言】初阶部分

🍂本文概括:学完函数和二维数组之后,立马上手写一个扫雷游戏的代码,提升自己的代码运用能力和知识点梳理。

🍁本文作者:心已入冬_

🍀发布时间:2023.2.1

一、扫雷游戏规则

相信小伙伴们都玩过扫雷游戏,了解一定的简单逻辑规则,如果小伙伴忘记了或者不知道的小伙伴我们先了解一下游戏规则吧。

游戏规则:

在一块N*N的网格中,随机会布置N个雷,左键随机点击一个方格,若方格是雷会显示“被炸死”,方格不是雷,方格即被打开并显示出方格中的数字;方格中数字则表示其周围的8个方格隐藏了几颗雷;如果点开的格子为空白格,即其周围有0颗雷,则其周围格子自动打开;如果其周围还有空白格,则会引发连锁反应;在你认为有雷的格子上,点击右键即可标记雷。

 网页版扫雷游戏:扫雷游戏网页版  点击网页版扫雷,了解游戏逻辑。

二、代码文件的设计

首先,我们用VS2019编译器在编写小游戏之前,需要创建一个源(.h)文件和两个.c文件。

test.c文件:主要用于整体逻辑的测试

game.c文件:用于编写游戏相关的函数实现

game.h文件:用于编写游戏相关的函数声明及其头文件包含、定义标识符

三、游戏逻辑的设计

预先说明:我们这里实现的简单扫雷游戏,并不能实现点击功能,只能根据坐标输入形式进行排雷。

 逻辑分析:我们先需要一个N*N的棋盘,这里我们用9*9的棋盘为例,随机放置10个雷,而棋盘的存储需要一个二维数组,我们考虑用“1”布置雷,“0”则表示非雷。为什么不用像“*”、“#”之类的字符,(因为后面判断统计雷的个数情况较复杂,这里预先考虑“0”或者“1”。)观察以下图片,假设🔴是我们排查的雷的坐标(1,1),🔴的周围有1个“1”,代表我们目前排雷的坐标不是雷,且周围有1个雷,那么我们需要统计周围的雷,雷的个数为1,那么是将🔴的坐标的“0”置换为“1”吗,此时被置换为“1”后,不又布置了1个雷吗,这不就冲突了吗?此时我要的是统计周围雷的个数,所以我们需要创建两个二维数组,一个二维数组用来存储“0”或“1”的数据,另一个用来统计周围有若干个雷的数据。再次观察 🔴周围的三个蓝色坐标部分为有效部分,那么,访问并统计周围其他五个坐标时,不就属于数组越界访问了吗?针对这个问题,我们将数组的行和列分别都加上2,这样在统计时以免越界访问,我们暂且称之为虚拟棋盘的大小,而数据的存放和打印我们仅使用蓝色部分的棋盘,我们暂且称之为实际棋盘的大小

我们逻辑理清 后,再一步步编写代码。

 

 🔴 表示选中的坐标;绿色数组表示坐标序号;红方框表示的都是“1”,布置的10个雷,以便分析方便观察;

1.设置游戏菜单

我们从test.c文件开始编写,游戏开始前,需要有一个菜单页面,我们编写到menu()函数之中。

我们希望玩一把不过瘾,想接着继续玩,考虑使用do……while循环结构,选择“1”,我们Play游戏(先写个game()函数);当不想玩了,我们选择“0”,退出游戏,跳出循环;输入其他值,显示“输入有误,请重新选择。”让你重新选择。所以考虑循环里面嵌套一个switch语句。

 test.c文件

#define  _CRT_SECURE_NO_WARNINGS 
//用于整体逻辑的测试
#include "game.h"
void menu()
{printf("********************\n");printf("******扫雷游戏******\n");printf("******1.Play********\n");printf("******0.Exit********\n");printf("********************\n");
}
void game()
{}
int main()
{int input = 0;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;
}

2.存储棋盘数据及初始化棋盘

首先我们需要先编写一个mine数组,来存放雷的相关信息,数组元素是“0”“1”。编写另一个数组show数组,用来表示排查出雷的信息,该数组全部遍历为“*”,以保持隐匿,当排查不是雷的时候,周围的雷的个数就会替换“*”,所以两个数组元素类型我们统一用char类型的数组,两个数组的元素个数我们统一用虚拟棋盘大小来算。

1.存储数据:我们定义标识符常量ROW、COL实际棋盘的大小ROWS、COLS虚拟棋盘的大小EASY_COUNT为放置雷的个数(简单版本)。

2.我们创建一个InitBoard()来初始化棋盘,初始化两个数组,我们分别传进两个数组,虚拟棋盘大小,以及要初始化的元素(“0”“*”)。

#define  _CRT_SECURE_NO_WARNINGS 
//用于整体逻辑的测试
#include "game.h"
void menu()
{printf("********************\n");printf("******扫雷游戏******\n");printf("******1.Play********\n");printf("******0.Exit********\n");printf("********************\n");
}
void game()
{//存储数据 char mine[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };//初始化棋盘InitBoard(mine,ROWS,COLS,'0');InitBoard(show,ROWS,COLS,'*');}
int main()
{int input = 0;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;
}

game.h文件

#define  _CRT_SECURE_NO_WARNINGS
//用于游戏相关函数的声明及头文件包含
#include
//实际棋盘大小
#define ROW 9
#define COL 9  //虚拟棋盘大小
#define ROWS ROW + 2
#define COLS COL + 2//放置雷的个数(简单版本)
#define EASY_COUNT 10//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set);

 game.c文件

#define  _CRT_SECURE_NO_WARNINGS 
//用于游戏相关函数的具体实现
#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;}}
}

2.打印棋盘 

紧接着,我们创建写一个DisplayBoard()函数来打印棋盘。我们试着先打印mine数组和show数组,需要打印的是实际棋盘的大小,所以传入ROWCOL就行。

test.c文件

#define  _CRT_SECURE_NO_WARNINGS 
//用于整体逻辑的测试
#include "game.h"
void menu()
{printf("********************\n");printf("******扫雷游戏******\n");printf("******1.Play********\n");printf("******0.Exit********\n");printf("********************\n");
}void game()
{//存储数据 char mine[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };//初始化棋盘InitBoard(mine,ROWS,COLS,'0');InitBoard(show,ROWS,COLS,'*');//打印棋盘DisplayBoard(show, ROW, COL);DisplayBoard(mine, ROW, COL);}
int main()
{int input = 0;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;
}

 game.h文件

#define  _CRT_SECURE_NO_WARNINGS
//用于游戏相关函数的声明 及头文件包含
#include//实际棋盘大小
#define ROW 9
#define COL 9  //虚拟棋盘大小
#define ROWS ROW + 2
#define COLS COL + 2//放置雷的个数(简单版本)
#define EASY_COUNT 10//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set);//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col);

 game.c文件

#define  _CRT_SECURE_NO_WARNINGS 
//用于游戏相关函数的具体实现
#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)
{printf("*****-- 扫雷 --*****\n");  //作分隔栏,以免观察混淆int i = 0;for (i = 0; i <= row; 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");}
}

代码打印如下

 

 3.放置雷

 接下来,我们需要设置随机10个雷的遍布,我们编写一个SetMine()函数,需要传入mine数组,需要用到实际棋盘的大小,传入ROWCOL即可。

test.文件

#define  _CRT_SECURE_NO_WARNINGS 
//用于整体逻辑的测试
#include "game.h"
void menu()
{printf("********************\n");printf("******扫雷游戏******\n");printf("******1.Play********\n");printf("******0.Exit********\n");printf("********************\n");
}void game()
{//存储数据 char mine[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };//初始化棋盘InitBoard(mine,ROWS,COLS,'0');InitBoard(show,ROWS,COLS,'*');//打印棋盘DisplayBoard(show, ROW, COL);//放置雷SetMine(mine,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;
}

 game.h文件

SetMine()函数需要用到库函数rand()srand(),因此需要引用头文件

#define  _CRT_SECURE_NO_WARNINGS
//用于游戏相关函数的声明 及头文件包含
#include
#include
#include
//实际棋盘大小
#define ROW 9
#define COL 9  //虚拟棋盘大小
#define ROWS ROW + 2
#define COLS COL + 2//放置雷的个数(简单版本)
#define EASY_COUNT 10//初始化棋盘
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 mine[ROWS][COLS], int row, int col);

game.c文件

#define  _CRT_SECURE_NO_WARNINGS 
//用于游戏相关函数的具体实现
#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)
{printf("*****-- 扫雷 --*****\n");int i = 0;for (i = 0; i <= row; 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 mine[ROWS][COLS], int row, int col)
{int count = EASY_COUNT; //将雷的个数放进计数变量while (count){int x = rand() % row + 1;  //余数范围 1 ~ rowint y = rand() % col + 1;  //余数范围 1 ~ colif (mine[x][y] == '0') //'0'为非雷{mine[x][y] = '1'; //当坐标为非雷,放置雷count--; //每放置一次雷,count--}}
}

 在写完SetMine()函数,我们再次调用DisplayBoard()函数,发现棋盘随机放置了十个“1”,说明放置雷成功!

4.排查雷 

 我们随机放置雷成功后,接下来需要写一个FindMine()函数来排查雷,设计到mine数组和show数组,需要按9*9的序号输入坐标,判断坐标的非法性,所以我们传入ROWCOL

test.c文件

#define  _CRT_SECURE_NO_WARNINGS 
//用于整体逻辑的测试
#include "game.h"
void menu()
{printf("********************\n");printf("******扫雷游戏******\n");printf("******1.Play********\n");printf("******0.Exit********\n");printf("********************\n");
}void game()
{//存储数据 char mine[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };//初始化棋盘InitBoard(mine,ROWS,COLS,'0');InitBoard(show,ROWS,COLS,'*');//打印棋盘DisplayBoard(show, ROW, COL);//放置雷SetMine(mine,ROW,COL);DisplayBoard(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;
}

 game.h文件

#define  _CRT_SECURE_NO_WARNINGS
//用于游戏相关函数的声明 及头文件包含
#include
#include
#include
//实际棋盘大小
#define ROW 9
#define COL 9  //虚拟棋盘大小
#define ROWS ROW + 2
#define COLS COL + 2//放置雷的个数(简单版本)
#define EASY_COUNT 10//初始化棋盘
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 mine[ROWS][COLS], int row, int col);//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

 这里我们需要再编写一个GetMineCount()函数,用于统计该位置(该位置不是雷的情况下)旁边8个坐标雷的个数。但是我们发现统计雷的个数时,“1”是char字符类型,而不是整型数字啊,于是我们考虑将每个字符减去一个‘0’,不就转换为整型了吗?(“1” - “0” = 1,字符“1”的ASCII码值为49,‘0’的ASCII码值为48,相减就得到了1)

 game.c文件

#define  _CRT_SECURE_NO_WARNINGS 
//用于游戏相关函数的具体实现
#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)
{printf("*****-- 扫雷 --*****\n");int i = 0;for (i = 0; i <= row; 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 mine[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count--;}}
}//获取该位置周围雷的个数
int GetMineCount(char mine[ROW][COLS], int x, int y)
{return (mine[x - 1][y - 1] +mine[x][y - 1] +mine[x + 1][y - 1] +mine[x + 1][y] +mine[x + 1][y + 1] +mine[x][y + 1] +mine[x - 1][y + 1] +mine[x - 1][y] - 8 * '0');
}//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int count = 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 (show[x][y] == '*') //当show数组为*时,我们进行排雷{if (mine[x][y] == '1'){printf("很遗憾,你被炸死了\n");DisplayBoard(mine, ROW, COL); //再次显示棋盘,自己如何被炸死的break;}else{//该坐标不是雷,就统计周围有几个雷count = GetMineCount(mine, x, y); show[x][y] = count + '0'; //再次转换为char类型DisplayBoard(show, ROW, COL); //显示周围雷的信息win++; //每排查一次成功win++}}else {printf("该位置已经被排查\n");  //非*时,说明已经被排查过了}}else{printf("坐标非法,请重新输入\n");}}//非雷的位置都排查完了 while循环跳出来判断游戏结束if (win == row * col - EASY_COUNT) {printf("恭喜你,排雷成功!\n");}}

5.测试代码 

这里我们定义10个雷不好作测试,如果一个个去排查,会有一定的难度。所以我们暂且直接将EASY_COUNT改为80个,我们将showmine数组都用DisplayBoard()打印出来,以方便测试。

test.c文件

#define  _CRT_SECURE_NO_WARNINGS 
//用于整体逻辑的测试
#include "game.h"
void menu()
{printf("********************\n");printf("******扫雷游戏******\n");printf("******1.Play********\n");printf("******0.Exit********\n");printf("********************\n");
}void game()
{//存储数据 char mine[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };//初始化棋盘InitBoard(mine,ROWS,COLS,'0');InitBoard(show,ROWS,COLS,'*');//打印棋盘DisplayBoard(show, ROW, COL);//布置雷SetMine(mine,ROW,COL);DisplayBoard(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;
}

 game.h文件

#define  _CRT_SECURE_NO_WARNINGS
//用于游戏相关函数的声明 及头文件包含
#include
#include
#include
//实际棋盘大小
#define ROW 9
#define COL 9  //虚拟棋盘大小
#define ROWS ROW + 2
#define COLS COL + 2//放置雷的个数(简单版本)
#define EASY_COUNT 80//初始化棋盘
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 mine[ROWS][COLS], int row, int col);//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

 game.c文件

#define  _CRT_SECURE_NO_WARNINGS 
//用于游戏相关函数的具体实现
#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)
{printf("*****-- 扫雷 --*****\n");int i = 0;for (i = 0; i <= row; 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 mine[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count--;}}
}//获取该位置周围雷的个数
int GetMineCount(char mine[ROW][COLS], int x, int y)
{return (mine[x - 1][y - 1] +mine[x][y - 1] +mine[x + 1][y - 1] +mine[x + 1][y] +mine[x + 1][y + 1] +mine[x][y + 1] +mine[x - 1][y + 1] +mine[x - 1][y] - 8 * '0');
}//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int count = 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 (show[x][y] == '*') //当show数组为*时,我们进行排雷{if (mine[x][y] == '1'){printf("很遗憾,你被炸死了\n");DisplayBoard(mine, ROW, COL); //再次显示棋盘,自己如何被炸死的break;}else{//该坐标不是雷,就统计周围有几个雷count = GetMineCount(mine, x, y); show[x][y] = count + '0'; //再次转换为char类型DisplayBoard(show, ROW, COL); //显示周围雷的信息win++; //每排查一次成功win++}}else {printf("该位置已经被排查\n");  //非*时,说明已经被排查过了}}else{printf("坐标非法,请重新输入\n");}}//非雷的位置都排查完了 while循环跳出来判断游戏结束if (win == row * col - EASY_COUNT) {printf("恭喜你,排雷成功!\n");}}

代码写完后,我们测试代码,排查唯一一个没有雷的地方(2,9),最终显示“恭喜你,排雷成功!” ,代码测试完成。

三、完整代码

棋盘9*9的大小,雷随机放置10个的简易扫雷游戏代码,将三个代码文件的完整代码,放置如下

 test.c文件

#define  _CRT_SECURE_NO_WARNINGS 
//用于整体逻辑的测试
#include "game.h"
void menu()
{printf("********************\n");printf("******扫雷游戏******\n");printf("******1.Play********\n");printf("******0.Exit********\n");printf("********************\n");
}void game()
{//存储数据 char mine[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };//初始化棋盘InitBoard(mine,ROWS,COLS,'0');InitBoard(show,ROWS,COLS,'*');//打印棋盘DisplayBoard(show, ROW, COL);//放置雷SetMine(mine,ROW,COL);//DisplayBoard(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;
}

 game.h文件

#define  _CRT_SECURE_NO_WARNINGS
//用于游戏相关函数的声明 及头文件包含
#include
#include
#include
//实际棋盘大小
#define ROW 9
#define COL 9  //虚拟棋盘大小
#define ROWS ROW + 2
#define COLS COL + 2//放置雷的个数(简单版本)
#define EASY_COUNT 10//初始化棋盘
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 mine[ROWS][COLS], int row, int col);//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

 game.c文件

#define  _CRT_SECURE_NO_WARNINGS 
//用于游戏相关函数的具体实现
#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)
{printf("*****-- 扫雷 --*****\n");int i = 0;for (i = 0; i <= row; 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 mine[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count--;}}
}//获取该位置周围雷的个数
int GetMineCount(char mine[ROW][COLS], int x, int y)
{return (mine[x - 1][y - 1] +mine[x][y - 1] +mine[x + 1][y - 1] +mine[x + 1][y] +mine[x + 1][y + 1] +mine[x][y + 1] +mine[x - 1][y + 1] +mine[x - 1][y] - 8 * '0');
}//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int count = 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 (show[x][y] == '*') //当show数组为*时,我们进行排雷{if (mine[x][y] == '1'){printf("很遗憾,你被炸死了\n");DisplayBoard(mine, ROW, COL); //再次显示棋盘,自己如何被炸死的break;}else{//该坐标不是雷,就统计周围有几个雷count = GetMineCount(mine, x, y); show[x][y] = count + '0'; //再次转换为char类型DisplayBoard(show, ROW, COL); //显示周围雷的信息win++; //每排查一次成功win++}}else {printf("该位置已经被排查\n");  //非*时,说明已经被排查过了}}else{printf("坐标非法,请重新输入\n");}}//非雷的位置都排查完了 while循环跳出来判断游戏结束if (win == row * col - EASY_COUNT) {printf("恭喜你,排雷成功!\n");}}

最后,该代码还有值得被优化的地方,比如,如果点开的格子不是雷,即其周围有0颗雷,则其周围格子自动打开;如果其周围还有‘0’,则会引发连锁反应;在你认为有雷的格子上,点击右键即可标记雷;游戏计时等诸多功能。有兴趣的话,小伙伴们,可以尝试着优化一下噢~


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部