网站首页 返回列表 像“草根”一样,紧贴着地面,低调的存在,冬去春来,枯荣无恙。

golang游戏2048

2020-06-10 03:01:17 admin 760

游戏概述

有16个格子,初始时会有两个格子上安放了两个数字2,每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,系统也会在空白的地方随即出现一个数字方块,相同数字的方块在靠拢、相撞时会相加。

主要实现

  • 在空白位置随机生成数字 2 或者 4, 这里生成4的概率控制的小一点。

大致思路:获取所有空白点的位子,生成一个数组,随机生成一个范围内的下标,这样就得到新生成的点,然后将生成的数值赋值给这个点即可。

__

  1. func (g *GameCells) Generate() {
  2. type point struct {
  3. row int
  4. col int
  5. }
  6. var emptyCells []point
  7. for row := 0; row < GSIZE; row++ {
  8. for col := 0; col < GSIZE; col++ {
  9. if g[row][col] == 0 {
  10. emptyCells = append(emptyCells, point{row, col})
  11. }
  12. }
  13. }
  14. r := rand.New(rand.NewSource(time.Now().UnixNano()))
  15. index := r.Intn(len(emptyCells))
  16. val := r.Intn(10)
  17. if val >= 8 {
  18. val = 4
  19. } else {
  20. val = 2
  21. }
  22. g[emptyCells[index].row][emptyCells[index].col] = val
  23. }
  • 游戏中上滑、下滑、左滑、右滑算法

大致思路:以上滑为例,沿途上相邻(中间空也可)的数值相同的点相撞累加起来,所有列累加后统一上移。具体代码如下

__

  1. func (g *GameCells) Up() bool {
  2. var ok bool
  3. for col := 0; col< GSIZE; col++ {
  4. for row := 0; row < GSIZE-1; {
  5. add := false
  6. if g[row][col] != 0 {
  7. for r := row + 1; r < GSIZE; r++ {
  8. if g[r][col] == 0 {
  9. continue
  10. }
  11. if g[row][col] == g[r][col] {
  12. g[row][col] += g[r][col]
  13. g[r][col] = 0
  14. ok = true
  15. row = r + 1
  16. add = true
  17. }
  18. break
  19. }
  20. }
  21. if !add {
  22. row++
  23. }
  24. }
  25. }
  26. for col := 0; col < GSIZE; col++ {
  27. for row := 0; row < GSIZE-1; row++ {
  28. if g[row][col] == 0 {
  29. for r := row + 1; r < GSIZE; r++ {
  30. if g[r][col] == 0 {
  31. continue
  32. }
  33. g[row][col] = g[r][col]
  34. g[r][col] = 0
  35. ok = true
  36. break
  37. }
  38. }
  39. }
  40. }
  41. return ok
  42. }
  • 游戏结束判断
    大致思路:16格中没有空白点,横向、纵向相邻的数值都不相等,则游戏结束。

__

  1. func (g *GameCells) GameOver() bool {
  2. for row := 0; row< GSIZE; row++ {
  3. for col := 0; col < GSIZE-1; col++ {
  4. if g[row][col] == 0 || g[row][col+1] == 0 {
  5. return false
  6. }
  7. if g[row][col] == g[row][col+1] {
  8. return false
  9. }
  10. }
  11. }
  12. for col := 0; col < GSIZE; col++ {
  13. for row := 0; row < GSIZE-1; row++ {
  14. if g[row][col] == g[row+1][col] {
  15. return false
  16. }
  17. }
  18. }
  19. return true
  20. }

源码

https://github.com/qianlnk/2048

随手点赞,功德无量

效果

play.gif

转载文章,原文链接: golang游戏2048

关键字词golang游戏

分享到:

上一篇:AVL二叉树

下一篇:go语言的命令行操作

如需留言,请 登录,没有账号?请 注册

0 条评论 0 人参与

顶部 底部