你有沒有想過,當你在小畫家使用「油漆桶」工具,或者在玩這款遊戲時,電腦是如何知道哪些格子應該變色,哪些不該變色?這一切都源自於一個經典的電腦科學概念:Flood Fill (溢洪演算法)。
Flood Fill 是一種用於確定多維陣列中連接區域的演算法。簡單來說,它就像是把水倒在地上,水會流向所有相連的低窪處,直到遇到牆壁或高地為止。
在我們的遊戲中:
實作 Flood Fill 主要有兩種方法:
就像走迷宮一樣,選定一條路一直走到黑,撞牆了再回頭找另一條路。這通常用「遞迴 (Recursion)」來實作。
function floodFill(x, y, targetColor, replacementColor) {
if (color[x][y] != targetColor) return;
color[x][y] = replacementColor; // 染色!
floodFill(x+1, y, targetColor, replacementColor); // 右
floodFill(x-1, y, targetColor, replacementColor); // 左
floodFill(x, y+1, targetColor, replacementColor); // 下
floodFill(x, y-1, targetColor, replacementColor); // 上
}這種寫法簡單優雅,但如果區域太大,可能會導致「堆疊溢位 (Stack Overflow)」錯誤。
這是本遊戲採用的方法。就像水波擴散一樣,先處理周圍一圈,再處理更外圍的一圈。我們使用一個「佇列 (Queue)」來記錄待處理的格子。
除了基本的染色,這個演算法也用於:
下次當你點擊色盤時,別忘了背後有個勤奮的小演算法,正在以毫秒等級的速度為你計算路徑呢!