第一件事:写出我们的main函数
//主函数
int main()
{
test();//进入游戏的测试
return 0;
}
进入游戏的测试当中,为了让游戏可以多次游玩,使用我们的do...while循环
进入do...while循环后要建立一个简易的菜单,让玩家能够选择进入游戏或退出游戏。
void menu()
{
printf("------------------------\n");
printf("-------1. play----------\n");
printf("-------0. exit----------\n");
printf("------------------------\n");
}
//游戏测试
void test()
{
int input = 0;
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1:
printf("欢迎来到扫雷游戏\n");
game();//扫雷游戏的逻辑
break;
case 0:
printf("退出扫雷游戏\n");
break;
default:
printf("请重新输入\n");
break;
}
} while (input);
}
看完我们简易的菜单之后,需要我们输入相对应的值,输入1则进入我们的扫雷游戏,输入0就退出我们的循环,输入其他的就要让玩家重新输入。while的表达式和switch的表达式一致,能够让输入其他的数字时,让循环继续。
那么再进入我们game函数的逻辑思路:
首先,扫雷游戏应是一个二维数组构成的游戏,所以我们要创建一个放置雷的棋盘,和一个让我们看的棋盘
若只创建一个棋盘,那么雷和棋盘上的数字可能会冲突。
char mine[ROWS][COLS] = { 0 };//布置好的雷的信息
char show[ROWS][COLS] = { 0 };//排查出的雷的信息
之后,我们要初始化我们的两个棋盘:
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;
}
}
}
我们的set就是我们放置的符号。
初始化了我们的棋盘之后,我们就要去打印我们的棋盘,但是我们不会去打印放置雷的棋盘。
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
printf("---------扫雷----------\n");
for (j = 0; j <= col; j++)
{
printf("%d ", j);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
printf("---------扫雷----------\n");
}
打印完我们的棋盘之后,我们就要开始布置我们的雷
void SetMine(char mine[ROWS][COLS], int row, int col)
{
int count = EASY_COUNT;
while (count)
{
//1. 生成随机下标
int x = rand() % row + 1;
int y = rand() % col + 1;
//2. 布置雷
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
布置雷,用我们的rand函数来布置雷的坐标。rand()%row + 1可以让我们的雷布置的范围在我们棋盘的任意位置。
而且每次游戏不能都重复上次的随机位置,所以我们可以用srand((unsigned int)time(NULL)),让我们的每次游戏都是随机的
那么布置完雷之后,就到了我们紧张刺激的扫雷环节
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 (show[x][y] != '*')
{
printf("该坐标被排查过了\n");
continue;
}
if (mine[x][y] == '1')
{
printf("很遗憾,你被炸死了\n");
DisplayBoard(mine, ROW, COL);
break;
}
else
{
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);
}
}
我们排查雷的时候,会出现一下几种情况:
1.我们排查的位置就是雷,那么我们就会被炸死,然后游戏结束,并且应该告诉我们整个棋盘的数据,所有雷的位置。
2.我们排查的位置不是雷,那么我们的游戏会继续,并再次打印我们的棋盘,并且打印了上一个步骤的结果。
3.我们排查的位置被我们重复排查,那么我们就应该被告诉,位置已被排查过。
4.我们排查的位置是非法的,不在我们整个棋盘规定的范围内。
5.我们最终会将所有的雷全部排查干净,也相当于,我们排查了所有的安全区域,那么要告诉我们排雷成功。