扫雷游戏的进阶实现

扫雷游戏的初级只实现了基本操作,只能一个一个的找雷无法与网页版本一样展开。

所以我们现在实现可以展开并且可以标记雷的进阶版扫雷。

1.如何实现展开版本

如果我们输入的坐标周围一圈八个坐标没有雷,那么程序将向周围展开找雷重复往返的执行,直到其中的坐标周围八个坐标有雷就停止进行并且把雷表在该坐标上,这就是展开的逻辑。现在就想如何实现,这种递推的方式不难想到可以用函数递归的方式实现。将输入坐标周围八个坐标都遍历再调用函数查找,这样往复就能实现展开了,所以我们用了一个spread函数进行实现。

void Spread(char mine[ROWS][COLS],char show[ROWS][COLS], int x, int y)
{
	int count = CountMine(mine, x, y);
	int i = 0;
	int j = 0;
	if (count == 0)//如果周围的雷数为0则进行
	{
		show[x][y] = ' ';//令该坐标为空格,然后继续查找
		for (i = x - 1; i <= x + 1; i++)
		{
			for (j = y - 1; j <= y + 1; j++)
			{
				if (show[i][j] == '*' && x >= 1 && x <= 9 && y >= 1 && y <= 9)//控制坐标并且不判断输入坐标
				{
					Spread(mine, show, i, j);//递归调用
				}
			}
		}
	}
	else
		show[x][y] = count + '0';//如果周围有雷就返回雷的数目在show数组上
}

 其中spread函数返回值为空,因为在内部完成了赋值,不需要返回值。

2.如何实现标记雷

标记雷的实现非常简单,只需要在循环里面加上一个if语句就能实现每次是否需要标记雷。

printf("标记雷输入 1,不标记雷输入 2.\n");
scanf("%d", &n);
if (n == 1)
{
	printf("请输入你要标记的坐标:");
	scanf("%d%d", &x, &y);
	show[x][y] = 33;
	DisplayBoard(show, ROW, COL);
}

 3.综合实现

现在只需要将上面的代码加入FindMine函数即可。

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	int n = 0;
		while (win < row * col - Easy_count)
		{
			printf("标记雷输入 1,不标记雷输入 2.\n");
			scanf("%d", &n);
			if (n == 1)
			{
				printf("请输入你要标记的坐标:");
				scanf("%d%d", &x, &y);
				show[x][y] = 33;
				DisplayBoard(show, ROW, COL);
			}
			printf("请输入你要找的坐标:");
			scanf("%d%d", &x, &y);
			if (x >= 1 && x <= row && y >= 1 && y <= col)
			{
				if (mine[x][y] == '1')
				{
					printf("很遗憾,你被炸死了,游戏结束。\n");
					DisplayBoard(mine, ROW, COL);
					break;
				}
				else
				{
					win++;
					Spread(mine, show, x, y);
					DisplayBoard(show, ROW, COL);
				}
			}
			else
			{
				printf("坐标输入有误,请重新输入。\n");
			}
		}
		if (win == row * col - Easy_count)
		{
			printf("恭喜你,扫雷成功。\n");
			DisplayBoard(mine, ROW, COL);
		}

	}
void Spread(char mine[ROWS][COLS],char show[ROWS][COLS], int x, int y)
{
	int count = CountMine(mine, x, y);
	int i = 0;
	int j = 0;
	if (count == 0)
	{
		show[x][y] = ' ';
		for (i = x - 1; i <= x + 1; i++)
		{
			for (j = y - 1; j <= y + 1; j++)
			{
				if (show[i][j] == '*' && x >= 1 && x <= 9 && y >= 1 && y <= 9)
				{
					Spread(mine, show, i, j);
				}
			}
		}
	}
	else
		show[x][y] = count + '0';
}

当然别忘记头文件里面函数的声明了 

现在就实现了完整版的扫雷游戏了。 

  • 18
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

剴415

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值