文章目录
一、扫雷游戏设计详细思路
1.游戏菜单设计
运行游戏程序的时候,打印出一个游戏菜单,提示玩家是选择游戏还是退出游戏程序。可以写一个菜单函数,函数里调用printf函数打印菜单信息。详细代码入下:
void menu(void)
{
printf("********************\n");
printf("*******1.PLAY*******\n");
printf("*******0.EXIT*******\n");
printf("********************\n");
}
运行效果如下:
接下来就要用scanf函数接收玩家的输入input,玩家输入1时,程序执行玩游戏程序;用户输入0时,程序执行退出游戏;如果玩家输入不是1也不是0,用printf函数提示玩家输入错误,请重新输入,这里可以用switch语句判断玩家的输入input。如果玩家玩了一局不过瘾,还要玩,程序再次打印菜单供玩家选择。程序至少运行一次,综上这里可以用一个do…while…来实现,while的判断可以使用玩家的输入input,当input为0时就退出整个程序。代码如下:
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();//菜单
printf("请输入>:");
scanf("%d", &input);
safe_flush(stdin);//清除scanf缓存区
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
return 0;
}
2.game程序设计
当玩家选择1时,我们就进入道路玩游戏程序game函数。在开始游戏之前,我们需要一个雷盘,雷盘可以用来设置地雷,但是不能让玩家看见地雷的位置,所以我们还要一个给玩家看的棋盘。这里我们创建两个二维数组,一个mine[ROWS][COLS],一个show[ROWS][COLS],ROWS和COLS使用宏定义,定义棋盘的大小,方便我们修改棋盘的大小。代码如下:
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
char mine[ROWS][COLS] = {
0 };
char show[ROWS][COLS] = {
0 };
ROWS为什么为ROW+2(COLS同理);其实很好理解,当玩家输入坐标时,我们需要计算坐标周围的地雷个数,如果有几个就在该坐标显示对应的数字,如果没有就显示字符空格,不过当坐标为棋盘边界时,计算坐标周围的地雷个数就会存在数组越界的情况,所以就在原数组的行、列上增加两行两列,这样即使越界了,读到的值也是雷盘的初始化值。
2.1棋盘的初始化
当创建好棋盘后,我们希望用字符‘0’表示没有雷,用字符‘1’表示有雷,在显示时,玩家看到的应该为字符’*'组成的棋盘(表示未知)。代码如下:
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0;
int j = 0;
for (i = 0