游戏概述
有16个格子,初始时会有两个格子上安放了两个数字2,每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,系统也会在空白的地方随即出现一个数字方块,相同数字的方块在靠拢、相撞时会相加。
主要实现
在空白位置随机生成数字 2 或者 4, 这里生成4的概率控制的小一点。
大致思路:获取所有空白点的位子,生成一个数组,随机生成一个范围内的下标,这样就得到新生成的点,然后将生成的数值赋值给这个点即可。
func (g *GameCells) Generate() { type point struct { row int col int } var emptyCells []point for row := 0; row < GSIZE; row++ { for col := 0; col < GSIZE; col++ { if g[row][col] == 0 { emptyCells = append(emptyCells, point{row, col}) } } } r := rand.New(rand.NewSource(time.Now().UnixNano())) index := r.Intn(len(emptyCells)) val := r.Intn(10) if val >= 8 { val = 4 } else { val = 2 } g[emptyCells[index].row][emptyCells[index].col] = val }
游戏中上滑、下滑、左滑、右滑算法
大致思路:以上滑为例,沿途上相邻(中间空也可)的数值相同的点相撞累加起来,所有列累加后统一上移。具体代码如下
func (g *GameCells) Up() bool { var ok bool for col := 0; col < GSIZE; col++ { for row := 0; row < GSIZE-1; { add := false if g[row][col] != 0 { for r := row + 1; r < GSIZE; r++ { if g[r][col] == 0 { continue } if g[row][col] == g[r][col] { g[row][col] += g[r][col] g[r][col] = 0 ok = true row = r + 1 add = true } break } } if !add { row++ } } } for col := 0; col < GSIZE; col++ { for row := 0; row < GSIZE-1; row++ { if g[row][col] == 0 { for r := row + 1; r < GSIZE; r++ { if g[r][col] == 0 { continue } g[row][col] = g[r][col] g[r][col] = 0 ok = true break } } } } return ok }
游戏结束判断
大致思路:16格中没有空白点,横向、纵向相邻的数值都不相等,则游戏结束。
func (g *GameCells) GameOver() bool { for row := 0; row < GSIZE; row++ { for col := 0; col < GSIZE-1; col++ { if g[row][col] == 0 || g[row][col+1] == 0 { return false } if g[row][col] == g[row][col+1] { return false } } } for col := 0; col < GSIZE; col++ { for row := 0; row < GSIZE-1; row++ { if g[row][col] == g[row+1][col] { return false } } } return true}
源码
https://github.com/qianlnk/2048
随手点赞,功德无量
效果
play.gif
作者:qianlnk
链接:https://www.jianshu.com/p/c25dce8d032b
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。