@@ -3,15 +3,26 @@ package internal
3
3
// sideSize - 預設 sideSize
4
4
const sideSize = 4
5
5
6
+ // randomPositioner - 根據給訂的 TotalSize 隨機產生一個位置
7
+ type randomPositoner func (TotalSize int ) int
8
+
9
+ // randomGenerator - 隨機給個 0 - 1 之間的機率數
10
+ type randomGenerator func () float64
11
+
6
12
// Game - 紀錄當下遊戲處理狀態
7
13
//
8
14
// board [][]int - 紀錄盤面狀態
9
15
type Game struct {
10
- board [][]int
16
+ board [][]int
17
+ randomPositonerFunc randomPositoner
18
+ randomFunc randomGenerator
11
19
}
12
20
13
21
// 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
15
26
// 建立棋盤
16
27
g .board = make ([][]int , sideSize )
17
28
for index := range g .board {
@@ -31,6 +42,35 @@ func (g *Game) Init(data [][]int) {
31
42
}
32
43
}
33
44
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
+
34
70
func NewGame () * Game {
35
- return & Game {}
71
+ return & Game {
72
+ nil ,
73
+ defaultRandomPositioner ,
74
+ defaultRandomFunc ,
75
+ }
36
76
}
0 commit comments