目录
一、扫雷游戏介绍及其主要功能点
(1)扫雷游戏介绍
扫雷游戏游戏大家并不陌生,通常由一个方形区域组成,被分成若干个小方格。(如下图)
每个方格里都可能有雷,玩家需要不断排查,根据方格提供的数字信息(表示该方格周围8个方格地雷的数量),排查完所有安全的格子,获得游戏胜利。若排查到地雷,则游戏失败。
(2)扫雷游戏需要实现的功能点(主要)
①为了游戏体验,第一次排查格子时一定不是雷
②玩家排查一个格子时,若其无雷,则自动排查其周围格子的信息,依次循环
③玩家确定某格子有雷后,可以标记该格子
④玩家可以取消之前做的标记
二、游戏功能模块的实现
(1)雷盘大小及地雷数量的定义
雷盘的实现主要采用二维数组的方法
#define ROW 9 //二维数组行数
#define COL 9 //二维数组列数
#define MINE 10 //地雷数量
#define ROWS ROW+2 //选择格子后是检测格子周围八个格子地雷的数量,当检测边缘的格子时,
#define COLS COL+2 //附近会没有其他格子,因此拓宽二维数组的大小,方便后续检测格子周围地雷数量
(2)雷盘的初始化及打印(显示)
①雷盘的初始化函数
设置两个雷盘,一个mine数组保存地雷位置信息,一个show数组用于展示游戏过程信息给玩家
void InitBoard(char board[COLS][ROWS], int cols, int rows, char c) {
for (int i = 0; i < cols; i++) {
for (int j = 0; j < rows; j++) {
board[i][j] = c;
}
}
}
②雷盘的打印(显示)函数
游戏过程中不断打印show数组展示给玩家游戏信息
void PrintBoard(char board[COLS][ROWS], int col, int row) {
printf("---------------------------------\n\n");
printf(" "); //行坐标格式对齐
for (int i = 1; i < col + 1; i++) { //最上方一行打印列坐标0-9
printf("%d ", i);
}
printf("\n\n");
for (int i = 1; i <= col; i++) {
printf("%d ", i); //每行打印元素前打印行坐标
for (int j = 1; j <= row; j++) {
printf("%c ", board[i][j]);
}
printf("\n\n");
}
printf("---------------------------------\n\n\n");
}
(3)布置地雷的函数
采取随机值的办法布置地雷,在函数中加入一次排查操作,使得设置的随机值不为排查的坐标,以排除该地方是雷的可能性
void SetMine(char board[COLS][ROWS], char show[COLS][ROWS], int col, int row) {
int count = MINE; //计数器,用于放置设定的地雷数量
printf("请输入要排查的坐标(依次输入)\n\n");
while (1) //死循环防止输入坐标不合法
{
int x, y;
scanf("%d%d", &x, &y); //输入第一次要排查的坐标,需要将其设置为没有地雷
int m, n; //用于存放随机的行列坐标以放置地雷
if (x > 0 && x < row + 1 && y>0 && y < col + 1) //坐标合法
{
while (count)
{
m = rand() % row + 1; //行坐标范围1-9
n = rand() % col + 1; //列坐标范围1-9
if (board[m][n] == '0' && (m != x || n != y)) { //没有放过地雷的地方才能放雷,同时第一个选择的格子不能有雷
board[m][n] = '1'; //放置地雷
count--; //计数器减少
}
}
show[x][y] = get_mine_count(board, x, y) + '0';//show数组中传入第一次排查格子周围雷的数量,因为数组是char类型,所以需要加上'0'转为字符型的量(ASCII码)
ExpendMine(board, show, x, y);
PrintBoard(show, col, row); //打印show数组
break; //跳出while(1)死循环
}
else
{
printf("ERROR:请输入正确的坐标\n\n"); //执行死循环重新输入坐标
}
}
}
(4)排查格子的函数
输入坐标排查该格子的信息,利用get_mine_count()函数统计该格子周围雷的信息,利用ExpendMine()函数递归遍历信息为‘0’的格子周围格子的信息
int FindMine(char mine[COLS][ROWS], char show[COLS][ROWS], int col, int row) {
PrintBoard(show, col, row); //打印show数组
while (1)
{
//1.输入排查的坐标
int m, n;
printf("请输入要排查的坐标(依次输入)\n\n");
scanf("%d%d", &m, &n);
if (m > 0 && m < row + 1 && n>0 && n < col + 1)
{
if (show[m][n] != '*' && show[m][n] != 'P') { //检查是否输入了重复坐标
PrintBoard(show, col, row); //打印show数组
printf("ERROR:这个地方排查过了,请重新输入\n\n");
}
else
{
//2.检查坐标处是否是雷
if (mine[m][n] == '1') //有雷
{
printf("\n");
PrintBoard(mine, col, row); //打印给玩家具体的地雷位置
printf("你踩到地雷了,真菜啊!\n\n");
printf("上方为地雷分布情况,1是地雷,0是安全格子\n\n");
return 0; //游戏结束,直接返回0
}
else
{
ExpendMine(mine, sh