目录
1.什么是扫雷游戏
2.编程准备和分析
3.怎么去实现
(1)#define定义的常变量
(2)函数的声明
2.1初始化
2.2打印棋盘
(3)如何布置雷
(4)如何排查雷
4.最终的布局
5.扫雷的源码
扫雷游戏中存在两个元素“雷”和“空”,一个方格不是“雷”即是“空”。游戏初始,所有的方格都是被覆盖的。点开的“空”会标识数字。如图中所示黄色框,中心的“空”标识数字“1”,即表示其周围8个方格内仅有1颗雷,玩家需要通过这样的信息来判断正确的雷区位置并予以标识。
所以到底应该如何用c语言去实现这个呢?
首先我们要明白在一个扫雷的程序中,首先我们需要对棋盘进行一个初始化,然后我们需要布置雷在棋盘中放入随机的雷,然后我们要将棋牌打印出来,最后我们还要排查出雷,我们设置的是9×9的棋盘,放置10个雷大概是这样的
有布置雷的地方我们就存放1,没有布置雷就存放0。
首先我们先来创建3个文件,一个是大体步骤的test.c,一个是实现步骤的game.h,最后一个是放入头文件的game.h文件。
然后开始实现,首先在test.c中写下大体的步骤首先还是经典的利用switch语句来构建菜单
菜单就依照自己喜欢去定义我这里随意写了一个
在game.h这个头文件中,用#define去定义扫雷游戏的雷数,长宽,因为会存在越界,为了防?越界,我们在设计的时候,给数组扩??圈,雷还是布置在中间的9*9的坐 标上,周围?圈不去布置雷就?,这样就解决了越界的问题。所以我们将存放数据的数组创建成11*11
所说我们也定义两种长宽。
我们开始一一讲解。
棋盘上雷的信息(1)和非雷的信息(0),如果存放在布置雷的数组中,这样雷的信息和雷的个数信息就可能或产生混淆和打印上的困难。假设我们排查了某 一个位置后,这个坐标处不是雷,这个坐标的周围有1个雷,那我们需要将排查出的雷的数量信息记录存储,并打印出来,作为排雷的重要参考信息的。那这个雷的个数信息存放在哪里呢?所以我们们专们给?个棋盘(对应?个数组mine)存放布置好的雷的信息,再给另外一个棋盘(对应另外?个数组show)存放排查出的雷的信息。这样就互不干扰了,把雷布置到 mine数组,在mine数组中排查雷,排查出的数据存放在show数组。
首先我们对这个两个数组进行初始化.
初始化,利用函数的传参,两个for循环的使用,即可将2维数组初始化为你想要的字符。
然后我们就要把棋盘打印出来,因为show的数组是存放排查出的雷的信息,所以打印只要打印出show即可,而且打印是9x9所以传参时,要传row和col不可传错。
对于雷的布置,要想到利用随机数去布置,时间戳去布置srand((unsigned int)time(NULL));用rand去生成随机数了,注意要在最开始的主函数中去放置,这里就不在用图片去列举了。
为了让生成的随机雷在1到9之间,所以%9加1。
排查雷,就是要看一个9x9的方格里,有几个雷也就是几个1,我们这里使用最简单的方法,就是将周围的数全部加起来,来看1的个数。注意这里存放的是字符1,所以是acs码值
这个是我检测雷的方法,然后我设置了,他是返回为一个数,然后就是胜利的判断条件,首先我们得让坐标合法就是我们输入坐标,必须在这个表格中注意是9×9的表格,不是11×11的表格,然后来进入如何设置变量WIN用while循环当他小于阶数x雷数的话,那么就必须一直循环下去证明这个游戏还没有结束,如果在我的布置雷的表格中被炸死了,那就告诉你被炸死了,并且把我布置雷mine的图片打印给你看,以证明清白,反之,如果坐标不是零叫统计有几个雷了,再利用之前写的那个函数来返回他告诉他有多少只注意接收是用排插来的图片show来接收,然后再让赢的数加加
首先用两个数组来存放好雷的信息,一个是布置雷一个是排查雷,然后初始化数组在布置雷中存放10个雷之后打印机盘让你开始玩游戏,然后再进入胜负判断条件。
然后就可以看看成果了
1.game.h
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define LEI 10
//声明函数
void InitBoard(char arr[ROWS][COLS], int rows, int cols,char set);
void DisplayBoard(char arr[ROWS][COLS],int row,int col);
void Setmine(char arr[ROWS][COLS], int row, int col);
void Findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
2.game.c
#include "game.h"
void InitBoard(char arr[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++)
?? ??? ?{
?? ??? ??? ? arr[i][j] = set;
?? ??? ?}
?? ?}
}
void DisplayBoard(char arr[ROWS][COLS], int row, int col)
{
?? ?int i = 0;
?? ?printf("-----------扫雷游戏------------\n");
?? ?for (i = 0; i <= col;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 ", arr[i][j]);
?? ??? ?}
?? ??? ?printf("\n");
?? ?}
}
void Setmine(char arr[ROWS][COLS], int row, int col)
{
?? ?int count = LEI;
?? ?while (count)
?? ?{
?? ??? ?//为了让生成的随机雷在1到9之间,所以%9加1
?? ??? ?int x = rand() % ROW + 1;
?? ??? ?int y = rand() % COL + 1;
?? ??? ?if (arr[x][y] == '0')
?? ??? ?{
?? ??? ??? ?arr[x][y] = '1';
?? ??? ??? ?count--;
?? ??? ?}
?? ?}
}
? int Getmine(char mine[ROWS][COLS], int x, int y)
{
?? ?return (mine[x - 1][y] + 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] - 8 * '0');
}
void Findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
?? ?int x = 0;
?? ?int y = 0;
?? ?int win = 0;
?? ?//判断坐标有效性
?? ?while (win< row * col - LEI)
?? ?{
?? ??? ?printf("请输入你要查找的坐标:");
?? ??? ?scanf_s("%d %d", &x, &y);
?? ??? ?if (x >= 1 && x <= row && y >= 1 && y <= col)
?? ??? ?{
?? ??? ??? ?if (mine[x][y] =='1')
?? ??? ??? ?{
?? ??? ??? ??? ?printf("不好意思,你被炸死了\n");
?? ??? ??? ??? ?DisplayBoard(mine, ROW, COL);
?? ??? ??? ??? ?break;
?? ??? ??? ?}
?? ??? ??? ?else//改坐标不是0,但是要统计周围有几个雷了
?? ??? ??? ?{
?? ??? ??? ??? ?int count= Getmine(mine, x, y);
?? ??? ??? ??? ?show[x][y] = count + '0';
?? ??? ??? ??? ?DisplayBoard(show, ROW, COL);
?? ??? ??? ??? ?win++;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?printf("该坐标不存在,请重新输入\n");
?? ??? ?}
?? ?}
?? ?if (win == row * col - LEI)
?? ?{
?? ??? ?printf("恭喜扫雷成功\n");
?? ??? ?DisplayBoard(mine, ROW, COL);
?? ?}
}
3.test.c
#include "game.h"
void menu()
{
?? ?printf("*********************\n");
?? ?printf("***1.play ? 0.exit***\n");
?? ?printf("*********************\n");
}
void game()
{
?? ?//mine的数组是存放布置好的雷的信息
?? ?char mine[ROWS][COLS] = { 0 };//初始化为字符0
?? ?//show的数组是存放排查出的雷的信息
?? ?char show[ROWS][COLS] = { 0 };//初始化为字符*
? ?//初始化棋盘
?? ?InitBoard(mine,ROWS,COLS,'0');
?? ?InitBoard(show,ROWS,COLS,'*');
?? ?//布置雷,要做9x9的棋盘里,放置10个雷
?? ?Setmine(mine, ROW, COL);
?? ?//打印棋盘
?? ?DisplayBoard(show, 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_s("%d", &input);
?? ??? ??? ?switch (input)
?? ??? ??? ?{
?? ??? ??? ?case 1:
?? ??? ??? ??? ?printf("扫雷游戏开始\n");
?? ??? ??? ??? ?game();
?? ??? ??? ??? ?break;
?? ??? ??? ?case 0:
?? ??? ??? ??? ?printf("选择正确,游戏退出\n");
?? ??? ??? ??? ?break;
?? ??? ??? ?default :
?? ??? ??? ??? ?printf("选择错误,没有这个选项\n");
?? ??? ??? ??? ?break;
?? ??? ?}
?? ?}
?? ?while (input);
?? ?return 0;
}