@@ -3,15 +3,26 @@ package internal
33// sideSize - 預設 sideSize
44const sideSize = 4
55
6+ // randomPositioner - 根據給訂的 TotalSize 隨機產生一個位置
7+ type randomPositoner func (TotalSize int ) int
8+
9+ // randomGenerator - 隨機給個 0 - 1 之間的機率數
10+ type randomGenerator func () float64
11+
612// Game - 紀錄當下遊戲處理狀態
713//
814// board [][]int - 紀錄盤面狀態
915type Game struct {
10- board [][]int
16+ board [][]int
17+ randomPositonerFunc randomPositoner
18+ randomFunc randomGenerator
1119}
1220
1321// Init - 初始化
14- func (g * Game ) Init (data [][]int ) {
22+ func (g * Game ) Init (data [][]int , randomPosFunc randomPositoner , randomFunc randomGenerator ) {
23+ // setup random functions
24+ g .randomPositonerFunc = randomPosFunc
25+ g .randomFunc = randomFunc
1526 // 建立棋盤
1627 g .board = make ([][]int , sideSize )
1728 for index := range g .board {
@@ -31,6 +42,35 @@ func (g *Game) Init(data [][]int) {
3142 }
3243}
3344
45+ // addRandomTile - 新增隨機的 2 或是 4 到一個空的 tile 內
46+ func (g * Game ) addRandomTile () {
47+ // 蒐集所有空的 tile
48+ emptyTiles := make ([][2 ]int , 0 , sideSize * sideSize )
49+ for r := 0 ; r < sideSize ; r ++ {
50+ for c := 0 ; c < sideSize ; c ++ {
51+ if g.board [r ][c ] == 0 {
52+ emptyTiles = append (emptyTiles , [2 ]int {r , c })
53+ }
54+ }
55+ }
56+ // 如果所有格子都滿了
57+ if len (emptyTiles ) == 0 {
58+ return
59+ }
60+ // 選出要填入的位置
61+ position := emptyTiles [g .randomPositonerFunc (len (emptyTiles ))]
62+ // 90% 機率是 2 , 10% 機率則為 4
63+ value := 2
64+ if g .randomFunc () < 0.1 {
65+ value = 4
66+ }
67+ g .board [position [0 ]][position [1 ]] = value
68+ }
69+
3470func NewGame () * Game {
35- return & Game {}
71+ return & Game {
72+ nil ,
73+ defaultRandomPositioner ,
74+ defaultRandomFunc ,
75+ }
3676}
0 commit comments