解釋 2048 的遊戲目標、滑動與合併規則、終止條件等
2048 是一款單人益智遊戲,玩家透過滑動方格中的數字進行合併,
最終目標是在盤面上生成一個 數字 2048 的方塊。
遊戲盤面為 4x4,每格可以放置一個數字(通常是 2 的冪次)。
遊戲基本迴圈如下:
這是 2048 最重要的邏輯,先用向左滑為例:
操作前 | 壓縮非零數字 | 合併相同數字 | 再壓縮 |
---|---|---|---|
2 0 2 4 | 2 2 4 0 | 4 0 4 0 | 4 4 0 0 |
4 4 4 4 | 4 4 4 4 | 8 0 8 0 | 8 8 0 0 |
遊戲會在以下情況結束:
盤面上出現數字 2048(或玩家自訂目標,例如 4096)。
盤面已無空格,且 四個方向都無法再合併。
以下是一個簡化的滑動過程示意:
[2][0][2][4] ←滑動左
↓
[2][2][4][0] ←壓縮
↓
[4][0][4][0] ←合併
↓
[4][4][0][0] ←再壓縮
雖然今天我們還沒寫程式,但可以先用 Gemini CLI 當學習輔助,
讓它用多種情境幫我們列舉滑動與合併的範例,
方便實作滑動邏輯時直接用來做測試資料。
gemini -p "請幫我產生 2048 遊戲向左滑動的 10 組測試案例,包含壓縮、合併、再壓縮的過程"
這是在 2048 遊戲中向左滑動(moveLeft
)的 10 組測試案例。
每個案例都會展示一個 4x4 的遊戲板,並分解說明「向左滑動」操作的三個核心步驟:
初始狀態 (Before):
[[2, 2, 0, 0],
[4, 4, 2, 0],
[8, 0, 8, 0],
[0, 0, 0, 0]]
過程 (Process):
[2, 2, 0, 0]
-> [2, 2, 0, 0]
(無變化)[4, 4, 2, 0]
-> [4, 4, 2, 0]
(無變化)[8, 0, 8, 0]
-> [8, 8, 0, 0]
[2, 2, 0, 0]
-> [4, 0, 0, 0]
[4, 4, 2, 0]
-> [8, 0, 2, 0]
[8, 8, 0, 0]
-> [16, 0, 0, 0]
[8, 0, 2, 0]
-> [8, 2, 0, 0]
最終狀態 (After):
[[4, 0, 0, 0],
[8, 2, 0, 0],
[16, 0, 0, 0],
[0, 0, 0, 0]]
初始狀態 (Before):
[[2, 4, 8, 16],
[0, 2, 0, 4],
[0, 0, 8, 0],
[16, 0, 0, 0]]
過程 (Process):
[2, 4, 8, 16]
(無變化)[0, 2, 0, 4]
-> [2, 4, 0, 0]
[0, 0, 8, 0]
-> [8, 0, 0, 0]
[16, 0, 0, 0]
(無變化)最終狀態 (After):
[[2, 4, 8, 16],
[2, 4, 0, 0],
[8, 0, 0, 0],
[16, 0, 0, 0]]
初始狀態 (Before):
[[2, 2, 4, 4],
[8, 8, 8, 8],
[0, 0, 0, 0],
[0, 0, 0, 0]]
過程 (Process):
[2, 2, 4, 4]
-> [4, 0, 8, 0]
[8, 8, 8, 8]
-> [16, 0, 16, 0]
[4, 0, 8, 0]
-> [4, 8, 0, 0]
[16, 0, 16, 0]
-> [16, 16, 0, 0]
最終狀態 (After):
[[4, 8, 0, 0],
[16, 16, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]
初始狀態 (Before):
[[2, 2, 2, 0],
[4, 0, 4, 4],
[0, 0, 0, 0],
[0, 0, 0, 0]]
過程 (Process):
[2, 2, 2, 0]
(無變化)[4, 0, 4, 4]
-> [4, 4, 4, 0]
[2, 2, 2, 0]
-> [4, 0, 2, 0]
[4, 4, 4, 0]
-> [8, 0, 4, 0]
[4, 0, 2, 0]
-> [4, 2, 0, 0]
[8, 0, 4, 0]
-> [8, 4, 0, 0]
最終狀態 (After):
[[4, 2, 0, 0],
[8, 4, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]
初始狀態 (Before):
[[2, 2, 4, 8],
[4, 4, 2, 2],
[2, 4, 2, 4],
[4, 2, 4, 2]]
過程 (Process):
[2, 2, 4, 8]
-> [4, 0, 4, 8]
[4, 4, 2, 2]
-> [8, 0, 4, 0]
[2, 4, 2, 4]
(無合併)[4, 2, 4, 2]
(無合併)[4, 0, 4, 8]
-> [4, 4, 8, 0]
[8, 0, 4, 0]
-> [8, 4, 0, 0]
最終狀態 (After):
[[4, 4, 8, 0],
[8, 4, 0, 0],
[2, 4, 2, 4],
[4, 2, 4, 2]]
初始狀態 (Before):
[[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]
過程 (Process):
最終狀態 (After):
[[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]
初始狀態 (Before):
[[2, 0, 2, 0],
[0, 4, 0, 4],
[8, 0, 0, 8],
[0, 16, 16, 0]]
過程 (Process):
[2, 0, 2, 0]
-> [2, 2, 0, 0]
[0, 4, 0, 4]
-> [4, 4, 0, 0]
[8, 0, 0, 8]
-> [8, 8, 0, 0]
[0, 16, 16, 0]
-> [16, 16, 0, 0]
[2, 2, 0, 0]
-> [4, 0, 0, 0]
[4, 4, 0, 0]
-> [8, 0, 0, 0]
[8, 8, 0, 0]
-> [16, 0, 0, 0]
[16, 16, 0, 0]
-> [32, 0, 0, 0]
最終狀態 (After):
[[4, 0, 0, 0],
[8, 0, 0, 0],
[16, 0, 0, 0],
[32, 0, 0, 0]]
初始狀態 (Before):
[[2, 2, 4, 0],
[0, 4, 2, 2],
[0, 0, 0, 0],
[0, 0, 0, 0]]
過程 (Process):
[2, 2, 4, 0]
(無變化)[0, 4, 2, 2]
-> [4, 2, 2, 0]
[2, 2, 4, 0]
-> [4, 0, 4, 0]
(新產生的 4 不會與後面的 4 合併)[4, 2, 2, 0]
-> [4, 4, 0, 0]
[4, 0, 4, 0]
-> [4, 4, 0, 0]
[4, 4, 0, 0]
(無變化)最終狀態 (After):
[[4, 4, 0, 0],
[4, 4, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]
初始狀態 (Before):
[[0, 0, 0, 2],
[0, 0, 4, 4],
[0, 8, 0, 8],
[0, 0, 0, 0]]
過程 (Process):
[0, 0, 0, 2]
-> [2, 0, 0, 0]
[0, 0, 4, 4]
-> [4, 4, 0, 0]
[0, 8, 0, 8]
-> [8, 8, 0, 0]
[2, 0, 0, 0]
(無合併)[4, 4, 0, 0]
-> [8, 0, 0, 0]
[8, 8, 0, 0]
-> [16, 0, 0, 0]
最終狀態 (After):
[[2, 0, 0, 0],
[8, 0, 0, 0],
[16, 0, 0, 0],
[0, 0, 0, 0]]
初始狀態 (Before):
[[2, 0, 2, 4],
[2, 2, 2, 2],
[4, 4, 8, 8],
[16, 0, 16, 16]]
過程 (Process):
[2, 0, 2, 4]
-> [2, 2, 4, 0]
[2, 2, 2, 2]
(無變化)[4, 4, 8, 8]
(無變化)[16, 0, 16, 16]
-> [16, 16, 16, 0]
[2, 2, 4, 0]
-> [4, 0, 4, 0]
[2, 2, 2, 2]
-> [4, 0, 4, 0]
[4, 4, 8, 8]
-> [8, 0, 16, 0]
[16, 16, 16, 0]
-> [32, 0, 16, 0]
[4, 0, 4, 0]
-> [4, 4, 0, 0]
[4, 0, 4, 0]
-> [4, 4, 0, 0]
[8, 0, 16, 0]
-> [8, 16, 0, 0]
[32, 0, 16, 0]
-> [32, 16, 0, 0]
最終狀態 (After):
[[4, 4, 0, 0],
[4, 4, 0, 0],
[8, 16, 0, 0],
[32, 16, 0, 0]]
今天我們深入了解了 2048 的遊戲目標與核心規則,包括:
接下來的 Day 3,我們將實際用 Golang 實作遊戲的核心資料結構
設計一個 4x4 的二維整數陣列來表示遊戲盤面
並在命令列介面中印出盤面內容,方便後續邏輯開發與測試。