ZBLOG

golang 编写2048小游戏

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

package main

import (
	"fmt"
	"math/rand"
)

const (
	boardSize = 4 // 棋盘大小
	goal      = 2048 // 目标数字
)

type Direction int

const (
	Up Direction = iota
	Down
	Left
	Right
)

type Game struct {
	board [][]int
	score int
}

func NewGame() *Game {
	board := make([][]int, boardSize)
	for i := range board {
		board[i] = make([]int, boardSize)
	}
	return &Game{
		board: board,
		score: 0,
	}
}

func (g *Game) PrintBoard() {
	for _, row := range g.board {
		for _, cell := range row {
			fmt.Printf("%-5d", cell)
		}
		fmt.Println()
	}
}

func (g *Game) AddRandomTile() {
	var emptyCells []int
	for i, row := range g.board {
		for j, cell := range row {
			if cell == 0 {
				position := i*boardSize + j
				emptyCells = append(emptyCells, position)
			}
		}
	}

	if len(emptyCells) > 0 {
        randomPosition := emptyCells[rand.Intn(len(emptyCells))]
        randomValue := rand.Intn(2)*2 + 2 // 随机生成2或者4

        rowIndex := randomPosition / boardSize
        colIndex := randomPosition % boardSize

        g.board[rowIndex][colIndex] = randomValue
    }
}

func (g *Game) Move(direction Direction) bool {
	moved := false

	switch direction {
	case Up:
		for col := 0; col < boardSize; col++ {
			for row := 1; row < boardSize; row++ {
				if g.board[row][col] != 0 {
					for i := row; i > 0 && g.board[i-1][col] == 0; i-- {
						g.board[i-1][col], g.board[i][col] = g.board[i][col], g.board[i-1][col]
						moved = true
					}
				}
			}
		}

	case Down:
		for col := 0; col < boardSize; col++ {
			for row := boardSize - 2; row >= 0; row-- {
				if g.board[row][col] != 0 {
					for i := row; i < boardSize-1 && g.board[i+1][col] == 0; i++ {
						g.board[i+1][col], g.board[i][col] = g.board[i][col], g.board[i+1][col]
						moved = true
					}
				}
			}
		}

	case Left:
		for row := 0; row < boardSize; row++ {
			for col := 1; col < boardSize; col++ {
				if g.board[row][col] != 0 {
					for j := col; j > 0 && g.board[row][j-1] == 0; j-- {
						g.board[row][j-1], g.board[row][j] = g.board[row][j], g.board[row][j-1]
						moved = true
					}
				}
			}
        }
        
    case Right:
        for row := 0 ;row<boardSize ;row ++{
            for col:=boardSize-2;col>=0;col--{
                if g.board[row][col] != 0 {
                    for j := col; j < boardSize-1 && g.board[row][j+1] == 0; j++ {
                        g.board[row][j+1], g.board[row][j] = g.board[row][j], g.board[row][j+1]
                        moved = true
                    }
                }
            }
        }

	}

	return moved
}

func main() {
	game := NewGame()
	game.AddRandomTile()
	game.AddRandomTile()

	for {
		fmt.Println("Score:", game.score)
		game.PrintBoard()

		var direction Direction
		fmt.Print("Enter move (WASD): ")
		fmt.Scanf("%c\n", &direction)

		moved := game.Move(direction)
		if !moved {
			fmt.Println("Invalid move!")
			continue
		}

		game.AddRandomTile()

        // TODO: 检查是否达到目标数字,游戏结束的逻辑

        // TODO: 检查是否无法移动,游戏结束的逻辑

    }
}

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


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?