C语言的扫雷游戏可以细分为五个部分,初始化、打印棋盘、放置雷、排查雷、主函数。
1、创建数组以及前期准备
这是进行初始化前的一个步骤。
在进行一个9*9的扫雷游戏之前,我们需要思考一些问题。
1、如何建立一个9*9的棋盘。
2、若要建立一个9*9的扫雷游戏,那么将如何区分雷和非雷地区。
3、扫雷游戏原理如何表达。
扫雷游戏的原理:若选中了一块格子,格子上摆放的是雷,那么会被炸死,以至于游戏结束。
但若并不是雷,那么则会观察这块格子周边的八个格子,并且统计和显示出周边八个格子雷的数量。
而我们该如何解决这些问题?
1、我们将使用二维数组,利用二维数组的矩阵特性,打印出一个9*9的棋盘以供游戏。
2、我们可以使用‘1’和‘0’ 来解决雷和非雷地区的问题,原理是‘1’- ‘0’=1 这样以便于后面统计周边八个格子的雷的数量。
3、选中格子的问题,我们可以采取坐标的原理,以及使用rand函数的方法进行随机埋伏雷,而确认是否是雷,我们可以取坐标号,放入数组中进行判断,是否是雷。
4、由于数组是9*9的数组,但是当我们选中角落时,我们无法判定和统计周边八个格子中雷的个数,因为我们遇到了数组的越界,于是乎,我们选则了将棋盘扩大一圈,且为了显示出9*9的棋盘,我们只打印中间9*9的部分。
5、我们在完扫雷游戏的时候,是看不见雷的放置位置,所以,为了体现玩家的游戏效果,我们将准备两个棋盘,一个是专门放置雷的棋盘,而另一个则是专门放置排查出雷的信息的棋盘。
2、数据的定义
2、文件的说明
main.c 进行主函数部分和调用部分以及游戏的逻辑部分
play.c进行的是函数的实现部分
game.h放置的是函数声明
4、初始化
我们使用自定义函数IB进行一个二维数组的函数调用,而为了函数的独立性和灵活性,我们采取了#define,对二维数组的行和列进行重新定义,将它们变成了ROWS和COLS。
且,为了方便,我们将两种棋盘用同一个自定义函数进行调用。
5、 打印棋盘
由于我们需要打印的部分只有9*9,而且,打印出的棋盘是为了展示给玩家看的,所以含有雷的部分,我们将进行隐藏,且为了棋盘的美观,我们将在棋盘的左边和上边打上序号,以便接下来的游玩操作。
6、布置雷
对于布置雷,首先我们需要在9*9的范围内进行雷的布置,其次雷的布置是随机的,所以我们采用了rand函数和srand函数的协助,采取rand()%+1的方法,在9*9的范围内将雷布下。
而雷,对于玩家而言是看不见的,所以需要在mine棋盘上进行。
7、排雷
在排雷之前,我们先要知道,一个未埋藏雷的格子,它周边八个格子的坐标是什么?
假设,这个格子的坐标是(x,y)
那么它周边的八个格子则如下图所示:
且根据 ‘1’ - ‘0’ =1的原理
我们可以先写出以下函数:
随后,我们在进行分析。
一个9*9 八十一个格子,有十颗雷,想要完成游戏,那么我们需要进行71次的排雷,而在71次的排雷过程中,若选中了埋藏有雷的格子,则会游戏结束,且根据扫雷游戏的特性,不论是赢了游戏,抑或是被雷炸死,我们都会把所有的雷展示给玩家看,而若是没有选中雷,我们则需要继续进行游戏,且排雷的次数将会减少,直到排满七十一次雷,直到游戏结束。
void FM(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int win = 0;
int x = 0;
int y = 0;
while(win < row* col - EY)
{
printf("请输入坐标;>");
scanf("%d %d", &x, &y);
if ((x >= 1 && x <= row) && (y >= 1 && y <= col))
{
if (mine[x][y] == '1')
{
printf("抱歉你被炸死了!\n");
DP(mine,ROW,COL);
break;
}
else
{
int ret = GA(mine,x,y);
show[x][y] = ret + '0';
DP(show, ROW, COL);
win++;
}
}
else
{
printf("坐标错误!\n");
}
if (win == row * col - EY)
{
printf("恭喜你排雷成功!\n");
DP(mine, ROW, COL);
}
}
}