不,在 Klotski 中,沒有任何一個方塊會旋轉,也沒有任何一個方塊一次會移動超過一個正交格。在這個原版滑塊拼圖中,每個矩形在整個遊戲過程中都會維持其既定的寬度與高度。每一次被接受的動作都會將選中的方塊精確地沿水平或垂直方向移動一格。若候選的佔位範圍會延伸超出 4 by 5 的棋盤,或與其他方塊重疊,該步移動會以原子化的方式被拒絕:位置、歷史紀錄、移動次數、分數、選取狀態與完成狀態全部維持原樣。這條規則已被內建於引擎中,以一個明確的佔位範圍檢查在安裝任何新狀態之前執行。正就是這條單一的機械規則,讓 Klotski 有別於俄羅斯方塊的堆疊遊戲,也有別於那種可以把方塊推動兩格或三格的自由格式格子;同時也是這個原因,讓此拼圖的最短解法可以表示為一連串原子化的單格步驟,任何人都能親手逐步檢視。

原子化的單格移動實際上做了什麼
Klotski 中的每一次成功移動,都是沿著格線座標系統的一個單一步驟,其中欄從 0 跑到 3,列從 0 跑到 4。舉例來說,一個 2 by 2 的目標方塊會佔據 2 by 2 的格點範圍;當你按下向下方向鍵時,該佔位範圍會向下移動一列,而不是兩列、三列或四列。引擎會先建構出完整的目的地佔位範圍,然後檢查該範圍中的每一格是否都落在棋盤內,以及這些格子是否已有其他方塊佔據。若任一條件不符,該次移動會被靜默拒絕,可見的棋盤不會閃爍、不會播放動畫,也不會震動——候選的移動只是從未發生過。
這種原子化的語意對玩家有兩個實際影響。第一,你完全不必擔心長按或拖曳會讓方塊瞬間跨越棋盤;規則本身就不允許這樣做。第二,這條規則讓每一次被接受的移動都成為移動歷史中可驗證的事件,這正是安全 Undo(復原)功能的基礎,也是獨立以廣度優先搜尋證明此拼圖可在恰好六步內解出的基礎。
你無法更改的固定佔位範圍
Klotski 棋盤上恰好包含六個矩形,每個都有既定的大小與既定的起始座標。無論你進行多少次移動,這些尺寸永遠不會改變。
| 方塊編號 | 名稱 | 大小 | 起始位置 (x, y) |
|---|---|---|---|
| 1 | 目標 | 2 by 2 | (1, 0) |
| 2 | 左支柱 | 1 by 2 | (0, 0) |
| 3 | 右支柱 | 1 by 2 | (3, 0) |
| 4 | 滑塊 | 1 by 1 | (1, 2) |
| 5 | 護衛 | 1 by 1 | (0, 2) |
| 6 | 門閂 | 1 by 1 | (2, 2) |
這兩個 1 by 2 的支柱是不同的矩形,位於不同的位置,彼此並非鏡像;你無法旋轉任一支柱來把它的寬變成高。2 by 2 的目標方塊是棋盤上唯一的大型矩形,在整個遊戲過程中其佔位範圍始終保持 2 by 2。三個 1 by 1 方塊(滑塊、護衛與門閂)雖然尺寸相同,但它們是各自獨立的方塊,各有自己的識別身分,而引擎是以編號而非外觀來追蹤它們的。
整體而言,這六個矩形共佔據 4 by 5 棋盤 20 格中的 11 格,留下 9 格空白可用於移動。目標是將目標方塊的左上角從 (1, 0) 移到 (1, 3),使 2 by 2 的佔位範圍填滿最下面兩列的第 1 欄與第 2 欄,並從位於底邊中央那個既定的兩欄開口離開。由於每一次移動都只會將方塊精確地移動一格,且永遠不會旋轉,要抵達該出口至少需要六次被接受的動作,而達成此目標的路徑在長度上可證明是唯一的。
如何在瀏覽器中遊玩 Klotski
如果你想把這些規則付諸實踐,整個拼圖都能在你的瀏覽器中於本機執行,請前往 Klotski 頁面。下列三步驟的循環說明了你實際上需要做的所有事。
- 在棋盤上點選其中一個既定矩形,或按下 1 到 6 的數字鍵來選取它。按下 1 會選取 2 by 2 的目標;按下 2 會選取左支柱;3 選取右支柱;4 選取滑塊;5 選取護衛;6 選取門閂。被選中的方塊會出現可見的外框,且其名稱會顯示在狀態區中。
- 使用方向控制鍵或方向鍵,將選中的方塊移動一格。上、下、左、右分別嘗試朝該方向移動恰好一格。若移動後的佔位範圍仍留在棋盤內且未與其他方塊重疊,則該次移動會被接受,移動次數加一,並將先前位置的快照附加至 Undo(復原)歷史中。若移動不合法,位置、歷史紀錄、移動次數、分數與選取狀態全部維持原樣——你可以繼續嘗試,而不會失去目前的進度。
- 清空中央通道,並將 2 by 2 的目標方塊移至底部兩欄的開口,獲得恰好 1,000 分。每當一個合法的嘗試反而擋住了另一條路線時,請使用 Undo;Undo 會從一份深層複製的快照中還原先前位置,並將移動次數減一,因此你可以毫無風險地進行探索。
抵達出口即為結束:獲勝的那一步會將分數設定為恰好 1,000,並凍結方塊的選取、移動與 Undo 功能。若想再玩一次,請使用「重新開始」,它會還原全部六個原始位置、重新選取目標、清空歷史紀錄、將移動次數重設為零,並把分數歸零。
為何最短解法恰好是六步
由於每個方塊每次都只移動一格,並且永遠不會旋轉,整個狀態空間可以展開為整數座標向量,並以廣度優先搜尋進行探索。Klotski 的實作會執行一個獨立的 BFS,而不呼叫實際的移動與碰撞輔助函式。對於每一個被取出佇列的狀態,它會為其他五個方塊各自建立一份獨立的佔用格集合,嘗試每個矩形的上、下、左、右移動,拒絕超出邊界或發生碰撞的佔位範圍,並將先前未見過的座標向量各加入佇列一次。
第一個獲勝狀態——亦即目標方塊左上角位於 (1, 3)——會在深度六時被取出佇列。屆時,BFS 已發現 3,234 個獨立狀態,並展開了 1,470 個佇列項目。由於 BFS 會在深度六的任何狀態之前,先探索完所有深度五的狀態,因此在深度六時取出一個獲勝狀態,即可直接證明沒有任何長度介於零到五的原子化移動路線能抵達該開口。
其中一條最短路徑為:滑塊向下、滑塊向左、門閂向右,接著目標方塊向下移動三次。如果你希望親眼見到獲得 1,000 分的結局,可以直接按照這條路徑操作;這條路徑同時也說明了單格規則為何重要。滑塊先掉到第四列,再移到最左邊的欄位,清出目標方塊的左下通道。門閂則向右移入空出的第四欄,清出右下通道。當兩個中央格都已清空後,2 by 2 的目標方塊便能從 y=0 移到 y=1,再到 y=2,最後到 y=3。最後那一步會填滿既定的出口佔位範圍,並頒發恰好 1,000 分。這六步中沒有任何一步是跨越多格的滑動;每一步都是獨立、可逐一檢視的動作。
觸控操作、鍵盤快捷鍵與 Undo
兩種輸入方式都是完整的,你可以單獨使用滑鼠、觸控螢幕或鍵盤進行遊玩。在棋盤上,點選任何一個矩形即可選取它,並使其外框亮起;接著點選四個大型方向控制鍵之一,即可將選中的方塊移動一格。棋盤旁邊或下方的選取按鈕會鏡像顯示棋盤上的方塊,並可接受鍵盤焦點。
鍵盤操作與觸控完全對應。按下數字鍵 1 到 6,即可按既定順序選取目標、左支柱、右支柱、滑塊、護衛或門閂。方向鍵則嘗試朝對應方向移動一格。按下 U、Delete 或 Backspace 即可復原最近一次被接受的移動。在按住按鍵期間,重複的 keydown 事件會被忽略,因此長按方向鍵並不會讓方塊一口氣衝過數個未經檢視的狀態。
Undo 是以不可變的快照為基礎。每次被接受的移動會在安裝新狀態之前,先附加一份先前位置對映表的深層複製。Undo 會移除最新的快照,並還原其精確座標,使移動次數減一。由於不合法的移動從不會產生歷史紀錄,因此你可以自由嘗試,而不會弄亂時間軸。若你想從頭開始,「重新開始」控制項會將全部六個方塊還原到其既定的起始座標、重新選取目標、清空歷史紀錄、重設移動次數,並將分數歸零——而且不會從你的瀏覽器上傳任何棋盤狀態、移動歷史或互動資料。
若你在多方比較選項,Can a Masyu Loop Cross or Reuse a Cell? The Rule 一文對此有詳細說明。
若你在多方比較選項,Are Diagonal Moves Allowed in the 1 to 9 Number Game? 一文對此有詳細說明。