什么是扫雷?
这是一款棋盘类型的游戏,系统会根据当前游戏的任务难度在棋盘内随机设置雷(雷是隐藏的)玩家需要通过分析排除雷的位置避免踩到雷,当我们排完后只剩下雷之后,游戏结束-玩家胜利,反之玩家游戏失败,重新游戏。
**当然理解完这些之前我们可以先创建了三个文件 夹,Game.c\Game.h\main.c。以便于代码的观赏性。当我们把这些工作完成后我们就可以理一下整体游戏的一个思路.
1.如何设置一个进入扫雷游戏的菜单(这里的话三字棋中有写过)
2.如何创建棋盘
3.如何将雷随机设置到棋盘上
4.如何让玩家排除雷
5.判断玩家输赢
**
扫雷游戏
1.创建扫雷的菜单栏
创建扫雷的菜单栏和井字棋的菜单栏相同,所以这里我直接把代码放上去了。
井字棋链接
菜单栏代码:
#include"Game.c"
void menu()
{
printf("------------ 扫雷 -------------\n");
printf("***********************************\n");
printf("********* 0.exit ***********\n");
printf("********* 1.enter ***********\n");
printf("***********************************\n");
printf("------------ 扫雷 --------------\n");
}
int main()
{
int input = 0;
do
{
menu();
printf("Please_Choose:>>>>>>>>>");
scanf("%d", &input);
switch(input)
{
case 0:
printf("program is quiting\n");
break;
case 1:
printf("Start\n");
break;
default:
printf("Please_Choose_all over again:>>\n");
}
} while (input);
return 0;
}
运行一下看看程序是否可以可以跑起来
2.创建游戏中的棋盘
从switch语录中的cese 1中调用Game函数,可以将我们的printf替换掉
case 1:
// printf("Start\n");
Game();//调用Game函数
break;
在我们的Game函数中创建两个数组mine数组用来系统布置雷,show数组为排除雷,玩家看不到系统布置的雷
void Game()
{
char mine[ROWS][COLS] = {0};
char show[ROWS][COLS] = {0};
}
首先我们先设置一个简单的模式,设置十个雷,在Game.h中deinfe 定义十个雷,而十个雷的话需要9x9的棋盘来置雷,我们define 定义row(行)和col(列)为9
而我们打印出来的是9x9的棋盘,但是我们在排雷时需要多置入两行两列来为我们开展后续的工作,所以define ROWS COLS为数组里的行列
main.c代码:
Game.h代码:
#include<stdio.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define mines 10
2.1初始化棋盘
我们来初始化棋盘mine中存放‘0’,方便进行埋雷,show中存放*隐藏雷的位置
main.c代码:
Init_board(mine, ROWS, COLS, '0');
Init_board(show, ROWS, COLS, '*');
Game.h代码:
> void Init_board(char board[ROWS][COLS],int rows,int cols,char set);
> //因为我们是初始化棋盘需要初始化为12X12棋盘
Game.c代码:
#include"Game.h"
void Init_board(char board[ROWS][COLS],int rows,int cols,char set)
{
int i = 0;
int j = 0;
for (i = 0; i < rows;i++)
{
for (j = 0; j < cols;j++)
{
board[i][j] = set;
//这里的set为我们初始化的mine和show
}
}
}
2.2 打印棋盘内容
Display_board来打印棋盘的内容,打印的棋盘我们只需要打印9x9
main.c代码:
Display_board(mine, ROW, COL);
Display_board(show, ROW, COL);
Game.h
void Display_board(char board[ROWS][COLS],int row,int col);
Game.c
void Display_board(char board[ROWS][COLS],int row,int col)
{
int i = 0;
int j = 0;
printf("----------------游戏开始------------------\n");
for (j = 0; j <= col; j++)
{
printf("%d ",j);//打印y轴数,从0开始因为算上我们的x
}
printf("\n");//换行
for (i = 1; i <= row; i++)
{
printf("%d ", i);//打印x轴数
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");//换行
}
printf("----------------游戏开始------------------\n");
//运行查看一下我们的运行结果是否正常
}
3.随机布置雷
埋雷的函数,需要埋到9x9的棋盘中
main.c代码:
Buried_mine(mine, ROW, COL);
Game.h代码:
void Buried_mine(char mine[ROWS][COLS],int row,int col);
Game.c代码:
这里我们需要用到随机数,需要调用库函数包中的time函数和stdlib函数,原井字棋游戏有具体步骤
井字棋
void Buried_mine(char mine[ROWS][COLS],int row,int col)
{
int x = 0;//x轴代表我们的行
int y = 0;//y轴代表我们的列
int count = mines;//我们define定义的十个雷
while (count) // 这里我们需要一个循环来随机埋雷
{
int x = rand() % row + 1;//这里我们需要将随机数%row+1;因为row为9,而取模的随机数不能是本身,需要+1得到9行
int y = rand() % col + 1;//和行相同
if(mine[x][y]=='0')//如果mine[x][y]中的数为0
{
mine[x][y] = '1';//将其布置为1
count--;//布置一个雷--,埋完10个雷跳出循环
}
}
}
//写完后我们运行一下,看是否可以看到随机布置的十个雷
这里我们需要看一下布置的十个雷,所以需要刚才的Display函数来显示出来
这里我查看一下运行的结果
10个雷已经布置到了mine棋盘中(当然这个棋盘是只有我们才可以看到)
4.排雷
main.c代码:
这里我们需要排雷,并显示到棋盘上,使用show显示
Find_mine(mine, show, ROW, COL); 排雷,这里我们需要两个棋盘中的数据,将两个棋盘合并
Game.h代码:
void Find_mine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);
Game.c代码:
Find_mine为我们排雷的函数
Get_Mine为我们在排雷过程中检查周围八个坐标是否有雷
int Get_Mine(char mine[ROWS][COLS], int x, int y)
{
return (mine[x-1][y-1]+
mine[x][y - 1] +
mine[x + 1][y - 1] +
mine[x - 1][y] +
mine[x + 1][y] +
mine[x - 1][y + 1] +
mine[x][y + 1] +
mine[x + 1][y + 1] - 8 * '0');//因为有八个坐标我们要将
}
void Find_mine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{
int x = 0;//行
int y = 0; //列
int count = 0;//为排查的坐标,初始化0;
//这里我们需要判断几种结果,坐标设置好,如果超出坐标范围怎么办,在坐标范围内,如果坐标被占怎么办,想好这些。我们就可以进行排雷了
while (count<row*col-mines)//count<81-10
{
printf("请输入坐标排雷:>>>>>>>>");
scanf("%d %d", &x,&y);
if (x >= 1 && x <= row && y >= 1 && y <= col)//设置x,y中的范围
{
if(show[x][y]!='*')//如果show[x][y]不为*被占用
{
printf("该坐标被占据,重新输入:>>>>>>>>>\n");
}
else
{
if(mine[x][y]=='1')//如果为1,踩到雷,被炸死
{
printf("排雷失败,请重新游戏\n");
Display_board(mine, ROW, COL);
//这里打印mine棋盘,让玩家看一下具体情况.
break;
}
else
{
count++; // 排查出一个结果count++;
int sum = Get_Mine(mine, x, y);
//当我们下了一个坐标之后,我们需要检查周围的八个坐标是否有雷,rec来接收值
show[x][y] = sum + '0';//改为char类型
Display_board(show, ROW, COL);//排除后打印棋盘
}
}
}
else
{
printf("坐标超出范围请重新输入:>>>>>>>>>\n");//超出范围,就重新输入
}
}
if(count==row*col-mines)
{
printf("排雷成功(。ì _ í。)!!!!!\n");
Display_board(mine, ROW, COL);
}
}
//整体的扫雷基础已经布置完成,完成后我们进行运行,查看是否有bug。
5.整体代码
main.c
#include"Game.c"
void Game()
{
//创建两个数组mine数组用来系统布置雷,show数组为排除雷,玩家看不到系统布置的雷
char mine[ROWS][COLS] = {0};
char show[ROWS][COLS] = {0};
Init_board(mine, ROWS, COLS, '0'); // 我们来初始化棋盘mine中存放‘0’,方便进行埋雷,show中存放*隐藏雷的位置
Init_board(show, ROWS, COLS, '*');
// Display_board(mine, ROW, COL);
// Display_board(show, ROW, COL);
Buried_mine(mine, ROW, COL);//埋雷的函数,需要埋到9x9的棋盘中
Display_board(show, ROW, COL);
Find_mine(mine, show, ROW, COL); // 排雷,这里我们需要两个棋盘中的数据,将两个棋盘合并
}
void menu()
{
printf("------------ 扫雷 -------------\n");
printf("***********************************\n");
printf("********* 0.exit ***********\n");
printf("********* 1.enter ***********\n");
printf("***********************************\n");
printf("------------ 扫雷 --------------\n");
}
int main()
{
srand((int unsigned)time(NULL));
int input = 0;
do
{
menu();
printf("Please_Choose:>>>>>>>>>");
scanf("%d", &input);
switch(input)
{
case 0:
printf("program is quiting\n");
break;
case 1:
// printf("Start\n");
Game();//调用Game函数
break;
default:
printf("Please_Choose_all over again:>>\n");
}
} while (input);
return 0;
}
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 mines 10
void Init_board(char board[ROWS][COLS],int rows,int cols,char set);
void Display_board(char board[ROWS][COLS],int row,int col);
void Buried_mine(char mine[ROWS][COLS],int row,int col);
void Find_mine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);
Game.c
#include"Game.h"
void Init_board(char board[ROWS][COLS],int rows,int cols,char set)
{
int i = 0;
int j = 0;
for (i = 0; i < rows;i++)
{
for (j = 0; j < cols;j++)
{
board[i][j] = set;
}
}
}
void Display_board(char board[ROWS][COLS],int row,int col)
{
int i = 0;
int j = 0;
printf("----------------游戏开始------------------\n");
for (j = 0; j <= col; j++)
{
printf("%d ",j);
}
printf("\n");//换行
for (i = 1; i <= row; i++)
{
printf("%d ", i);
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");//换行
}
printf("----------------游戏开始------------------\n");
}
void Buried_mine(char mine[ROWS][COLS],int row,int col)
{
int x = 0;//x轴代表我们的行
int y = 0;//y轴代表我们的列
int count = mines;//我们define定义的十个雷
while (count) // 这里我们需要一个循环来随机埋雷
{
int x = rand() % row + 1;//这里我们需要将随机数%row+1;因为row为9,而取模的随机数不能是本身,需要+1得到9行
int y = rand() % col + 1;//和行相同
if(mine[x][y]=='0')//如果mine[x][y]中的数为0
{
mine[x][y] = '1';//将其布置为1
count--;//布置一个雷--,埋完10个雷跳出循环
}
}
}
int Get_Mine(char mine[ROWS][COLS], int x, int y)
{
return (mine[x-1][y-1]+
mine[x][y - 1] +
mine[x + 1][y - 1] +
mine[x - 1][y] +
mine[x + 1][y] +
mine[x - 1][y + 1] +
mine[x][y + 1] +
mine[x + 1][y + 1] - 8 * '0');//因为有八个坐标我们要将
}
void Find_mine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{
int x = 0;//行
int y = 0; //列
int count = 0;//为排查的坐标,初始化0;
//这里我们需要判断几种结果,坐标设置好,如果超出坐标范围怎么办,在坐标范围内,如果坐标被占怎么办,想好这些。我们就可以进行排雷了
while (count<row*col-mines)//count<81-10
{
printf("请输入坐标排雷:>>>>>>>>");
scanf("%d %d", &x,&y);
if (x >= 1 && x <= row && y >= 1 && y <= col)//设置x,y中的范围
{
if(show[x][y]!='*')//如果show[x][y]不为*被占用
{
printf("该坐标被占据,重新输入:>>>>>>>>>\n");
}
else
{
if(mine[x][y]=='1')//如果为1,踩到雷,被炸死
{
printf("排雷失败,请重新游戏\n");
Display_board(mine, ROW, COL);//这里打印mine棋盘,让玩家看一下具体情况.
break;
}
else
{
count++; // 排查出一个结果count++;
int sum = Get_Mine(mine, x, y);//当我们下了一个坐标之后,我们需要检查周围的八个坐标是否有雷,rec来接收值
show[x][y] = sum + '0';//改为char类型
Display_board(show, ROW, COL);//排除后打印棋盘
}
}
}
else
{
printf("坐标超出范围请重新输入:>>>>>>>>>\n");//超出范围,就重新输入
}
}
if(count==row*col-mines)
{
printf("排雷成功(。ì _ í。)!!!!!\n");
Display_board(mine, ROW, COL);
}
}