最后有完整的代码
写扫雷逻辑
- 创造一个雷盘基本样子
- 初始化雷盘
- 埋雷
- 扫雷
1.创造一个雷盘基本样子
比如我们建立一个9*9大的雷盘,由于我们要考虑到假如玩家输入1,1坐标时(或者在边缘时如图)如何判断附近的雷,最简单的方法是建立一个11*11的雷盘
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
创造雷盘的基本想法与三子棋有点一样,不一样的地方是我们初始化后雷埋后需要一个盖板(掩盖)如果不掩盖雷就暴露了。所以要初始化两个盘。
void mine_clearance()
{
//board为底层
//intboard为上层
char board[ROWS][COLS] = {0};
char intboard[ROWS][COLS] = {0};
}
然后我们就可以来初始化雷盘,我们为了区分埋雷的与盖板的区别,埋雷的用字符0来代表,盖板用字符*来表。
void mine_clearance()
{
//board为底层
//intboard为上层
char board[ROWS][COLS] = {0};
char intboard[ROWS][COLS] = {0};
//初始化
frame(board, ROWS, COLS,'0');
frame(intboard, ROWS, COLS, '*');
}
//set代替字符
void frame(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 mine_clearance()
{
//board为底层
//intboard为上层
char board[ROWS][COLS] = {0};
char intboard[ROWS][COLS] = {0};
//初始化
frame(board, ROWS, COLS,'0');
frame(intboard, ROWS, COLS, '*');
//打印画面
print_board(intboard, ROW, COL);//上面
//下面后期要隐藏掉
print_board(board,ROW,COL);//下面
}
//打印画面
void print_board(char borad[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
//打印横坐标
for ( i = 0; i <=row; i++)
{
printf(" %d",i);
}
printf("\n");
//为什么i为1应为雷盘初始为11*11前面也讲到了
for ( i = 1; i <= row; i++)
{
//打印竖坐标
printf(" %d",i);
for ( j = 1; j <= col; j++)
{
printf(" %c",borad[i][j]);
}
printf("\n");
}
}
现在就像种地,已经开荒了咱们就要种雷了。(埋雷肯定是电脑埋,所以我们要搞时间戳,随机值)随机值我不做过多的讲解
void mine_clearance()
{
//board为底层
//intboard为上层
char board[ROWS][COLS] = {0};
char intboard[ROWS][COLS] = {0};
//初始化
frame(board, ROWS, COLS,'0');
frame(intboard, ROWS, COLS, '*');
//打印画面
print_board(intboard, ROW, COL);//上面
//print_board(board,ROW,COL);//下面
//埋雷
bury(board,ROW,COL);//埋雷
srand((unsigned int)time(NULL));
void bury(char board[ROWS][COLS], int row, int col)
{
int count = easily;
while (count)
{
int x = rand() % row + 1;//比如一随机数X%4必然X的余数小于4大于等于0
int y = rand() % col + 1;
if (board[x][y]=='0')
{
board[x][y] = '1';
count--;
}
}
}
雷已经下好后,就可以扫雷了
void mine_clearance()
{
//board为底层
//intboard为上层
char board[ROWS][COLS] = {0};
char intboard[ROWS][COLS] = {0};
//初始化
frame(board, ROWS, COLS,'0');
frame(intboard, ROWS, COLS, '*');
//打印画面
print_board(intboard, ROW, COL);//上面
//print_board(board,ROW,COL);//下面
//埋雷
bury(board,ROW,COL);//埋雷
//扫雷
sweep(board,intboard,ROW,COL);
}
//判断附近雷的个数
int judge(char board[ROWS][COLS], int x, int y)
{
return board[x][y - 1] + board[x - 1][y - 1] + board[x - 1][y] +
board[x - 1][y + 1] + board[x][y + 1] + board[x + 1][y + 1] +
board[x + 1][y] + board[x + 1][y - 1] - 8 * '0';
}
void sweep(char board[ROWS][COLS], char intboard[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int sum = 0;
while (sum<row*col-easily)//9*9=81 81-10个雷为71不然扫完都不会结束。
{
printf("请输入坐标:\n");
scanf_s("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
//踩中雷
if (board[x][y]=='1')
{
printf("很遗憾,你踩雷了!\n");
print_board(board, ROW, COL);//告知你总答案
break;
}
//没有踩中
else if(board[x][y] == '0')
{
//判断附近雷
int count = judge(board, x, y)
intboard[x][y] = count + '0';
print_board(intboard, ROW, COL);
sum++;
}
}
}
if (sum == col * row - easily)
{
printf("恭喜你成功了,扫雷!!!\n");
print_board(board, ROW, COL);
}
}
特别讲解一下
int count = judge(board, x, y)
intboard[x][y] = count + '0';
judge自定义函数它是勘察附近8个是否有有雷并且统计雷数,由于我我们用的是字符所有不可以直接计算,但有一个小诀窍就是ASCII码当字符1-字符0=数字1
我们就可以计算当8个全部为0时512-512=0,当7个为0一个为1时就是513-512=1
然后count=1+字符0=65==字符1
--------------------------------------------------------------------------------------------------------------------------------