扫雷程序------展开功能与第一步免死功能的实现

本文详细解析了一款排雷游戏的实现算法,包括排雷函数和展开函数的具体代码及执行流程,介绍了如何通过用户输入坐标进行排雷操作,以及如何在无雷区域自动展开游戏界面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

完整工程文件:

https://github.com/Yubao-wss/Game/tree/master/Demine/Demine

如下代码为排雷函数:

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int k = 0;
	int l = 0;
	int win = 0;
	while (win < row*col - COUNT)
	{
		printf("请输入要排查的坐标:");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (win == 0) //判断是否为第一步
			{
				if (mine[x][y] == '1')
				{
					mine[x][y] = '0';
					while (1)
					{
						k = rand() % row + 1;
						l = rand() % col + 1;
						if (mine[k][l] == '0')
						{
							mine[k][l] = '1';//移动雷
							break;
						}
					}
				}
				win++;
				/*DisplayBoard(mine, ROW, COL);*/
			}
			if (mine[x][y] == '1')
			{
				printf("你被炸死了!\n");
				DisplayBoard(mine, row, col);
				break;
			}
			else
			{
				int count = GetMineCount(mine, x, y);
				show[x][y] = count + '0';
				if (count == 0)
				{
					OpenBoard(mine, show, x, y); //调用展开函数
				}
				DisplayBoard(show, row, col);
				win = 0;//初始化win计数
				for (x = 1; x <= row; x++)
				{
					for (y = 1; y <= col; y++)
					{
						if (show[x][y] != '*')
							win++; //win此时等于现在玩家棋盘上不是‘*’的坐标的个数
					}
				}
			}
		}
		else
		{
			printf("坐标非法,请重新输入!\n");
		}
	}
	if (win == row*col - COUNT) //成功的条件
	{
		printf("排雷成功!\n");
		DisplayBoard(mine, row, col);
	}
}

展开函数:

void OpenBoard(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
	show[x][y] = ' ';
	if (mine[x - 1][y] == '0'&&x - 1 > 0 && y  > 0 && show[x - 1][y] == '*')
	{
		x = x - 1;
		show[x][y] = GetMineCount(mine, x, y) + '0';
		if (GetMineCount(mine, x, y) == 0)
		{
			OpenBoard(mine, show, x, y);
		}
		x = x + 1;
	}

	if (mine[x][y + 1] == '0'&&x  > 0 && y + 1 > 0 && show[x][y + 1] == '*')
	{
		y = y + 1;
		show[x][y] = GetMineCount(mine, x, y) + '0';
		if (GetMineCount(mine, x, y) == 0)
		{
			OpenBoard(mine, show, x, y);
		}
		y = y - 1;
	}
	if (mine[x][y - 1] == '0'&&x  > 0 && y - 1 > 0 && show[x][y - 1] == '*')
	{
		y = y - 1;
		show[x][y] = GetMineCount(mine, x, y) + '0';
		if (GetMineCount(mine, x, y) == 0)
		{
			OpenBoard(mine, show, x, y);
		}
		y = y + 1;
	}

	if (mine[x + 1][y] == '0'&&x + 1 > 0 && y  > 0 && show[x + 1][y] == '*')
	{
		x = x + 1;
		show[x][y] = GetMineCount(mine, x, y) + '0';
		if (GetMineCount(mine, x, y) == 0)
		{
			OpenBoard(mine, show, x, y);
		}
		x = x - 1;
	}
}

还有很多需要优化的地方!

执行情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值