不得不提,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,再加強一下,唉。

螢幕擷圖存為 2014-03-29 21:20:44.png

Github