亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

golang游戲2048

標簽:
Go

游戏概述

有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
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。


點擊查看更多內容
1人點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消