扫雷游戏的完整实现

可以在基础扫雷上进行升级

1,使旁边没有雷的地方全部展开

2,用户可以标记其认为是雷的地方

一,基于上一篇博客中的FindCount函数,需要做出如下改变

1,利用SetBlack递归去判断周围雷的个数

如果周围没有雷,那么就不打印,用空格替代,继续往下递归

如果有雷,那么就去获取雷的个数,赋值给show数组中

递归的结束条件为周围有雷,继续条件为周围没有雷

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

2,判断游戏结束方式的改变

我们应该使用MineCount函数去获取show中剩余‘*’的个数。

如果设置雷的个数等于剩余’*‘的个数,那么就游戏成功。

int MineCount(char show[ROWS][COLS], int row, int col)
{
	int count = 0;
	for (int i = 1; i <= row; i++)
	{
		for (int j = 1; j <= col; j++)
		{
			if (show[i][j] == '*')
			{
				count++;
			}
		}
	}
	return count;
}

二,进行标记雷的地方

我们可以用#来标记疑似雷的地方


1,询问用户是否标记,1代表标记,0代表不标记

2,定义一个MarkCount函数

先判断坐标的合法性,合法再进行标记

void MarkCount(char show[ROWS][COLS])
{
	int x, y;
	
	while (1)
	{
		printf("请输入要标记的坐标!\n");
	    scanf("%d %d", &x, &y);
		if (x >= 1 && x <= ROW && y >= 1 && y <= COL && show[x][y] == '*')
		{
			show[x][y] = '!';
			break;
		}
		else
		{
			system("cls");
			printf("坐标非法,请重新输入\n");
			
			PrintBoard(show,ROW, COL);
		}
	}
}
3,可以适当使用system("cls")来清屏提高代码整洁度

system头文件为<windows.h>

三,完整代码

game2_3_9 · Fan Gao/Fan_Gao - 码云 - 开源中国 (gitee.com)

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值