Sokoban(倉庫番)禁止拉箱與連續推兩個箱子——單次操作只能將恰好一個箱子推入空地板格或標記的目標點。工人可自由走過任何開放的地板格,但一旦目的地被箱子佔據,相同的輸入便會嘗試將那一個箱子再多推一格。若箱子後方是牆壁或另一個箱子,則什麼都不會移動,步數計數器也不會改變。正是這條單一規則,讓倉庫規劃感覺像是在做計畫,而非普通的尋路;它適用於這個瀏覽器版 Sokoban中的每一個合法動作,而非僅限於較困難的關卡。僅能推、一次一箱的約束,正是粗心的一推會切斷箱子某一側的進出路、並將它困在角落的原因,也正是謹慎規劃的路線得以僅憑四個方向鍵與一個 Undo(復原)鍵就解開三個固定版面 的原因。在你決定推箱子之前,唯一重要的事,就是工人是否仍能站在下一次推箱子所需的那一側——而本文其餘部分將說明遊戲接受哪些動作、會悄悄拒絕哪些動作,以及還原控制如何避免一次不可逆的推箱毀掉整個局面。

「僅能推」規則實際上禁止了什麼
這個瀏覽器版本中經過驗證的 Sokoban 規則,允許每次動作只產生一種移動箱子的結果。箱子只有在它正好位於工人行進方向的正後方時才能被移動。沒有「拉」按鈕、沒有拖曳手勢,也沒有對角線輸入,所以反轉方向永遠不會像拉車那樣抓住箱子。箱子後方的目的地格必須在邊界內、不可以是牆,也不可以已被另一個箱子佔據。
| 工人嘗試的動作 | 規則是否允許? | 實際發生情況 |
|---|---|---|
| 踏入空地板 | 是 | 工人移動一格;步數計數器遞增。 |
| 將一個箱子推入空地板 | 是 | 工人與箱子同時前進一格;步數計數器遞增。 |
| 將一個箱子推上標記的目標點 | 是 | 箱子停在目標點上;該目標點視為已清除,而非障礙物。 |
| 從反方向拉箱子 | 否 | 輸入被視為朝按下的方向走一步;箱子留在原處。 |
| 推兩個排成一列的箱子 | 否 | 若第二個箱子擋住目的地,整個推箱動作會被拒絕,什麼都不會移動。 |
| 將箱子推過牆壁 | 否 | 牆壁擋住推箱;工人與箱子保持在原位。 |
| 將箱子推入非目標點的角落 | 允許但會受罰 | 動作執行後,角落死鎖警告會暫停後續的方向輸入。 |
由此可得兩個實用的推論。第一,工人永遠必須先站在箱子旁邊才能移動箱子,這表示路線必須在推箱之前先清空箱子被推的那一側。第二,失敗的推箱並不會浪費一個回合:當箱子後方是牆壁或另一個箱子時,什麼都不會移動,步數計數器也不會改變。
為什麼「拉」與「連推兩個」會破壞這個謎題
若允許拉箱子,每個箱子都會變成可移動的小車,多數倉庫謎題將因此塌縮成平凡的尋路問題,因為工人只要反轉每一次推箱即可。僅能推的約束,創造了使 Sokoban 感覺像在做計畫而非單純走路的不可逆承諾。連推兩個箱子也有類似效果:若一個動作能同時推動兩個箱子,你就能一步清掉整排,關卡設計也將不再只能靠謹慎的擺位來求解。
由於工人比 2x1 堆疊箱子的佔位小,規則還必須強制檢查工人前方的箱子是否有地方可去。這道「單行、檢查前方一格」的判定,正是實作在每個合法動作上所執行的內容,因此它會在任何格子移動之前,就攔截所有被禁止的結果——牆、箱子或超出邊界。這也說明了為什麼同一個輸入在空地上能推動箱子,但對著牆壁時卻會被悄悄拒絕:規則是「將箱子前進一格進入合法的目的地」,而牆永遠不是箱子的合法目的地。
瀏覽器版 Sokoban 中那三個具確定性的版面,正是圍繞著這條規則所設計。Straight Start 是單次直接推箱、沒有任何干擾;Upper Turn 要求工人先將箱子往頂部牆壁方向抬起,再繞到箱子另一側進行第二次推箱;Wall Detour 則在工人與第一個可用的推箱位置之間有一道內部牆壁,所以唯一合法的開場動作是繞過那道障礙物。若工人能拉箱子,這些版面都不可能存在。
如何移動工人並推箱子
三個固定版面的玩法都相同:走到箱子旁邊,然後一次一格地將它推向標記的目標點。以下步驟說明一次典型推箱的精確輸入順序,包含此版本所接受的控制方式。
- 使用方向鍵、WASD,或螢幕上四個方向按鈕,讓工人一次朝一個正交方向移動一格,踏入相鄰的地板格。
- 調整工人位置,使箱子正好位於你預定推的方向上一格的位置。
- 再次按下同一個方向;工人踏入箱子所在格,箱子則前進一格進入空地板或目標點。
- 確認步數計數器已遞增,且工人現已站在箱子的另一側,準備進行下一次推箱。
- 若箱子後方是牆壁、另一個箱子,或在格子範圍之外,再次按下相同輸入——什麼都不會移動,計數器也維持不變。
- 持續進行直到箱子停在那個版面中央、用點標示出的未覆蓋目標點上。
在窄螢幕手機上,四個方向按鈕始終可用,所以即使沒有滑動手勢也能執行相同的動作。在鍵盤上,方向鍵與 WASD 可交替使用,每一個合法步驟無論按下哪個鍵,都會產生相同的盤面狀態。螢幕上的標記也支援無障礙標籤,能獨立於可見的字母與圖示,分別讀出牆、地板、目標、箱子與玩家。
如何從角落死鎖中恢復
進入非目標點角落的箱子會被標記為死鎖,且實作會暫停方向移動,使後續推箱無法讓情況惡化。死鎖檢查會查看箱子四個正交方向的鄰格:若某個垂直鄰格與某個水平鄰格在角落配置下是牆壁或其他箱子,且該箱子目前並未停在目標點上,則此位置即為死鎖。已停在實際目標點上的箱子會被排除在此檢查之外,因為那樣的擺放是獲勝條件,而非陷阱。
兩條還原路徑隨時可用。按下 U 鍵或選擇 Undo 控制項,可還原到造成死鎖的那次推箱之前,所記錄的工人位置、箱子位置與步數的完整快照。Undo 儲存的是實際快照,而非反向推導路徑,所以還原一次推箱絕不會表現得像被禁止的拉箱——它只是把盤面捲回你一個動作之前的可玩狀態。按下 R 鍵或使用共用的 Restart 控制項,會回到此次遊戲的第一個版面;Restart 隨時可用,即使 Undo 也能用時也不例外,而當造成陷阱的推箱發生在好幾步之前、較早的快照已不再有用時,Restart 就是正確的選擇。
由於角落警告會暫停輸入但不會清空盤面,造成陷阱的那次推箱仍清楚可見,你能明確看到是哪一格出了問題。這種可見性正是還原有意義的原因:你並不是在猜測遊戲「認為」發生了什麼,而是在確認是哪一次推箱把箱子困住了。
分數、關卡與固定的三版面遊戲流程
這個 Sokoban 提供三個具確定性的版面,每次都會重設為同一個起始盤面,因此規則易學,結果也易於重現。每個版面都恰好有一個箱子與一個目標點,讓重點集中在推箱規則上,而非視覺雜訊。
| 關卡 | 版面構想 | 獲得分數 |
|---|---|---|
| Straight Start | 無障礙地直接推上目標點 | 300 |
| Upper Turn | 將箱子朝頂部牆壁抬起,再繞一圈進行第二次推箱 | 300 |
| Wall Detour | 工人與第一個推箱位置之間有一道內部牆壁;路線從繞過它開始 | 400 |
| 完成遊戲總分 | 三個箱子全部位於目標點上 | 正好 1,000 |
分數由關卡固定,不受速度、裝置效能、輸入方式或動畫時機影響。已通過的中間關卡會凍結,直到你按下 Next level;完成的第三關則會永久凍結,直到按下 Restart,因此同一盤面重複輸入無法重複計分。共用的遊戲外殼會在瀏覽器儲存可用時,於本機儲存最佳分數,使同一裝置跨工作階段都能維持 1,000 分的成績穩定不變。
本 Sokoban 與其他瀏覽器格子謎題的比較
本站多數格子類謎題遊戲接受比 Sokoban 更廣的動作集合。在 2048 中,滑動合併兩個相同的方塊,絕不會把方塊推入牆中。在 15 Puzzle 中,點擊一個方塊會在空格相鄰時,整行或整列地滑動。Sokoban 的決定性特徵是:由箱子本身來決定動作是否合法——若箱子前方被擋住,工人也會被擋住,即使工人本身的目的地是空的。這種不對稱性——工人的路徑可逆,但箱子的路徑不可逆——正是驅動三個具確定性版面中規劃張力的來源。
對想確認這三個版面是原創設計、而非取自歷史關卡集的讀者,相關指南 Are These Official or Classic Sokoban Levels? 會說明同樣的來源揭露。
若你正在比較選項,Can You Play Sokoban Without Downloading? Yes 對此有詳細介紹。