思路:
创建一个9*9的数组(char mine[9][9]
初始化数组内容为字符‘0’)作为棋盘使用(存放布置雷的信息),在里面随机放10个雷(雷用字符‘1’来表示)。
假如当我们排查34这个位置时,发现他周围只有一个雷,所以他会显示‘1’,这时就会与我们用‘1’来表示雷产生冲突,这时我们就需要重新创建一个99的数组(char show[9][9]
)棋盘专门用来存放排查出的雷的信息(这个棋盘展示给用户)。
当没有排查雷时,棋盘show
内容初始化为'*'
这时候我们发现,当我们去排查棋盘最外边一圈时,会出现越界访问的情况,而为了防止这个问题,我们创建棋盘时创建为1111,但是我们只用到其中99的范围
实现扫雷游戏:test.c
测试游戏的逻辑game.c
游戏代码的实现game.h
游戏代码的声明(函数声明,符号定义)
第一步:我们做一个简易的菜单:
利用do...while
循环,使得菜单无条件打印一次
void menu()
{
printf("******************************\n");
printf("****** 欢迎来到扫雷游戏 ******\n");
printf("********* 1.play *********\n");
printf("********* 0.exit *********\n");
printf("******************************\n");
}
int main()
{
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("选择错误,请重新选择!\n");
break;
}
} while(input);
return 0;
}
第二部:初始化棋盘:
//第一版:
//test.c
char mine[ROWS][COLS] = {
0 };//存放布置好的雷的信息
char show[ROWS][COLS] = {
0 };//存放排查出的雷的信息
//初始化数组的内容为指定的内容
//mine 数组在没有布置雷的时候,都是'0'
InitBoard(mine, ROWS, COLS);
//show 数组在没有排查雷的时候,都是'*'
InitBoard(show, ROWS, COLS);
//game.h
void InitBoard(char board[ROWS][COLS],int rows,int cols);
//game.c
void InitBoard(char board[ROWS][COLS], int rows, int cols)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = ;
}
}
}
当第一版写到这里时,我们发现代码并不能一次初始化两个棋盘,解决方法就是把各自需要初始化的值通过一个变量set
传递过来:
//第二版:
//test.c
char mine[ROWS][COLS] = {
0 };//存放布置好的雷的信息
char show[ROWS][COLS] = {
0 };//存放排查出的雷的信息
//初始化数组的内容为指定的内容
//mine 数组在没有布置雷的时候,都是'0'
InitBoard(mine, ROWS, COLS, '0');
//show 数组在没有排查雷的时候,都是'*'
InitBoard(show, ROWS, COLS, '*');
//game.h
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
//game.c
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0;
int j = 0;
for (i =