实现9*9扫雷游戏,我们可以先将这个游戏实现函数分5部分。
1:菜单的实现函数的调用
2:初始化雷
3:打印棋盘
4:布置雷
5:排查雷
注意:为了游戏有更好的解读性,我们可以把新建3个文件。
- 一个.h文件,用来放函数的声明。
- 两个.c文件,一个用来进入main函数来调用函数。一个用来进行函数的具体实现。
1:菜单的实现跟函数调用
其实这个部分最为简单,我直接上代码。
void cd()
{
printf("************************\n");
printf("****** 1:开始 ********\n");
printf("****** 0:退出 ********\n");
printf("************************\n");
}
int main()
{
int n = 0;
srand((unsigned int)time(NULL));
do
{
cd();//打印菜单
printf("请输入:");
scanf("%d", &n);
switch (n)
{
case 1:
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
}
while (n);
return 0;
}
因为我们需要打印9*9的数组,但是在数组边上的判断周围有无雷时会导致越界,所以具体的头文件如下:
void game()
{
char qp[AA][BB] = { 0 };
char sl[AA][BB] = { 0 };
}
头文件:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define A 9//行
#define B 9//列
#define AA A+2
#define BB B+2
2:初始化棋盘
我们需要初始化雷的棋盘(0)跟用户的棋盘(*)初始化棋盘可以在头文件中定义一个函数,这样两个数组都可以用一个函数初始化。
头文件:
void cs(char ssu[AA][AA], int aa, int bb, char c);
函数的传参:
//初始化数组字符为0跟*
cs(qp, AA, BB, '0');
cs(sl, AA, BB, '*');
实现:
void cs(char ssu[AA][BB], int aa, int bb, char c)
{
int i = 0;
int j = 0;
for (i = 0; i < aa; i++)
{
for (j = 0; j < bb; j++)
{
ssu[i][j] = c;
}
}
}
3:打印棋盘
这里我们只需要打印sl(*)的棋盘,在调试过程中我们也可以把雷打印出来,可以用来检查是否出现问题。
头文件:
void dy(char sl[AA][AA], int aa, int bb);
函数的传参:
dy(sl,A,B);
具体实现:
void dy(char sl[AA][BB], int aa, int bb)
{
int i = 0;
int j = 0;
printf("-----------------------\n");
for (i = 0; i <= aa; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <=aa; i++)
{
printf("%d ", i);
for (j = 1; j <= bb; j++)
{
printf("%c ", sl[i][j]);
}
printf("\n");
}
printf("-----------------------\n");
}
这时候,可以先调试起来,看看有没有问题。
4:布置雷
布置雷我们只需要在qp里面布置,到后面用户扫出来的雷会跟sl替换。
头文件:
void bz(char qp[AA][BB], int a, int b);
函数的传参:
bz(qp, A, B);
#define KK 10//雷的数量
具体实现:
void bz(char qp[AA][BB], int a, int b)
{
int j = KK;
while (j)
{
int x = rand() % a + 1;
int y = rand() % b + 1;
if (qp[x][y] == '0')
{
qp[x][y] = '1';
j--;
}
}
}
这里注意,rand的函数我们已经在main函数开始时就已经给它传参了一个time(NULL)随机值。
5:排查雷
头文件:
void pc(char qp[AA][BB], char sl[AA][BB], int a, int b);
函数的传参:
pc(qp, sl, A, B);
具体实现:
int zw(char qp[AA][BB],int x,int y)
{
return (qp[x - 1][y] +
qp[x - 1][y - 1] +
qp[x - 1][y + 1] +
qp[x][y - 1] +
qp[x][y + 1] +
qp[x + 1][y - 1] +
qp[x + 1][y] +
qp[x + 1][y + 1] -8*'0');
}
void pc(char qp[AA][BB], char sl[AA][BB], int a, int b)
{
int x = 0;
int y = 0;
int k = 0;
while (k<A*B-KK)//判断获胜条件9*9-10=71
{
printf("请输入坐标: ");
scanf("%d %d", &x, &y);
if (x > 0 && x <= a && y > 0 && y <= b)//判断有没有输入正确坐标
{
if (qp[x][y] == '1')
{
printf("很遗憾,你被炸死了!\n");
dy(qp, A, B);
break;
}
else
{
int j= zw(qp,x,y);//判断周围八个*有没有雷并返回
sl[x][y] = j+'0';
dy(sl, A, B);
k++;
}
}
else
{
printf("输入错误,请重新输入\n");
}
if (k == A * B - KK)
{
printf("恭喜你!排雷成功!\n");
}
}
}