@@ -18,11 +18,25 @@ type Game struct {
1818 randomFunc randomGenerator
1919}
2020
21+ type RandomType int
22+
23+ const (
24+ Default RandomType = iota
25+ DirectionUp
26+ DirectionDown
27+ DirectionLeft
28+ DirectionRight
29+ )
30+
2131// Init - 初始化
2232func (g * Game ) Init (data [][]int , randomPosFunc randomPositoner , randomFunc randomGenerator ) {
2333 // setup random functions
24- g .randomPositonerFunc = randomPosFunc
25- g .randomFunc = randomFunc
34+ if randomFunc != nil {
35+ g .randomPositonerFunc = randomPosFunc
36+ }
37+ if randomPosFunc != nil {
38+ g .randomFunc = randomFunc
39+ }
2640 // 建立棋盤
2741 g .board = make ([][]int , sideSize )
2842 for index := range g .board {
@@ -42,17 +56,80 @@ func (g *Game) Init(data [][]int, randomPosFunc randomPositoner, randomFunc rand
4256 }
4357}
4458
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 ++ {
59+ var collectStrategyMap map [RandomType ]func (g * Game ) [][2 ]int = map [RandomType ]func (g * Game ) [][2 ]int {
60+ Default : func (g * Game ) [][2 ]int {
61+ emptyTiles := make ([][2 ]int , 0 , sideSize * sideSize )
62+ for r := 0 ; r < sideSize ; r ++ {
63+ for c := 0 ; c < sideSize ; c ++ {
64+ if g.board [r ][c ] == 0 {
65+ emptyTiles = append (emptyTiles , [2 ]int {r , c })
66+ }
67+ }
68+ }
69+ return emptyTiles
70+ },
71+ DirectionDown : func (g * Game ) [][2 ]int {
72+ emptyTiles := make ([][2 ]int , 0 , sideSize * sideSize )
73+ for r := 0 ; r < sideSize ; r ++ {
74+ for c := 0 ; c < sideSize ; c ++ {
75+ if g.board [r ][c ] == 0 {
76+ if len (emptyTiles ) >= 4 {
77+ break
78+ }
79+ emptyTiles = append (emptyTiles , [2 ]int {r , c })
80+ }
81+ }
82+ }
83+ return emptyTiles
84+ },
85+ DirectionUp : func (g * Game ) [][2 ]int {
86+ emptyTiles := make ([][2 ]int , 0 , sideSize * sideSize )
87+ for r := sideSize - 1 ; r > 0 ; r -- {
88+ for c := 0 ; c < sideSize ; c ++ {
89+ if g.board [r ][c ] == 0 {
90+ if len (emptyTiles ) >= 4 {
91+ break
92+ }
93+ emptyTiles = append (emptyTiles , [2 ]int {r , c })
94+ }
95+ }
96+ }
97+ return emptyTiles
98+ },
99+ DirectionLeft : func (g * Game ) [][2 ]int {
100+ emptyTiles := make ([][2 ]int , 0 , sideSize * sideSize )
101+ for c := sideSize - 1 ; c > 0 ; c -- {
102+ for r := 0 ; r < sideSize ; r ++ {
103+ if g.board [r ][c ] == 0 {
104+ if len (emptyTiles ) >= 4 {
105+ break
106+ }
107+ emptyTiles = append (emptyTiles , [2 ]int {r , c })
108+ }
109+ }
110+ }
111+ return emptyTiles
112+ },
113+ DirectionRight : func (g * Game ) [][2 ]int {
114+ emptyTiles := make ([][2 ]int , 0 , sideSize * sideSize )
50115 for c := 0 ; c < sideSize ; c ++ {
51- if g.board [r ][c ] == 0 {
52- emptyTiles = append (emptyTiles , [2 ]int {r , c })
116+ for r := 0 ; r < sideSize ; r ++ {
117+ if g.board [r ][c ] == 0 {
118+ if len (emptyTiles ) >= 4 {
119+ break
120+ }
121+ emptyTiles = append (emptyTiles , [2 ]int {r , c })
122+ }
53123 }
54124 }
55- }
125+ return emptyTiles
126+ },
127+ }
128+
129+ // AddRandomTile - 新增隨機的 2 或是 4 到一個空的 tile 內
130+ func (g * Game ) AddRandomTile (randomType RandomType ) {
131+ // 蒐集所有空的 tile
132+ emptyTiles := collectStrategyMap [randomType ](g )
56133
57134 // 如果所有格子都滿了
58135 if len (emptyTiles ) == 0 {
@@ -110,8 +187,8 @@ func (g *Game) slideAndMergeLeft(row []int) []int {
110187 return result
111188}
112189
113- // moveLeft - 整個 board 同時左移
114- func (g * Game ) moveLeft () {
190+ // MoveLeft - 整個 board 同時左移
191+ func (g * Game ) MoveLeft () {
115192 for r := 0 ; r < sideSize ; r ++ {
116193 g .board [r ] = g .slideAndMergeLeft (g .board [r ][:])
117194 }
@@ -139,43 +216,47 @@ func (g *Game) reverseRow(row []int) []int {
139216 return reversedRow
140217}
141218
142- // moveRight - 整個 board 同時往右
143- func (g * Game ) moveRight () {
219+ // MoveRight - 整個 board 同時往右
220+ func (g * Game ) MoveRight () {
144221 // 先把整個 board 作 reverse
145222 for i := range g .board {
146223 g .board [i ] = g .reverseRow (g .board [i ])
147224 }
148225 // 把整個 board 往左移動
149- g .moveLeft ()
226+ g .MoveLeft ()
150227 // 再整個 board 作 reverse 回來
151228 for i := range g .board {
152229 g .board [i ] = g .reverseRow (g .board [i ])
153230 }
154231}
155232
156- // moveUp - 整個 board 同時往上
157- func (g * Game ) moveUp () {
233+ // MoveUp - 整個 board 同時往上
234+ func (g * Game ) MoveUp () {
158235 // 先把 board 作轉置
159236 g .board = g .transpose ()
160237 // 再把 board 同時往左
161- g .moveLeft ()
238+ g .MoveLeft ()
162239 // 再把 board 作轉置
163240 g .board = g .transpose ()
164241}
165242
166- // moveDown - 把整個 board 往下移動
167- func (g * Game ) moveDown () {
243+ // MoveDown - 把整個 board 往下移動
244+ func (g * Game ) MoveDown () {
168245 // 先把整個 board 轉置
169246 g .board = g .transpose ()
170247 // 再把整個 board 往右滑
171- g .moveRight ()
248+ g .MoveRight ()
172249 // 再把整個 board 轉置
173250 g .board = g .transpose ()
174251}
175252
176253func NewGame () * Game {
254+ board := make ([][]int , sideSize )
255+ for idx := range board {
256+ board [idx ] = make ([]int , sideSize )
257+ }
177258 return & Game {
178- nil ,
259+ board ,
179260 defaultRandomPositioner ,
180261 defaultRandomFunc ,
181262 }
0 commit comments