扫雷
1.构建主函数,方法与三子棋雷同,但是有很多不一样的地方,就是需要构建两个二维数组,一个存放雷的数据,一个存放展现给玩家的数据棋盘
2.在对棋盘分别初始化
时候,考虑到两个二维数组存放内容不同,直接对初始化函数进行添加字符参数
3.构建参数
因为考虑到后期排查雷的时候边缘的数据无法正常排查,就干脆构建11*11比原先的棋盘再大一圈的棋盘,.为了方便区分,分别构建两次宏
4.初始化
的时候直接对全棋盘数据进行初始化,打印只打印1-9的数据就好,这样后期也方便管理,因为数组总比下标-1.很容易凌乱.
5.打印棋盘的时候注意因为坐标太多,最好打印出行数列数,这里要注意对齐,可以后期慢慢调试.
6.用户再拿到一个棋盘的时候,这个棋盘应该是被初始化有雷的棋盘,所以我们构建一个设置雷的函数在雷棋盘里
7.这里我们就可以构建一个宏来存放雷的数量,
8.玩家输入数据,注意参数大小范围,除了初始化棋盘函数,其他函数的形参都是9,因为玩家的输入范围都是1-9;恰好对应数组也是1-9因为下标是0的都没被打印出来
9.不仅要考虑坐标范围也要考虑是否输入过
10.当没有走到雷上就要放入周围8个方位雷的数量,这里我们就要构建一个数量来记录来后期判断,这里构建一个数量函数,注意到数组是字符型,但是恰好雷的数据是'1',非雷的数据是'0'这样我们可以把周围八个方位相加再减去字符'0'*8就是雷的数字.因为两个ASICC码值相减就是整型了.
11.判断输赢就是排查了所有雷,即点击了所有没有雷的坐标,那么我们就用所有坐标数减去埋好雷的数
1.
1.测试游戏函数主体
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void game()
{
//构建两个棋盘,一个存放雷的数据,一个存放SHOW的数据
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };//分别在mine棋盘和show棋盘初始化,在mine:0代表无,1:代表雷.show:*
Init_board(mine, ROWS, COLS, '0');
Init_board(show, ROWS, COLS, '*');//打印棋盘
//Display_board(mine, ROW, COL);
Display_board(show, ROW, COL);//埋雷
Set_mine(mine, ROW, COL);
//Display_board(show, ROW, COL);//玩家输入数据判断周围雷数
Find_mine(mine, show, ROW, COL);}
void test()
{
printf("*************扫雷*********\n");
printf("******1.play****0.exit*****\n");
printf("****************************\n");
int input = 0;
do
{
scanf("%d", &input);
switch (input)
{
case 1:
{
game();
printf("还玩吗\n");
break;
}
case 0:
{
printf("已退出\n");
break;
}
default:
{
printf("输入错误.请重新输入>:");
break;
}
}
} while (input);}int main()
{
test();
return 0;
}
2.
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void Init_board(char mine[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++)
{
mine[i][j] = set;
}
}
}
void Display_board(char arr[ROWS][COLS], int row, int col)
{printf("------------扫雷-------------\n");
int i = 0;
int j = 0;
for (i = 0;i <= row;i++)
{
printf("%d ", i);}
printf("\n");
for (i = 1;i <= row;i++)
{
printf("%d ", i);
for (j = 1;j <= col;j++)
{
printf(" %c ", arr[i][j]);
}
printf("\n");
}printf("-----------------------------\n");}
void Set_mine(char mine[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int i = 0;
do {
x = rand() % row + 1;
y = rand() % col + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
i++;
}
} while (i <= COUNT);//1-9
}
int get_mine_count(char mine[ROWS][ROWS], int x, int y)
{
int i = 0;
int j = 0;
int n = 0;
for (i = x - 1;i <= x + 1;i++)
{
for (j = y - 1;j <= y + 1;j++)
{
if (mine[i][j] == '1')
{
n++;
}
}
}
return n;
}
void Find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
printf("玩家回合\n");
int win = 0;
int x = 0;
int y = 0;
while (win<row*col-COUNT)
{
printf("请输入坐标 > :");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= row)
{
if (show[x][y] != '*')
{
printf("已经排查过重新输入\n");
}
else
{if (mine[x][y] == '1')
{
printf("你被砸死了\n");
Display_board(mine, ROW, COL);
break;
}
else
{
int count = get_mine_count(mine, x, y);
show[x][y] = count + '0';
Display_board(show, ROW, COL);
}
}
}
else
{
printf("输入非法重新输入\n");
}}
if (win == row * col - COUNT)
{
printf("排雷成功\n");
}}
3.游戏头文件
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2//防止后期检验边缘雷出现超界行为
#define COLS COL+2
#define COUNT 79
void Init_board(char mine[ROWS][COLS], int rows, int cols, char set);
void Display_board(char arr[ROW][COL], int row, int col);
void Set_mine(char mine[ROWS][COLS], int row, int col);
void Find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);