package main import ( "os" "log" "github.com/gdamore/tcell/v2" "github.com/gdamore/tcell/v2/encoding" ) type Game struct { screen tcell.Screen level []string player_x int player_y int } func (game *Game) Render() { var comb []rune game.screen.Clear() for y, line := range game.level { for x, cell := range line { game.screen.SetContent(x, y, cell, comb, tcell.StyleDefault) } } game.screen.SetContent(game.player_x, game.player_y, '@', comb, tcell.StyleDefault) game.screen.Show() } func (game *Game) Exit() { game.screen.Fini() os.Exit(0) } func (game *Game) Occupied(x int, y int) bool { return game.level[y][x] != '.' } func (game *Game) MovePlayer(x_delta int, y_delta int) { if !game.Occupied(game.player_x + x_delta, game.player_y + y_delta) { game.player_x += x_delta game.player_y += y_delta } } func (game *Game) HandleKeys(ev *tcell.EventKey) { switch ev.Key() { case tcell.KeyEscape: game.Exit() case tcell.KeyUp: game.MovePlayer(0, -1) case tcell.KeyDown: game.MovePlayer(0, 1) case tcell.KeyRight: game.MovePlayer(1, 0) case tcell.KeyLeft: game.MovePlayer(-1, 0) } switch ev.Rune() { case 'q': game.Exit() } } func (game *Game) HandleEvents() { switch ev := game.screen.PollEvent().(type) { case *tcell.EventResize: game.screen.Sync() case *tcell.EventKey: game.HandleKeys(ev) } } func MakeGame() (*Game) { var game Game var err error encoding.Register() game.screen, err = tcell.NewScreen() if err != nil { log.Fatal(err) } err = game.screen.Init() if err != nil { log.Fatal(err) } game.player_x = 1 game.player_y = 1 return &game } // This program just prints "Hello, World!". Press ESC to exit. func main() { game := MakeGame() game.level = []string{ "###########################", "#...#.....................#", "#.###.#########.#########.#", "#.....#.......#...#.....#.#", "#######.#####.#####.###.#.#", "#.....#.#.......#...#...#.#", "#.###.#.#.....#.#.#.#.###.#", "#...#.#.#.....#.#.#.#.....#", "###.#.#.#.....#.#.#.#######", "#...#...#.....#...#.......#", "###########################", } game.Render() for { game.HandleEvents() game.Render() } }