文章目录
游戏介绍
扫雷是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输
由于代码量比较多,我们采用多文件的方式来模拟实现扫雷方便后期修改维护,并将每个功能都封装成一个函数实现。
首先我们得先创建两个源文件和一个头文件
- test.c ------------------整体逻辑框架
- game.c----------------游戏过程实现
- game.h----------------存放函数声明
代码实现
game.c
先创建两个二维数组用来模拟扫雷的棋盘,创建数组的时候我们要注意,如果想在9*9的棋盘上进行扫雷游戏的话,为了防止在边上排雷的时候越界访问,我们创建真实数组的时候行和列就应该比打印出来的行列多两行
#define ROW 9 //打印的行
#define COL 9 //打印的列
#define ROWS ROW+2 //真实的行
#define COLS COL+2 //真实的列
mine数组用来雷的信息,show数组用来展示给玩家看的信息
//储存雷的棋盘
char mine[ROWS][COLS];
//展示的棋盘
char show[ROWS][COLS];
游戏开始先初始化棋盘,为了美观,我将mine的棋盘初始化成空格,show棋盘初始化为’*’。
//初始化棋盘
Initboard(mine, ROWS, COLS, ' ');
Initboard(show, ROWS, COLS, '*');
代码如下
Initboard()
//初始化棋盘
void Initboard(char board[ROWS][COLS], int rows, int cols, char ret)
{
//遍历数组初始化棋盘
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = ret;
}
}
}
初始化棋盘后,我们需要将用于展示的棋盘打印出以下的形状,为了方便确认坐标,我加上了横竖序号。
以下是打印棋盘的函数
//打印棋盘
Displayboard(show, ROW, COL);
Displayboard()
//打印棋盘
void Displayboard(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i <= col; i++)
{
if (i == 0)
printf(" ");
else
{
printf(" %d ", i);//打印坐标列号
}
}
printf("\n");
for (i = 0; i <= col; i++)
{
if (0 == i)
{
printf(" ");
}
else
{
printf("--- ");
}
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);//打印坐标行号
for (j = 1; j <= col; j++)
{
printf("|");
printf(" %c ", board[i][j]);
}
printf("|");
printf("\n");
if (i <row)
{
printf(" ");
for (j = 1; j <=row; j++)
{
printf("|");
printf("---");
}
printf("|");
printf("\n");
}
}
for (i = 0; i <= col; i++)
{
if (0 == i)
{
printf(" ");
}
else
{
printf("--- ");
}
}
printf("\n");
}
开始布置雷,先定义一个宏表示雷的个数,然后我们在mine棋盘里面布置雷,这里我们用字符’1’来代表雷,这里需要注意的是,为了防止少雷的情况,我们传参传的是用于展示的行和列。
#define EASY_COUNT 10//雷
//布置雷
Mentmine(mine, ROW, COL, EASY_COUNT);
Mentmine()
布置雷的过程是随机的,所以我们用了rand这个库函数来实现生成随机数,不过rand这个库函数有个弊端,它生成的数并不是完全随机的,所以在此之前,我们需要在前面利用srand使用系统时间作为rand随机数的种子。
srand((unsigned int)time(NULL