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

完整工程文件:

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;
	}
}

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

执行情况

猜你喜欢

转载自blog.csdn.net/wss_yb/article/details/83473590