用go语言写的一个贪吃蛇小游戏

go-snake

游戏由来

因想给儿子写一款小游戏,就想到了用 go 写一个贪吃蛇的游戏。游戏引擎使用的是 ebiten, 它是一款 2d 的游戏引擎。
现在这个游戏只完成一些基础部分的编写,整体是能运行起来,对于一些更具体的游戏玩法和人机互动功能还未完善,后面时间多的情况下,我会逐步去完善它,添加更多的游戏交互效果。
这个游戏也让想学习 ebiten 引擎的同学提供了一些参考。

项目地址

https://github.com/AaronChengHao/gosnake

这是游戏中的截图

imageimage

这是游戏的 gif

imageimage

通过 unsafe.Pointer 验证切片是引用类型

看过很多文章,都说切片(slice)是引用类型, 但是实际操作中很难通过结果来证明是引用类型,特别是使用 append 函数时,打印切片结果还是没有变化。 现在我们来使用 unsafe.Pointer 来修改切换的 len 属性来证明切片是引用类型。 废话不多说,上代码...

package main

import (
    "fmt"
    "reflect"
    "unsafe"
)

func main() {
    s := make([]int, 0, 5)
    // 初始化切片数据
    s = append(s, 1, 2, 3)

    // 调用appendSlice方法,给切片添加数据
    appendSlice(s)

    // 打印切片
    fmt.Println(s) // 输出:1 2 3 (说明增加的 100 没有在这儿体现出来)

    // 现在我们来使用黑科技,来证明切片是引用类型
    sh := (*reflect.SliceHeader)(unsafe.Pointer(&s))
    sh.Len = 4

    // 现在重新打印
    fmt.Println(s) // 输出: 1 2 3 100 (现在看到100, 是不是就是说明 appendSlice 方法的修改,已经影响到了外面的slice了,也就证实了slice是引用类型哦)
}

func appendSlice(s []int) {
    s = append(s, 100)
}

补充说明
注意,追加的切片数据不能超过容量哦,不然会引起切片底层数组指针指向新的数组地址,那就不能看出效果了。

go big包Int类型的使用

有一次意外接触了big包的Int类型,在这里简单记录下它的使用.

加法

func main() {
    b1 := big.NewInt(33)
    b2 := big.NewInt(55)
    b1.Add(b1, b2)
    fmt.Println(b1.String())
}
// output 88

减法

func main() {
    b1 := big.NewInt(33)
    b2 := big.NewInt(55)
    b1.Sub(b1, b2)
    fmt.Println(b1.String())
}
// output -22

乘法

func main() {
    b1 := big.NewInt(33)
    b2 := big.NewInt(55)
    b1.Mul(b1, b2)
    fmt.Println(b1.String())
}
// output 1815

除法

func main() {
    b1 := big.NewInt(110)
    b2 := big.NewInt(55)
    b1.Div(b1, b2)
    fmt.Println(b1.String())
}
// output 2