代码要点
两个二维字符数组
一个存放雷的信息,另一个存放周围雷的个数的布置状态信息
9*9为了避免越界,建立一个11*11的数组,且两个数组都对应为11*11
代码实现
三个文件实现
test.c
game.c
game.h
初始化棋盘
InitBoard函数
mine数组最开始全是0
show数组最开始全是*
两个数组初始化用一个函数初始化,要把需要初始化什么内容也传进去
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{
int i = 0;
for (i = 0; i < rows; i++)
{
int j = 0;
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
打印棋盘
只需打印用户看到的9*9
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0;
printf("----------扫雷游戏----------\n");
for (i = 1; i <= row; i++)
{
int j = 0;
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
棋盘可读性(行列)
打印行
for (i = 1; i <= row; i++)
{
printf("%d ", i);
int j = 0;
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
打印列,循环打印列,避免错位加个零
for (i = 0; i <= col; i++)
{
printf("%d ", i);
}
雷的布置
随机数,产生十个雷
void SetMine(char board[ROWS][COLS], int row, int col)
{
//布置10个雷
//生成随机数
int count = 10;
//每布置成功一个count--
while (count)//count只要不是零循环继续
{
//每次生成一个随机坐标,行和列均从一到九
int x = rand() % row + 1;//%9余数是0~8加一就好了
int y = rand() % col + 1;//为使rand有效需要在工程中调用一次srand
//判断随机生成的坐标不是雷再布置雷
if (board[x][y] == '0')
{
board[x][y] = '1';
count--;//count要放到if中而不是while中,count--的前提是布置成功
}
}
}
排查雷
判断选中的不是雷的坐标的周围有几个雷,此函数有返回值
void Findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("请输入要排查的坐标>:\n");
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
{
//该位置不是雷,统计该位置周围有几个雷
int count = GetMineCount(mine, x, y);
show[x][y] = count + '0';//将数字三转化为字符三
//注意排查完雷记得打印一下
DisplayBoard(show, ROW, COL);
}
}
else
{
printf("坐标非法请重新输入\n");
}
}
}
/*计算选中坐标周围的雷的个数,雷是1,不是雷是0
将字符1转换为数字1并把选中坐标周围的字符全部相加即可
数字转化为字符需要加减字符0
周围八个坐标则需要加减八个字符0
*/
int GetMineCount(char mine[ROWS][COLS], int x, int y)//x,y是排查的非雷坐标
{
return(mine[x - 1][y - 1] + mine[x - 1][y + 1] + mine[x + 1][y - 1] +
mine[x + 1][y + 1] + mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y]
+ mine[x - 1][y] - 8 * '0');//当数字与字符相运算时,实际上是ASCLL码的相加减
}
控制输赢机制
控制while条件,来限制游戏的开始,根据EasyCount来设置难度
while (win < row * col - EasyCount)
{
printf("请输入要排查的坐标>:\n");
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
{
//该位置不是雷,统计该位置周围有几个雷
int count = GetMineCount(mine, x, y);
show[x][y] = count + '0';//将数字三转化为字符三
//注意排查完雷记得打印一下
DisplayBoard(show, ROW, COL);
}
}
else
{
printf("坐标非法请重新输入\n");
}
if (win == row * col - EasyCount)
{
printf("恭喜你,排雷成功\n");
DisplayBoard(mine, ROW, COL);
}
}