# 3.总结

## 1.原理简介

首先我们需要一个空的雷盘，在其中随机埋入十枚雷，当我们排这颗雷时，若此位置为雷，则游戏失败，若不是雷，则会出现周围八个方格中雷的个数，我们使用数组实现这一目标。

## 2.分布目标及代码实现

``````void test()
{
int input = 0;
srand((unsigned int)time(NULL));

do
{
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
//扫雷
game();
break;
case 0:
printf("退出游戏n");
break;
default:
printf("选择错误n");
break;
}
} while (input);
}``````
``````void menu()
{
printf("***********************n");
printf("*****  1. play     ****n");
printf("*****  0. exit     ****n");
printf("***********************n");
}
``````

``````#define ROW 9
#define COL 9

#define ROWS ROW+2
#define COLS COL+2``````
``````void InitBoard(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 DisplayBoard(char board[ROWS][COLS], int row, int col)
{
//1~9
int i = 0;
int j = 0;

//列号的打印
for (i = 0; i <= col; i++)
{
printf("%d ", i);
}
printf("n");

for (i = 1; i <= row; i++)
{
printf("%d ", i);//打印行号

for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("n");
}
}``````

接下来我们需要在棋盘中随机设置10颗雷，同样利用前文代码中提到的srand，我们使用rand()%9+1便可得到1~9的数字，正好在我们设置雷的范围内，具体代码如下：

``````void SetMine(char mine[ROWS][COLS], int row, int col)
{
int count = EASY_COUNT;

while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;

if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
``````

``````static int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
return mine[x - 1][y] +
mine[x - 1][y - 1] +
mine[x][y - 1] +
mine[x + 1][y - 1] +
mine[x + 1][y] +
mine[x + 1][y + 1] +
mine[x][y + 1] +
mine[x - 1][y + 1] - 8 * '0';
}
``````

``````void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;

while (win < row * col - EASY_COUNT)
{
printf("请输入要排查的坐标:>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (mine[x][y] == '1')
{
printf("很遗憾你被炸死了n");
DisplayBoard(mine, row, col);
break;
}
else
{
//计算x,y坐标周围有几个雷
int n = get_mine_count(mine, x, y);
show[x][y] = n + '0';
DisplayBoard(show, row, col);
win++;
}
}
else
{
printf("输入坐标非法，无法排雷，请重新输入n");
}
}
if (win == row * col - EASY_COUNT)
{
printf("恭喜你，排雷成功n");
DisplayBoard(mine, row, col);
}

}
``````

THE END