写一个用Golang运行的小游戏打发时间---贪吃蛇
为了实现可视化,我使用了Go的GUI库fyne
思路:
定义一个结构体Snake表示贪吃蛇,包含贪吃蛇的长度、方向、身体坐标等属性。
定义一个结构体Game表示游戏状态,包含贪吃蛇、食物、得分等属性。
实现游戏画面的显示,使用fyne库中的Canvas组件,绘制贪吃蛇和食物的图形。
实现键盘事件的监听,根据不同的按键来改变贪吃蛇的方向。
实现贪吃蛇的移动逻辑,每个时间间隔更新贪吃蛇的位置,判断是否吃到食物或碰到墙壁或自己的身体,更新得分并重新生成食物。
完成游戏结束的处理,当贪吃蛇碰到墙壁或自己的身体时,游戏结束,显示得分和重新开始按钮。
代码:
package main
import (
"fmt"
"image/color"
"math/rand"
"time"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/canvas"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
const (
cellSize = 20 // 每个格子的大小
gridWidth = 30 // 游戏区域的宽度(格子数)
gridHeight = 20 // 游戏区域的高度(格子数)
)
var (
directions = []fyne.Key{
fyne.KeyUp,
fyne.KeyDown,
fyne.KeyLeft,
fyne.KeyRight,
}
)
// Snake表示贪吃蛇
type Snake struct {
Body []fyne.Position // 身体坐标
Length int // 长度
Direction fyne.Key // 方向
lastMoveAt time.Time // 上次移动时间
}
// NewSnake创建一个新的贪吃蛇
func NewSnake() Snake {
head := fyne.NewPos(cellSize*gridWidth/2, cellSize*gridHeight/2)
return Snake{
Body: []fyne.Position{
head},
Length: 1,
Direction: fyne.KeyRight,
lastMoveAt: time.Now(),
}
}
// Move移动贪吃蛇
func (s *Snake) Move() {
if time.Since(s.lastMoveAt) < 100*time.Millisecond {
return
}
head := s.Body[0]
var newHead fyne.Position
switch s.Direction {
case fyne.KeyUp:
newHead = fyne.NewPos(head.X, head.Y-cellSize)
case fyne.KeyDown:
newHead