一、扫雷游戏的玩法规则
1、扫雷游戏的玩法
扫雷的详细规则是随便点开一个方格,根据展开方格的数字去推断其相邻九宫格内未展开方格下面是否是地雷,最终任务就是点开所有没有地雷的方格,以找出所有的地雷。
(可以点击下方来进行游玩扫雷游戏)
开始时,当你随便点击一个方格时就会变成例如下面这样。
而红方格里的数字代表着它周围8个方格里面藏着雷的数目,你可以通过其他方格里的数字来避开雷,当你扫出全部的雷,恭喜你,你就通关了。
二、代码实现思路
1、我们可以用两个字符型的二维数组来完成,一个二维数组mine用来存放雷,另一个二维数组board来显示棋盘。
2、为了表现出棋盘上雷的神秘,可以用字符‘※’来表示,为了保持二维数组的一致性雷可以用字符‘1’来表示,没有雷的地方用字符‘0’来表示。
3、我们可以敲出一个函数Init()来初始化mine和board。
4、我们还需要一个函数Show()来打印mine和board。(这里说是要打印mine是为了敲代码时的检测)
5、我们开始布置雷,(当然不能是我们自己亲手布置,这里我们就要利于时间戳来伪随机的布置雷),用函数SetMine()来布置雷,设产生随机值x、y来布置mine[x][y]上的雷。
6、最后我们需要一个函数FindMine()来判断我们是否成功地扫出全部的雷。
三、代码的实现
1、文件的创立
这里我推荐创立一个头文件和两个源文件,一个源文件用来执行函数,一个来存放函数。
2、游戏开始的基本代码
1.主函数的实现
(用上面的基础版为例)首先我们需要创立两个字符型二维数组mine和board,而它们的大小应为[11][11]。(如图所示)当我们要求出我们要排查的方格周围雷的数目时我们可能会超出二维数组的大小,所以我们需要额外的一圈。
int main() { srand((unsigned int)time(NULL));//这里为后面用来实现随机布置雷。 int input = 0; do { Mune();//游戏的菜单。 scanf("%d", &input); switch (input) { case 1: Gameing();//游戏的入口。 break; case 0: printf("退出游戏\n"); break; default: printf("选择错误,请重新选择\n"); break; } } while (input); return 0; }
2、菜单的实现
void Mune() { printf("**********************************\n"); printf("********** 1.play **********\n"); printf("********** 0.exit **********\n"); printf("**********************************\n"); }
3.Gameing的实现
a、初始化
最开始我们需要将棋盘初始化,我们这里就需要用函数Init()来初始化board和mine。
我们需要将board和mine以及它们的大小作为实参传入函数Init()。
void Gameing() { int board[11][11] = { 0 }; int mine[11][11] = { 0 }; Init(board, 11, 11); Init(mine, 11, 11); }
这里我们要将board和mine初始化成下面这样。
(mine) (board)
我们可以将‘0’和‘※’也作为实参传入函数Init(),则代码应该改为
void Gameing() { int board[11][11] = { 0 }; int mine[11][11] = { 0 }; Init(board, 11, 11,'*'); Init(mine, 11, 11,'0'); }
所以函数Init()应为下面这样
void Init(int arr[ROWS][COLS], int rows, int cols, char set) { int i, j; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { arr[i][j] = set; } } }
b、打印棋盘(函数Show)
传参与上面初始化基本相同。
Show(mine, 11, 11); Show(board, 11, 11);
当然我们还主要注意打印的格式。
这样才能打印出我们需要的格式。
c、雷的布置
这里我们需要利用时间戳的伪随机来布置雷。
srand((unsigned int)time(NULL));
我们需要用x、y来作为坐标来布置雷。
int x = rand() % row + 1; int y = rand() % col + 1;
注意这里的row和col为9,因为我们只需要1~9的范围来布置雷。
即函数SetMine()应该为
void SetMine(int 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] != '1') { mine[x][y] = '1'; count--; } } }
写到这里我们可以利用函数Show()来检测我们是否布置好雷
void Gameing() { int board[11][11] = { 0 }; int mine[11][11] = { 0 }; Init(board, 11, 11,'*'); Init(mine, 11, 11,'0'); PutMine(mine, 9, 9); Show(mine, 9, 9); Show(board, 9, 9); }
d、扫雷(FindMine)的实现
(历经千辛万苦终于到了最后一步,如何扫雷。)
我们需要传入mine和board以及它们的需要大小到函数FindMine()
FindMine(mine, board, 9, 9);
到了这里,我们需要输入x、y来确定我们要扫雷的地方,如何来判断这个位置是否为雷,如是雷游戏结束,若不是雷,应用一个函数来判断这个地方周围有多少雷。即代码可以写成这样
void FindMine(int mine[ROWS][COLS], int board[ROWS][COLS], int row, int col) { int x, y;//确定位置 int count = 0; while (1)//重复循环 { printf("请输入你要扫的位置->"); scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col)//确保输入的范围合法 { if (mine[x][y] != '1') { int rm = RoundMine(mine, x, y);//用来判断周围雷的数目 board[x][y] = rm + '0'; Show(board, ROW, COL); } else { printf("很抱歉,你被炸死了\n"); Show(board, ROW, COL); return; } } else { printf("超出扫雷范围,"); } } }
e、 函数RoundMine()的实现
这里我们要明白‘0’是字符,大小为48,'1'的大小为49。我们可以将橙色周围的数值全部相加,然后在减去8*48,这样我们就可以得到一个周围雷的数目。
但我们需要的是字符,所以我们可以这样。
board[x][y] = rm + '0'
但到这还没有结束,我们无法停止扫雷的过程直到我们被炸死,所以我们还需要一个值来统计我们扫雷的次数从而让我们游戏通关。可以稍稍该一下上面的代码。
注意:我默认雷的数目为10个。
void FindMine(int mine[ROWS][COLS], int board[ROWS][COLS], int row, int col) { int x, y; int count = 0; while (count != 9* 9- 10)//这里我默认雷的数目为10个 { printf("请输入你要扫的位置->"); scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (mine[x][y] != '1') { int rm = RoundMine(mine, x, y); board[x][y] = rm + '0'; Show(board, ROW, COL); count++; } else { printf("很抱歉,你被炸死了\n"); Show(board, ROW, COL); return; } } else { printf("超出扫雷范围,"); } } printf("厉害,你通关了扫雷游戏\n"); }
总结:
扫雷游戏是一个有趣的游戏,独自完成了一款从小就开始玩的游戏还是成就感满满的,它作为一个较基础的代码游戏十分适合代码新手尝试,可以增强自己敲代码的能力,同时也可以将知识点串联起来。(既然都看到这里了,点个赞呗♥)