ZBLOG

golang 编写2048小游戏

下面是一个简单的示例,展示如何使用Go语言编写一个命令行版的2048小游戏:

  1. package main
  2. import (
  3. "fmt"
  4. "math/rand"
  5. )
  6. const (
  7. boardSize = 4 // 棋盘大小
  8. goal = 2048 // 目标数字
  9. )
  10. type Direction int
  11. const (
  12. Up Direction = iota
  13. Down
  14. Left
  15. Right
  16. )
  17. type Game struct {
  18. board [][]int
  19. score int
  20. }
  21. func NewGame() *Game {
  22. board := make([][]int, boardSize)
  23. for i := range board {
  24. board[i] = make([]int, boardSize)
  25. }
  26. return &Game{
  27. board: board,
  28. score: 0,
  29. }
  30. }
  31. func (g *Game) PrintBoard() {
  32. for _, row := range g.board {
  33. for _, cell := range row {
  34. fmt.Printf("%-5d", cell)
  35. }
  36. fmt.Println()
  37. }
  38. }
  39. func (g *Game) AddRandomTile() {
  40. var emptyCells []int
  41. for i, row := range g.board {
  42. for j, cell := range row {
  43. if cell == 0 {
  44. position := i*boardSize + j
  45. emptyCells = append(emptyCells, position)
  46. }
  47. }
  48. }
  49. if len(emptyCells) > 0 {
  50. randomPosition := emptyCells[rand.Intn(len(emptyCells))]
  51. randomValue := rand.Intn(2)*2 + 2 // 随机生成2或者4
  52. rowIndex := randomPosition / boardSize
  53. colIndex := randomPosition % boardSize
  54. g.board[rowIndex][colIndex] = randomValue
  55. }
  56. }
  57. func (g *Game) Move(direction Direction) bool {
  58. moved := false
  59. switch direction {
  60. case Up:
  61. for col := 0; col < boardSize; col++ {
  62. for row := 1; row < boardSize; row++ {
  63. if g.board[row][col] != 0 {
  64. for i := row; i > 0 && g.board[i-1][col] == 0; i-- {
  65. g.board[i-1][col], g.board[i][col] = g.board[i][col], g.board[i-1][col]
  66. moved = true
  67. }
  68. }
  69. }
  70. }
  71. case Down:
  72. for col := 0; col < boardSize; col++ {
  73. for row := boardSize - 2; row >= 0; row-- {
  74. if g.board[row][col] != 0 {
  75. for i := row; i < boardSize-1 && g.board[i+1][col] == 0; i++ {
  76. g.board[i+1][col], g.board[i][col] = g.board[i][col], g.board[i+1][col]
  77. moved = true
  78. }
  79. }
  80. }
  81. }
  82. case Left:
  83. for row := 0; row < boardSize; row++ {
  84. for col := 1; col < boardSize; col++ {
  85. if g.board[row][col] != 0 {
  86. for j := col; j > 0 && g.board[row][j-1] == 0; j-- {
  87. g.board[row][j-1], g.board[row][j] = g.board[row][j], g.board[row][j-1]
  88. moved = true
  89. }
  90. }
  91. }
  92. }
  93. case Right:
  94. for row := 0 ;row<boardSize ;row ++{
  95. for col:=boardSize-2;col>=0;col--{
  96. if g.board[row][col] != 0 {
  97. for j := col; j < boardSize-1 && g.board[row][j+1] == 0; j++ {
  98. g.board[row][j+1], g.board[row][j] = g.board[row][j], g.board[row][j+1]
  99. moved = true
  100. }
  101. }
  102. }
  103. }
  104. }
  105. return moved
  106. }
  107. func main() {
  108. game := NewGame()
  109. game.AddRandomTile()
  110. game.AddRandomTile()
  111. for {
  112. fmt.Println("Score:", game.score)
  113. game.PrintBoard()
  114. var direction Direction
  115. fmt.Print("Enter move (WASD): ")
  116. fmt.Scanf("%c\n", &direction)
  117. moved := game.Move(direction)
  118. if !moved {
  119. fmt.Println("Invalid move!")
  120. continue
  121. }
  122. game.AddRandomTile()
  123. // TODO: 检查是否达到目标数字,游戏结束的逻辑
  124. // TODO: 检查是否无法移动,游戏结束的逻辑
  125. }
  126. }

请注意这只是一个简单的示例,仅包含基本功能。你可以根据自己的需求进行扩展和改进。


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?