Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
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)
- Host: GitHub
- URL: https://github.com/yukaii/my2048
- Owner: Yukaii
- Created: 2014-03-29T13:33:20.000Z (over 10 years ago)
- Default Branch: master
- Last Pushed: 2014-03-29T13:40:11.000Z (over 10 years ago)
- Last Synced: 2023-08-21T22:21:25.910Z (about 1 year ago)
- Language: C++
- Size: 145 KB
- Stars: 1
- Watchers: 4
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
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/