第二篇 - 嘗試實作Threes!/ 1024 /2048
不得不提,Logdown自動產生英文網址實在太猛了,不用反觀了沒一個能打的=w=
今天花了一點時間嘗試實作最近 SITCON 很紅的遊戲Threes!以及各種衍生 致敬 版本(像1024啦、2048、服貿2048等等)。雖然一如往常的需要時間Debug,好說歹說也做出一個簡單的樣子了。其實只要搞懂規則,剩下來就看個人造化了。以下由規則切入演算法(大概),來吧。
規則
這幾個遊戲雖然看起來差不多,但規則上其實些微不同,以下便討論他們的不同:
合併
最開始讓人注意到的規則就是合併兩個方塊了。在 Threes! 裡面最基本的組合是1 + 2 = 3
而在 1024 , 2048 等是由 2的1次方 開始,慢慢組合到 2的N次方。
在方塊合併時其實是由滑動方向作為合併的判斷。我知道這句話說了跟放屁一樣沒啥用。好,來看例子:
以下例子,三個3在同一列,此時往左推,將會造成:
3 3 3 █ → 6 3 █ █
而非
3 3 3 █ → 3 6 █ █
這說明了在判斷合併時,是由左向右判讀,左邊開始第一個遇到能合併的就先併了:
3+3 █ 3 █
再將最右邊的3抓過來:
6 3 █ █
但如果是四個同樣的數字呢?這邊的處理方式 Threes! 和 2048 就不同了。
Threes! 會左合併一次,變成:
6 3 3 █
再次往左消才會變成
6 6 █ █
而 2048 會接「消到底」:
2 2 2 2 → 4 4 █ █
方塊移動
這和上一個規則類似,在 Threes! 只會一次移動一格, 2048 相當於「推到底」。
隨機填補
其實這個規則還是有些難猜,又還沒翻 2048 的原始碼,暫且不討論吧XD
實作
知道以上的規則大概就寫的出來了。
一直很不熟物件導向的我,嘗試將每個格子設為一個物件,運用類似,Linklist
(感謝學長)的方法將每個格子串在一起,類似以下這種寫法:
class Grid{
Grid* right, left, up, down
}
這樣在寫合併時,只要從四邊出發,就能沿著路徑偵測合併的情況。
→ → → →
→ → → →
→ → → →
→ → → →
另外又設定了一個二維陣列來管理遊戲板(board)
Grid board[4][4]
實作移動、合併等內容。
目前遊戲內容還沒啥營養,純文字介面而已,「有空」套上 SDL,再加強一下,唉。