Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/yukaii/my2048

My implementation of Threes!/2048 (Skeleton)
https://github.com/yukaii/my2048

Last synced: 13 days ago
JSON representation

My implementation of Threes!/2048 (Skeleton)

Awesome Lists containing this project

README

        

不得不提,Logdown自動產生英文網址實在太猛了,不用反觀了沒一個能打的=w=

今天花了一點時間嘗試實作最近 ~~SITCON~~ 很紅的遊戲[Threes!][1]以及各種衍生 ~~致敬~~ 版本(像[1024][2]啦、[2048][3]、[服貿2048](http://a0tim.github.io/)等等)。雖然一如往常的需要時間Debug,好說歹說也做出一個簡單的樣子了。其實只要搞懂規則,剩下來就看個人造化了。以下由規則切入演算法(大概),來吧。

##規則
這幾個遊戲雖然看起來差不多,但規則上其實些微不同,以下便討論他們的不同:
###合併
最開始讓人注意到的規則就是合併兩個方塊了。在 [_Threes!_][1] 裡面最基本的組合是`1 + 2 = 3`而在 [_1024_][2] , [_2048_][3] 等是由 2的1次方 開始,慢慢組合到 2的N次方。

在方塊合併時其實是由滑動方向作為合併的判斷。我知道這句話說了跟放屁一樣沒啥用。好,來看例子:

以下例子,三個3在同一列,此時往左推,將會造成:

3 3 3 █ → 6 3 █ █

而非

3 3 3 █ → 3 6 █ █

這說明了在判斷合併時,是由左向右判讀,左邊開始第一個遇到能合併的就先併了:

3+3 █ 3 █

再將最右邊的3抓過來:

6 3 █ █

但如果是四個同樣的數字呢?這邊的處理方式 [_Threes!_][1] 和 [_2048_][3] 就不同了。

[_Threes!_][1] 會左合併一次,變成:

6 3 3 █

再次往左消才會變成

6 6 █ █

而 [_2048_][3] 會接「消到底」:

2 2 2 2 → 4 4 █ █

###方塊移動

這和上一個規則類似,在 [_Threes!_][1] 只會一次移動一格, [_2048_][3] 相當於「推到底」。

###隨機填補

其實這個規則還是有些難猜,又還沒翻 [_2048_][3] 的原始碼,暫且不討論吧XD

##實作
知道以上的規則大概就寫的出來了。

一直很不熟物件導向的我,嘗試將每個格子設為一個物件,運用類似,`Linklist`(感謝學長)的方法將每個格子串在一起,類似以下這種寫法:

class Grid{
Grid* right, left, up, down
}

這樣在寫合併時,只要從四邊出發,就能沿著路徑偵測合併的情況。

→ → → →
→ → → →
→ → → →
→ → → →

另外又設定了一個二維陣列來管理遊戲板(board)

Grid board[4][4]

實作移動、合併等內容。

目前遊戲內容還沒啥營養,純文字介面而已,「有空」套上 [SDL](http://www.libsdl.org/),再加強一下,唉。

[1]:https://itunes.apple.com/us/app/threes!/id779157948?mt=8&ign-mpt=uo%3D2
[2]:https://itunes.apple.com/us/app/1024!/id823499224
[3]:http://gabrielecirulli.github.io/2048/