文章目录
游戏演示
文件的设计
game.h头文件负责变量的定义,函数的声明和各个头文件的包含
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define row 9
#define col 9
#define mineCount 10;
#define no_mine '0'
#define is_mine '1'
char mine[row][col];
char show[row][col];
void initBoard();
void setMine();
void printShowBoard();
void printMineBoard();
void findMine();
gameDriver.文件负责实现游戏的逻辑
game.c文件负责各个功能的实现
主函数
int main()
{
int input = 0;
//设置随机数生成器
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:>\n");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("=====\t退出游戏\t=====\n");
break;
}
} while (input);
return 0;
}
menu()菜单函数
void menu()
{
printf("=====\t扫雷\t=====\n");
printf("=====\t1.play\t=====\n");
printf("=====\t0.exit\t=====\n");
}
game()游戏函数
void game()
{
initBoard();
setMine();
findMine();
}
initBoard()初始化雷盘
void initBoard()
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
show[i][j] = '*';
mine[i][j] = no_mine;
}
}
}
setMine()设置雷
void setMine()
{
//雷数
int count = mineCount;
//布置雷
while (count != 0)
{
int x = rand() % row - 1;
int y = rand() % col - 1;
if (mine[x][y] == no_mine)
{
mine[x][y] = is_mine;
count--;
}
}
}
printShowBoard()打印显示雷盘
static void printShowBoard()
{
for (int i = 0; i < col + 1; i++)
{
printf("%d ", i);
}
printf("\n");
for (int i = 0; i < row; i++)
{
printf("%d ", i + 1);
for (int j = 0; j < col; j++)
{
printf("%c ",show[i][j]);
}
printf("\n");
}
}
printMineBoard()打印真实雷盘
static void printMineBoard()
{
for (int i = 0; i < col + 1; i++)
{
printf("%d ", i);
}
printf("\n");
for (int i = 0; i < row; i++)
{
printf("%d ", i + 1);
for (int j = 0; j < col; j++)
{
printf("%c ", mine[i][j]);
}
printf("\n");
}
}
findMine()找雷
void findMine()
{
int x = 0;
int y = 0;
int i = 0;
int j = 0;
//周围雷的总数
int mine_sum = 0;
//还需排查的位置
int need_check_position = row * col - mineCount;
do
{
mine_sum = 0;
printShowBoard();
printf("请输入坐标:>");
scanf("%d %d", &x, &y);
//坐标合法
if (x >= 1 && x <= 9 && y >= 1 && y <= 9)
{
//坐标上不是雷,并且没被排查过
if (mine[x - 1][y - 1] == no_mine && show[x -1][y -1] == '*')
{
//计算周围的雷数
for (i = x - 1 - 1; i < x - 1 - 1 + 3; i++)
{
for (j = y - 1 - 1; j < y - 1 - 1 + 3; j++)
{
if (i >= 0 && i <= row - 1 &&
j >= 0 && j <= col - 1 &&
mine[i][j] == is_mine)
{
mine_sum = mine_sum + mine[i][j] - '0';
}
}
}
//放到show数组里
show[x - 1][y - 1] = mine_sum + '0';
//需要排查的坐标总数减一
need_check_position--;
}
//坐标上的不是雷,但已经被排查过
else if (mine[x - 1][y - 1] == no_mine && show[x - 1][y - 1] != '*')
{
printf("此位置已排查,请重新输入\n");
}
//坐标是雷
else
{
printf("游戏失败\n");
printMineBoard();
break;
}
}
//坐标不合法
else
{
printf("输入有误,请重新输入\n");
}
} while (need_check_position != 0);
if (need_check_position == 0)
{
printf("恭喜你,扫雷成功!!!\n");
}
}