不行,在Battleships Puzzle中,船艦不能彎曲——每一艘連成一體的船,都必須構成一條不中斷的水平或垂直直線,任何一個橫跨超過一列又超過一欄的組成部分,都會在盤面被接受之前,自動被判定為彎曲的船而遭到拒絕。這是最常讓初次接觸的玩家踩到的規則,因為「ship」這個詞,在剪影是隱藏的雙人猜謎遊戲,以及在這款剪影正是你要親手建構出來的單人邏輯解謎遊戲中,用的是同一個字。在這款解謎遊戲裡,「ship」嚴格指的是一段筆直排列的已佔用格子,而驗證器把這個形狀當成一項硬性限制來強制執行,而不是一個可有可無的提示。理解為什麼禁止彎曲,以及驗證器究竟是如何檢測彎曲的,正是完成一次 940 分紀錄、和盤面因艦隊形狀錯誤而卡在矛盾狀態之間的差別。

筆直船艦規則實際上禁止的是什麼
Battleships Puzzle 已揭露的艦隊,是一艘長度為 3 的巡洋艦、一艘長度為 2 的驅逐艦,以及一艘長度為 1 的潛艇,總共佔用五乘五格線上的六個格子。這些船艦中的每一艘,都必須是一段筆直的水平或垂直排列,任何一艘船都不能轉彎、往回勾折,或在格線中蜿蜒前進。內部的實作方式很直接:每次按下 Space 之後,求解器會以廣度優先的方式,把每一個正交相鄰的已佔用格子,分組成一個個相連的組成部分,然後檢查每一個組成部分是否共線。一個只存在於單一列、或只存在於單一欄的組成部分,就是一艘合法的直船。而一個橫跨超過一列又超過一欄的組成部分,依定義就是彎曲的,盤面會因此翻轉成矛盾狀態,無法完成。
這也是為什麼你無法透過在新的方向上再加一段,來「修正」一艘只放了一部分的船——一旦兩段共用同一條邊,卻朝向不同的軸向,這個組成部分就不再是一條直線了。一艘長度為 3 的船,如果先往右走兩格,再往下走一格,就不再是單一一艘船,因為整個形狀橫跨了兩列與兩欄。一艘長度為 2 的船如果以對角線方式放置,並不算是同一艘船的兩段;它會被視為兩個各自獨立的單一格子,這同樣會被拒絕,因為排序後的艦隊必須恰好等於 [1, 2, 3]。驗證器對長度的檢查同樣嚴格:任何比宣告艦隊中最大船艦還要長的組成部分都會被拒絕,所以無論方向為何,一段長度為四的排列同樣無法通過。
同一套共線性檢查,也是為什麼一對呈 L 形的區段組合,本身就會構成矛盾。兩段以直角相接的區段,會被視為單一一個彎曲的組成部分,光是這一點就足以讓盤面被判定拒絕,因為驗證器會把正交相鄰的格子分組成單一個組成部分。無論是哪一種情況,在每一個已佔用的格子都收攏回單一、筆直、沿著座標軸排列的一段之前,都不可能完成這個盤面。
五乘五的格線、提示數字,以及已揭露的解答
這個盤面是一個固定的五乘五格線,不是隨機產生的謎題。由上到下的列提示數字依序是 3、0、1、1、1。由左到右的欄提示數字依序是 1、2、1、0、2。每一列與每一欄,都必須恰好包含印出來的那個數量的船艦區段,其餘則是水域。已揭露的解答佔用的是以零為起始編號的第 0、1、2、14、19 與 21 格。前三格構成長度為 3 的巡洋艦,橫跨最上面那一列,從第 0 欄延伸到第 2 欄。第 14 格與第 19 格構成長度為 2 的驅逐艦,在最後一欄中垂直排列,從第 2 列一路延伸到第 3 列。第 21 格則是那艘孤立的潛艇,獨自位於(第 4 列、第 1 欄)。
這樣的配置是筆直、彼此獨立且自我一致的。驅逐艦與潛艇位於同一欄,但彼此並不相鄰,所以它們不會被合併成一艘彎曲的船。最上面那一列的巡洋艦,無論是正交還是對角,都不會碰到驅逐艦或潛艇。列提示與欄提示的數字都恰好吻合:最上面那一列包含 3 個船艦區段,第二列包含 0 個,以此類推。這正是能同時滿足所有限制條件的那個已揭露配置,一旦你看懂了它,筆直船艦這條規則,就不再像是一道牆,反而會開始像這整個謎題的骨幹。
| 限制條件 | 規則 | 它禁止的是什麼 |
|---|---|---|
| 船艦形狀 | 每個組成部分都必須是單一一條水平或垂直直線 | 任何橫跨超過一列又超過一欄的組成部分 |
| 船艦長度 | 排序後的長度必須等於 [1, 2, 3] | 超過 3 的組成部分,或缺少宣告尺寸中的其中一個 |
| 船艦間距 | 不同的船艦之間不得有邊或角的接觸 | 任何船艦區段,若其對角相鄰格屬於另一個組成部分 |
| 列提示 | 各列的計數必須符合 3、0、1、1、1 | 任何超過印出總數的列 |
| 欄提示 | 各欄的計數必須符合 1、2、1、0、2 | 任何超過印出總數的欄 |
| 總格數 | 恰好六個已佔用的格子 | 盤面上任何第七個船艦區段 |
如何在不彎曲的情況下擺放艦隊
- 用方向鍵在格線上移動目前選取的格子,在你想要放置船艦區段的每個格子上按下 Space。在一個空白的格子上按下 Enter,可以放置一個選擇性的水域標記,方便你自己推理——水域標記不會計入艦隊,也永遠不會影響分數。滑鼠與觸控使用者,可以點擊來切換船艦區段,並使用右鍵選單手勢,在同一個格線上標記水域。
- 先從橫跨最上面那一列、長度為 3 的巡洋艦開始,佔用第 0、1、2 欄。在(第 0 列、第 0 欄)按下 Space,接著在(第 0 列、第 1 欄),再來是(第 0 列、第 2 欄)。這三個區段彼此共用邊,且都位於單一一列,所以它們構成單一一個筆直、合法的組成部分,一旦第三次按下 Space,就會通過形狀檢查。
- 接著把長度為 2 的驅逐艦垂直放置在最後一欄。往下移動到(第 2 列、第 4 欄)並按下 Space,再往下移動到(第 3 列、第 4 欄)並再次按下 Space。這兩個區段位於單一一欄,構成第二個筆直的組成部分,和巡洋艦是彼此獨立的,因為它們之間的整個第 1 列都保持空白。
- 把長度為 1 的潛艇放在(第 4 列、第 1 欄)。按一次 Space。這個孤立的格子本身就是一個長度為 1 的組成部分,也是這個艦隊中唯一的一艘單格船艦。
- 用視覺方式確認「不接觸」規則。位於 (2, 4) 與 (3, 4) 的驅逐艦,不得與位於 (0, 0) 到 (0, 2) 的巡洋艦,或位於 (4, 1) 的潛艇共用邊或角。格子 (1, 3) 正好斜對角位於巡洋艦與驅逐艦之間,而 (3, 0)、(3, 1)、(3, 2)、(4, 0) 與 (4, 2) 則在潛艇周圍保持空白,所以每一側的對角間隙都成立。
- 確認由上到下的列提示讀作 3、0、1、1、1,由左到右的欄提示讀作 1、2、1、0、2。艦隊擺放完成後,最上面那一列有 3 個,第二列有 0 個,第三列有 1 個,第四列有 1 個,最下面那一列有 1 個,而各欄的計數依序則是 1、2、1、0、2。
為什麼對角接觸會和彎曲一起被拒絕
筆直船艦規則與不接觸規則是一起運作的,因為兩者都是在同一張組成部分關係圖上檢查的。驗證器會掃描每一個船艦區段的對角相鄰格,如果某個對角相鄰格屬於另一個組成部分,這兩艘船就是以一個角相接觸,盤面就會被拒絕。這也是為什麼每一艘船周圍的格子都是水域,而不只是正交方向上的相鄰格。已揭露的解答正是利用了這一點:巡洋艦位於最上面一列、橫跨第 0 到第 2 欄,驅逐艦垂直貫穿第 4 欄的第 2、3 列,潛艇則獨自位於第 4 列的第 1 欄,所以每一艘船周圍八個方向的格子都保持空白。
每一次船艦操作之後,驗證都會重新計算相連的組成部分,所以一旦你放置的區段讓某個組成部分彎曲、或讓兩個組成部分產生對角接觸,矛盾狀態會立刻顯現出來。同一套檢查也會抓出刻意造成的對角碰撞,所以一對呈 L 形的區段組合,依放置方式的不同,會被判定為既是一個彎曲的組成部分,也是子組成部分之間的一次對角接觸。盤面也會明確拒絕超出範圍的邏輯輸入,所以一個無效的格子索引,永遠不會悄悄地把這次進行中的紀錄弄壞。每一列或每一欄的總計都不得超過其印出的提示數字,盤面也不能包含超過六個船艦格子,只要出現以上任何一種失敗情況,盤面就會進入矛盾狀態,而不會悄悄接受一個不完整的擺放。
盤面進入矛盾狀態時會發生什麼變化
矛盾狀態代表目前的艦隊擺放,違反了以上規則中的至少一項:一個彎曲的組成部分、一次對角接觸、一列或一欄的總計超過其提示數字、超過六個船艦格子,或是排序後的艦隊不再等於 [1, 2, 3]。盤面仍然可以互動,所以你可以再按一次 Space,撤銷造成問題的那個區段,再嘗試別的位置。相對地,水域標記只是個人推理用的輔助工具,不會影響艦隊驗證器或分數,所以一個放錯位置的 Enter 標記,本身永遠不會讓盤面進入矛盾狀態。這個盤面使用的是回應式 CSS 格線中的語意化按鈕,而不是 canvas,每一個格子都會宣告自己的列、欄、船艦、水域與鍵盤選取狀態,以利無障礙使用。
要完成這個盤面,必須同時滿足完整的艦隊條件:全部五個列提示、全部五個欄提示、精確排序後的艦隊、六個船艦格子、十九個水域格子、沒有彎曲,也沒有對角接觸。只符合已佔用格子的總數是不夠的,因為一個錯誤的艦隊形狀,仍然有可能剛好填滿六個格子,卻仍然無法通過至少一個組成部分的共線性檢查。最快的路徑就是上面已揭露的解答,這也是自動化測試所斷言、以最終停在 940 分的那套標準六段鍵盤模擬操作。這裡沒有計時器、隨機服務、下載的圖片、帳號、音效,或任何硬體相依性,所以唯一的變數,就是你把艦隊擺放得有多乾淨俐落。
連按兩次 Escape,可以叫出共用的模擬試算表老闆掩護畫面,再重複同樣的手勢即可回到底下未曾改變的艦隊。這些表面、邊框、焦點樣式、警示訊息,或船艦顏色,沒有一項依賴頁面本身以外的任何東西,所以單一次鍵盤操作,就足以把一次擺放從 1,000 分的起始分數,帶到乾淨俐落的 940 分完成紀錄。
其他具有類似筆直形狀規則的相關邏輯解謎遊戲
Lizely 上其他固定式邏輯解謎遊戲,使用的是類似的「不彎曲、不接觸」規則。Stitches要求每一對相鄰區域恰好連接一次,同時符合列與欄的端點提示;Thermometers則要在八支溫度計上,設定從球部開始的連續液面高度;Tents要把樹木和帳篷配對,同時讓所有帳篷彼此分開,包括對角方向;而Heyawake則要在每一個房間裡剛好塗滿一格,同時維持白色區域彼此相連。一旦你對 Battleships Puzzle 中的筆直船艦規則感到熟悉,以上每一款都是很好的下一步,因為它們獎勵的都是同一種習慣:把形狀當成一項硬性限制,而不是一個可有可無的指引。
想更深入了解,可參閱Block Stacking Puzzle for Beginners: Read the Target First。
想更深入了解,可參閱Can I Play Painted Cube Puzzle with a Keyboard or Phone?。