1. 程式人生 > >掃雷程式------展開功能與第一步免死功能的實現

掃雷程式------展開功能與第一步免死功能的實現

完整工程檔案:

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

還有很多需要優化的地方!

執行情況