2048

2048 game implementing in golang

thoughts

  1. 4x4 的二維陣列
  2. render 在 terminal 上, . 代表空格
  3. 初始隨機在盤面上產生兩個數字
  4. 移動 a. 壓縮: 將同一列或同一行上的數字往移動的方向靠攏(依序填滿該方向的空格) b. 合併: 如果相鄰的數字是同數字,會合併成該數字的 2 倍 c. 一次移動,同一行、同一列上的方塊至多合併一次 d. 合併的順序: 最靠近移動方向終點的優先合併 e. 一次移動最多會產生: 1、壓縮 2、合併 3、壓縮 三個動作
  5. 每次移動完,隨機在剩餘的空格上產生數字 (2 or 4)
  6. 終止條件:當沒有任何空格,且相鄰的方塊數值都不相同時,遊戲終止

methods

Init

random generate 兩個數字到空格上 選位置:透過 rand 套件,隨機從 0-15 選一個數字 選數字:透過 rand 套件,隨機從 1-10 選一個數字,如果 < 10,則數字為2, 如果 = 10 則數字為4 (2跟4出現的機率 9:1) 如果該位置是空格,就填入數字;如果該位置不是空格,就再找下一個空格 執行2次

move(direction: left | right | top | bottom)

執行3個動作: 壓縮 合併 壓縮

compress

從終點往起點,將整行或整列上的數字填滿到空格。 設定 i,j 兩個指標 從 0, 1 開始 持續移動 j,如果遇到第一個非空格的數字,替換 j, i 的資料; 然後移動 i+1。 持續移動直到 j 超過最大長度。

merge

從終點往起點,如果相鄰(當前數字的下一格)方塊的數字相等,則合併數字(將當前數字*2),並且下一格數字留空。 if i == i+1 { nums[i] *= 2 nums[i+1] = 0 }

ex: 0 0 0 2 i j 2 0 0 0 i j ex: 0 0 2 2 i j 2 0 0 2 i j 4 0 0 0

ex: 2 0 2 4 2 2 4 0 壓縮 4 0 4 0 合併 4 4 0 0 壓縮 ex: 2 2 2 2 2 2 2 2 壓縮 4 0 4 0 合併 4 4 0 0 壓縮 ex: 2 0 0 2 2 2 0 0 壓縮 4 0 0 0 合併 4 0 0 0 壓縮 ex: 2 2 0 4 2 2 4 0 4 0 4 0 4 4 0 0