首先在写扫雷前我们需要理清逻辑,整个程序运行都需要哪些步骤。
1 我们需要准备一块初始化的棋盘 这里我写的是9*9的扫雷,所以需要准备11*11的棋盘,因为在计算周边雷个数时 四个角和四条边是特殊的,所以我在这里扩大棋盘,,让它的规律都一样。
2 有了棋盘后需要埋雷。
3准备好棋盘后,我们在呈现给用户时需要把棋盘遮住。
4 前面是在游戏开始前需要准备的工作,在游戏开始后 ,用户输入坐标,首先要判断它是不是雷。如果不是雷,计算周边雷的个数。
5 最后我们需要写出用户成功的判断条件。
接下来开始游戏前的工作
void Initialize_board(int(*ar)[11], int row, int col) //初始化棋盘
{
for (int i = 0; i < col - 1; i++)
{
printf("%d ", i);
}
printf("\n");
for (int j = 2; j < row; j++)
{
printf("%d ", j - 1);
for (int k = 2; k < col; k++)
{
if (ar[j][k] > 0)
{
ar[j][k]--;
}
printf("%2d ", ar[j][k]);
}
printf("\n");
}
}
void lay_mine(int (* ar)[11], int row, int col,int *br,int tomine) //埋地雷
{
const int mine = 10;
srand(time(nullptr));
for (int i = 0; i < mine; i++)
{
int x = (rand() % (row-2)) + 2;
int y = (rand() % (col-2)) + 2;
if (ar[x][y] == 0)
{
ar[x][y] = -1;
*(br+i) = (x * col )+ y ; // 这里用一个一维数组记录雷的坐标,方便一会的判断。
}
else
{
i--;
}
}
}
打印效果
void print_checkerboard(int (*ar)[11], int row, int col) //打印棋盘并覆盖值
{
for (int i = 0; i < col-1; i++)
{
printf("%d ", i);
}
printf("\n");
for (int j = 2; j < row; j++)
{
printf("%d ", j - 1);
for (int k = 2,x=0; k < col; k++,x++)
{
if (ar[j][k]==0||ar[j][k]==-1)
{
printf("* ");
}
else
{
printf("%d ", ar[j][k]-1);
}
}
printf("\n");
}
}
打印效果
接下来开始游戏
我们需要有一个计算周围雷数量的函数
int count_mine(int(*ar)[11], int row, int col,int a,int b) //计算雷的个数
{
int count = 0;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (ar[a-1+i][b-1+j] == -1)
{
count++;
}
}
}
return count+1;
}
现在我们需要写出判读用户扫雷成功的代码
bool From_mines(int* br,int mine,int col,int a,int b) //计算排出的地雷
{
int num = 0;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
for (int k = 0; k < mine; k++)
{
if (*(br + k) == (((a + i-1) * col) + b-1 + j))
{
*(br + k) = 0;
}
}
}
}
for (int i = 0; i < mine; i++)
{
num += br[i];
}
return num;
}
这里的判断条件是用户把十个雷的扫出即为成功
最后总代码如下
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<assert.h>
vvoid Initialize_board(int(*ar)[11], int row, int col) //初始化棋盘
{
for (int i = 0; i < col - 1; i++)
{
printf("%d ", i);
}
printf("\n");
for (int j = 2; j < row; j++)
{
printf("%d ", j - 1);
for (int k = 2; k < col; k++)
{
if (ar[j][k] > 0)
{
ar[j][k]--;
}
printf("%2d ", ar[j][k]);
}
printf("\n");
}
}
void print_checkerboard(int (*ar)[11], int row, int col) //打印棋盘
{
for (int i = 0; i < col-1; i++)
{
printf("%d ", i);
}
printf("\n");
for (int j = 2; j < row; j++)
{
printf("%d ", j - 1);
for (int k = 2,x=0; k < col; k++,x++)
{
if (ar[j][k]==0||ar[j][k]==-1)
{
printf("* ");
}
else
{
printf("%d ", ar[j][k]-1);
}
}
printf("\n");
}
}
void lay_mine(int (* ar)[11], int row, int col,int *br,int tomine) //埋地雷
{
const int mine = 10;
srand(time(nullptr));
for (int i = 0; i < mine; i++)
{
int x = (rand() % (row-2)) + 2;
int y = (rand() % (col-2)) + 2;
if (ar[x][y] == 0)
{
ar[x][y] = -1;
*(br+i) = (x * col )+ y ;
}
else
{
i--;
}
}
}
int count_mine(int(*ar)[11], int row, int col,int a,int b) //计算雷的个数
{
int count = 0;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (ar[a-1+i][b-1+j] == -1)
{
count++;
}
}
}
return count+1;
}
bool From_mines(int* br,int mine,int col,int a,int b) //计算排出的地雷
{
int num = 0;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
for (int k = 0; k < mine; k++)
{
if (*(br + k) == (((a + i-1) * col) + b-1 + j))
{
*(br + k) = 0;
}
}
}
}
for (int i = 0; i < mine; i++)
{
num += br[i];
}
return num;
}
void play_game(int(* ar)[11], int row, int col) //开始游戏
{
assert(ar != NULL && row>=0 && col>=0);
static int remine = 10;
const int tomine = 10;
int m_arr[tomine] = {};
printf("********1 play******\n");
printf("********0 exit******\n");
int count = 0;
int val = 0;
int x = 0, y = 0;
scanf_s("%d", &val);
if (val == 1)
{
lay_mine(ar, row, col,m_arr, tomine); //埋雷
print_checkerboard(ar, row, col); //打印棋盘
while (1)
{
printf("请输入坐标 格式为:X Y\n");
scanf_s("%d%d", &x, &y);
if (x < 0 || x>9 || y < 0 || y>9)
{
printf("输入错误,请重新输入\n");
continue;
}
x = x + 1;
y = y + 1;
if (ar[x][y] == -1)
{
Initialize_board(ar, row, col);
printf("很抱歉你已经踩到地雷,游戏结束\n");
continue;
}
else
{
count = count_mine(ar, row, col, x, y); //计算周围雷个数
ar[x][y] = count;
print_checkerboard(ar, row, col);
}
if (!From_mines(m_arr, tomine, col, x, y))
{
Initialize_board(ar, row, col);
printf("恭喜你扫雷成功\n");
break;
}
}
}
}
int main()
{
const int n = 11;
int ar[n][n] = { };
play_game(ar, n, n);
return 0;
}