写一段go的贪吃蛇代码
时间: 2023-12-02 14:22:09 浏览: 19
好的,下面是一个简单的贪吃蛇游戏的 Go 代码:
```go
package main
import (
"fmt"
"math/rand"
"time"
)
const (
width = 20 // 游戏区宽度
height = 20 // 游戏区高度
)
type point struct {
x, y int
}
type snake struct {
head point // 蛇头
body []point // 蛇身
dir point // 移动方向
len int // 蛇长
}
type game struct {
snake snake // 贪吃蛇
food point // 食物
score int // 分数
running bool // 游戏运行状态
}
func main() {
rand.Seed(time.Now().UnixNano()) // 初始化随机数种子
g := newGame() // 创建新游戏
g.run() // 运行游戏
}
func newGame() *game {
g := &game{}
// 初始化蛇
g.snake = snake{
head: point{x: width / 2, y: height / 2},
body: []point{
{x: width/2 - 1, y: height / 2},
{x: width/2 - 2, y: height / 2},
},
dir: point{x: 1, y: 0},
len: 3,
}
// 初始化食物
g.food = newFood()
return g
}
func newFood() point {
return point{x: rand.Intn(width), y: rand.Intn(height)}
}
func (g *game) run() {
g.running = true
for g.running {
g.draw() // 绘制游戏界面
g.handleInput() // 处理用户输入
g.update() // 更新游戏状态
time.Sleep(100 * time.Millisecond) // 休眠一段时间
}
fmt.Println("Game Over!")
fmt.Printf("Score: %d\n", g.score)
}
func (g *game) draw() {
// 清屏
fmt.Print("\033[2J")
// 绘制游戏区
for y := 0; y <= height+1; y++ {
for x := 0; x <= width+1; x++ {
if x == 0 || x == width+1 || y == 0 || y == height+1 {
fmt.Print("#")
} else if x == g.food.x && y == g.food.y {
fmt.Print("*")
} else if x == g.snake.head.x && y == g.snake.head.y {
fmt.Print("O")
} else {
hit := false
for _, b := range g.snake.body {
if x == b.x && y == b.y {
fmt.Print("o")
hit = true
break
}
}
if !hit {
fmt.Print(" ")
}
}
}
fmt.Println()
}
}
func (g *game) handleInput() {
// 无需处理用户输入
}
func (g *game) update() {
// 更新蛇头位置
g.snake.head.x += g.snake.dir.x
g.snake.head.y += g.snake.dir.y
// 检查碰撞
if g.snake.head.x < 1 || g.snake.head.x > width || g.snake.head.y < 1 || g.snake.head.y > height {
g.running = false
return
}
for _, b := range g.snake.body {
if g.snake.head.x == b.x && g.snake.head.y == b.y {
g.running = false
return
}
}
// 检查是否吃到食物
if g.snake.head.x == g.food.x && g.snake.head.y == g.food.y {
g.score += 10
g.snake.len++
g.snake.body = append([]point{{x: g.snake.head.x, y: g.snake.head.y}}, g.snake.body...)
g.food = newFood()
}
// 更新蛇身位置
for i := g.snake.len - 2; i >= 0; i-- {
g.snake.body[i+1] = g.snake.body[i]
}
g.snake.body[0] = point{x: g.snake.head.x, y: g.snake.head.y}
}
```
以上代码是一个非常简单的贪吃蛇游戏的实现,仅供参考。