ZBLOG

用golang写一个贪吃蛇小游戏

当然,下面是一个简单的贪吃蛇小游戏的示例代码(使用Go语言编写):

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/nsf/termbox-go"
  5. "math/rand"
  6. "os"
  7. "time"
  8. )
  9. const (
  10. width = 20
  11. height = 15
  12. )
  13. type point struct {
  14. x, y int
  15. }
  16. type snake struct {
  17. body []point
  18. direction point
  19. grow bool
  20. gameOver bool
  21. score int
  22. speedLevel time.Duration // 控制速度的级别,数值越小速度越快
  23. }
  24. var (
  25. snakeGame snake // 游戏实例
  26. fruit point // 水果位置
  27. inputKeyChan chan termbox.KeyEvent // 输入通道用于接收键盘事件输入
  28. )
  29. func main() {
  30. err := termbox.Init()
  31. if err != nil {
  32. fmt.Println("无法初始化 termbox:", err)
  33. return
  34. }
  35. defer termbox.Close()
  36. eventQueue := make(chan termbox.Event)
  37. go func() {
  38. for {
  39. eventQueue <- termbox.PollEvent()
  40. }
  41. }()
  42. initGame()
  43. render()
  44. loop:
  45. for {
  46. select {
  47. case ev := <-eventQueue:
  48. switch ev.Type {
  49. case termbox.EventKey:
  50. switch ev.Key {
  51. case termbox.KeyArrowUp:
  52. snakeGame.direction = point{0, -1}
  53. case termbox.KeyArrowDown:
  54. snakeGame.direction = point{0, 1}
  55. case termbox.KeyArrowLeft:
  56. snakeGame.direction = point{-1, 0}
  57. case termbox.KeyArrowRight:
  58. snakeGame.direction = point{1, 0}
  59. case termbox.KeyEsc:
  60. break loop
  61. }
  62. case termbox.EventError:
  63. panic(ev.Err)
  64. }
  65. default:
  66. move()
  67. render()
  68. time.Sleep(snakeGame.speedLevel * time.Millisecond)
  69. }
  70. }
  71. fmt.Println("游戏结束!得分:", snakeGame.score)
  72. }
  73. // 初始化游戏
  74. func initGame() {
  75. rand.Seed(time.Now().UnixNano())
  76. snakeGame = snake{
  77. body: []point{{5, 5}},
  78. direction: point{1, 0},
  79. grow: false,
  80. gameOver: false,
  81. score: 0,
  82. speedLevel: 200,
  83. }
  84. fruit = generateFruit()
  85. inputKeyChan = make(chan termbox.KeyEvent)
  86. go func() {
  87. for {
  88. event := <-inputKeyChan
  89. if event.Key == termbox.KeyEsc {
  90. os.Exit(0)
  91. }
  92. }
  93. }()
  94. }
  95. // 移动蛇
  96. func move() {
  97. if snakeGame.gameOver {
  98. return
  99. }
  100. head := snakeGame.body[0]
  101. newHead := point{head.x + snakeGame.direction.x, head.y + snakeGame.direction.y}
  102. if !isValidPosition(newHead) || isColliding(newHead) {
  103. snakeGame.gameOver = true
  104. return
  105. }
  106. snakeGame.body = append([]point{newHead}, snakeGame.body...)
  107. if !snakeGame.grow { // 不需要增长,移除最后一个尾巴元素
  108. snakeGame.body = snakeGame.body[:len(snakeGame.body)-1]
  109. } else {
  110. fruit = generateFruit() // 吃到水果后生成新的水果位置
  111. }
  112. snakeGame.grow = false
  113. checkEatFruit(newHead)
  114. }
  115. // 渲染游戏界面
  116. func render() {
  117. termbox.Clear(termbox.ColorDefault, termbox.ColorDefault)
  118. for _, p := range snakeGame.body {
  119. drawCell(p.x, p.y, termbox.ColorGreen)
  120. }
  121. drawCell(fruit.x, fruit.y, termbox.ColorRed)
  122. termbox.Flush()
  123. }
  124. // 在指定位置绘制单元格
  125. func drawCell(x, y int, color termbox.Attribute) {
  126. termbox.SetCell(x*2, y, ' ', termbox.ColorDefault, color)
  127. termbox.SetCell(x*2+1, y, ' ', termbox.ColorDefault, color)
  128. }
  129. // 检查是否吃到水果
  130. func checkEatFruit(head point) {
  131. if head == fruit {
  132. snakeGame.score++
  133. snakeGame.grow = true
  134. if snakeGame.score % 5 == 0 { // 每吃到五个水果,速度提高一级别
  135. snakeGame.speedLevel -= 10
  136. if snakeGame.speedLevel < 50 { // 速度上限为50ms
  137. snakeGame.speedLevel = 50
  138. }
  139. }
  140. }
  141. }
  142. // 随机生成水果位置
  143. func generateFruit() point {
  144. var p point
  145. for {
  146. p = point{rand.Intn(width), rand.Intn(height)}
  147. if !isColliding(p) {
  148. break
  149. }
  150. }
  151. return p
  152. }
  153. // 判断位置是否合法(在边界内)
  154. func isValidPosition(p point) bool {
  155. return p.x >= 0 && p.x < width && p.y >= 0 && p.y < height
  156. }
  157. // 判断是否与蛇身碰撞
  158. func isColliding(p point) bool {
  159. for _, b := range snakeGame.body {
  160. if b == p {
  161. return true
  162. }
  163. }
  164. return false
  165. }

这只是一个简单的贪吃蛇小游戏示例,可能还有一些功能和优化可以增加进去。你可以根据自己的需求进行修改和扩展。希望对你有帮助!


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=8507

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?