- 显示该点周围雷的个数坐标周围没雷,可以实现展开结束时显示用时
#define ROW 11 // 9 #define COL 11 // 9 #define NUMS 20 #include主函数,主菜单设计#include #include // 1.初始化棋盘 void InitsBoard(char board[ROW][COL], int row, int col); //2. 布置雷 void PutDanger(char board[ROW][COL], int row, int col, int nums); // 打印棋盘 void DisplayBoard(char board[ROW][COL], int row, int col); //拆除雷 char DeleteDanger(char rboard[ROW][COL], char sboard[ROW][COL], int row, int col);
#include"game.h" // 包含的头文件
double start, finish; // 定义时间的来时和结束
void meau()
{
printf("#####################################n");
printf("########## 1.play ########n");
printf("########## 0.exit ########n");
printf("#####################################n");
}
void game()
{
// 扫雷
char sboard[ROW][COL];
char rboard[ROW][COL] = { 0 };
//初始化展示棋盘
InitsBoard(sboard, ROW, COL);
//布置雷
PutDanger(rboard, ROW, COL,NUMS);
// 打印棋盘
DisplayBoard(sboard, ROW, COL);
int times = ((ROW - 2) * (COL - 2) - NUMS) ;
while (times)
{
//拆除雷
char ret = DeleteDanger(rboard, sboard, ROW, COL);
if (ret == 'D')
{
// 打印棋盘
DisplayBoard(rboard, ROW, COL);
printf("你被炸死了 ");
finish = clock();//取结束时间
printf("用时%d 秒n", (int)(finish - start) / CLOCKS_PER_SEC);
break;
}
else if(ret == 'C')
{
// 打印棋盘
DisplayBoard(sboard, ROW, COL);
times--;
}
}
if (times == 0)
{
// 打印棋盘
DisplayBoard(rboard, ROW, COL);
printf("你赢了 ");
finish = clock();//取结束时间
printf("用时%d 秒n", (int)(finish - start) / CLOCKS_PER_SEC);
}
}
int main()
{
srand((unsigned)time(NULL));
int input = 0;
do
{
meau();
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏n");
break;
default:
printf("输入错误,请重新输入n");
break;
}
} while (input);
return 0;
}
必要函数的实现
#include"game.h"
// 1.初始化展示棋盘
void InitsBoard(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
board[i][j] = '*';
}
}
}
//2.布置雷
void PutDanger(char board[ROW][COL], int row, int col,int nums)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
board[i][j] = '0';
}
}
int count = 0;
while(count < nums)
{
int x = rand() % 9 + 1;
int y = rand() % 9 + 1;
if (board[x][y] == '0')
{
board[x][y] = '1';
count++;
}
}
}
// 打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row - 1; i++)
{
printf("%d ", i);
}
printf("n");
for (int i = 1; i < row - 1; i++)
{
printf("%d ", i);
for (int j = 1; j < col - 1; j++)
{
printf("%c ", board[i][j]);
}
printf("n");
}
}
// 统计雷的数量
int Sum(char sboard[ROW][COL],char rboard[][COL] ,int x,int y)
{
int Dnums = 0;
for (int i = x - 1; i <= x + 1; i++)
{
for (int j = y - 1; j <= y + 1; j++)
{
if (rboard[i][j] == '1')
{
Dnums++;
}
}
}
return Dnums;
}
void Strech(char sboard[ROW][COL],char rboard[ROW][COL],int x,int y)
{
if (x < 1 || x > 9 || y < 1 || y > 9)
{
return;
}
if (sboard[x][y] != '*')// 碰到已经排查过的就停下
{
return;
}
int Dnums = Sum(sboard, rboard, x, y);
if (Dnums != 0)
{
sboard[x][y] = Dnums + '0';
return;
}
sboard[x][y] = '0';
// 八个方向延伸
Strech(sboard, rboard, x - 1, y - 1);
Strech(sboard, rboard, x - 1, y );
Strech(sboard, rboard, x - 1, y + 1);
Strech(sboard, rboard, x , y - 1);
Strech(sboard, rboard, x , y + 1);
Strech(sboard, rboard, x + 1, y - 1);
Strech(sboard, rboard, x + 1, y );
Strech(sboard, rboard, x + 1, y + 1);
}
//拆除雷
char DeleteDanger(char rboard[ROW][COL], char sboard[ROW][COL], int row, int col)
{
printf("请输入要排插位置的坐标:n");
while (1)
{
int x = 0;
int y = 0;
scanf("%d %d", &x, &y);
//int x = rand() % 9 + 1;
//int y = rand() % 9 + 1;
if (x >= 1 && x < row - 1 && y >= 1 && y < col - 1 && sboard[x][y] == '*')
{
if (rboard[x][y] == '1')
{
return 'D';
break;
}
else
{
Strech(sboard,rboard, x, y); // 延申
return 'C';
break;
}
}
else
{
printf("输入坐标有误,请重新输入n");
}
}
} 


