目标:学习完指针前所有内容后,运用所学知识实现简易版扫雷小游戏。
1. 创建三个文件,game.h(头文件及函数声明) game.c(游戏具体流程) fac.c(函数实现方法)。
2. 写出游戏主体部分,包括菜单、选择。
void menu()
{
printf("*********************\n");
printf("******1. play********\n");
printf("******0. exit********\n");
printf("*********************\n");
}
int input = 0;
do
{
menu();
printf("请选择:(1 or 0 )。\n");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏。");
break;
default:
printf("选择错误!请重新选择:\n");
break;
}
} while (input);
3. 生成两个棋盘。一个用来存储雷的信息,一个用来展示排雷信息。用 1 来标记雷。
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
//初始化棋盘
Initboard(mine, ROWS, COLS, '0');
Initboard(show, ROWS, COLS, '*');
4. 建立好两个棋盘并分别初始化。接下来需要在 mine 棋盘中布置相应数量的雷,以 字符1 表示雷。此处需要设置随机数以确定雷的坐标。引用时间戳来提供两个随机数。同时判断同样位置不能重复布置。
srand((unsigned int)time(NULL));//生成随机数。
a = rand() % 9 + 1;
b = rand() % 9 + 1;
if (get[a][b] != '1')
{
get[a][b] = '1';
n--;
}
5. 设置好雷后,就需要进行排雷。输入坐标后,对坐标进行判断。是雷输出 被炸死 ,退出本局。不是雷,输出该位置附近雷的数量。当所有不是雷的位置排完后,结束本局游戏。对于非法位置进行提醒并重新输入。
printf("请输入排查的坐标:(a b)。");
scanf("%d %d", &a, &b);
if (get[a][b] != '1')
{
get[a][b] = num(got, a, b) + '0';
printboard(get, ROW, COL);
count++;
}
else if (get[a][b] == '1')
{
printf("很遗憾,你被炸死了。\n");
printboard(got, ROW, COL);
break;
}
else
{
printf("输入错误,请重新输入:");
}
if (count == row * col - n)
{
printf("恭喜你,排雷成功!\n");
}
利用循环实现当排查点附近都没有雷时,展开一片。
if (get[a][b] != '1')
{
get[a][b] = num(got, a, b) + '0';
if (get[a][b] == '0')
{
for (i = a - 1; i <= a + 1; i++)
{
for (j = b - 1; j <= b + 1; j++)
{
get[i][j] = num(got, i, j) + '0';
count++;
}
}
}
}