From 6d3d7b1c3fbefd40ccb179b32f90cac51234c4d9 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Fri, 3 Oct 2025 01:16:11 -0400 Subject: [PATCH] Now have enemy collision. --- main.go | 68 ++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 48 insertions(+), 20 deletions(-) diff --git a/main.go b/main.go index 8b71965..aed7baa 100644 --- a/main.go +++ b/main.go @@ -17,6 +17,8 @@ const ( WALL = '#' SPACE = '.' PATH_LIMIT = 1000 + RENDER = true + SHOW_RENDER = true ) type Position struct { @@ -24,6 +26,10 @@ type Position struct { y int } +type Enemy struct { + hp int +} + type Game struct { screen tcell.Screen level [][]rune @@ -31,7 +37,7 @@ type Game struct { status string width int height int - enemies []Position + enemies map[Position]Enemy } func (game *Game) DrawStatus(msg string) { @@ -58,12 +64,14 @@ func (game *Game) DrawMap() { } func (game *Game) Render() { + if !RENDER { return } + game.screen.Clear() game.DrawMap() game.DrawEntity('@', game.player, tcell.ColorYellow) - for _, pos := range game.enemies { + for pos, _ := range game.enemies { game.DrawEntity('G', pos, tcell.ColorRed) } @@ -73,12 +81,21 @@ func (game *Game) Render() { } func (game *Game) Exit() { + if RENDER { game.screen.Fini() - os.Exit(0) + } + + os.Exit(0) } func (game *Game) Occupied(x int, y int) bool { - return game.level[y][x] != '.' || !game.Inbounds(Position{x, y}, 1) + pos := Position{x, y} + _, is_enemy := game.enemies[pos] + + // Inbounds comes first to prevent accessing level with bad x,y + return !game.Inbounds(pos, 1) || + game.level[y][x] == WALL || + is_enemy } func (game *Game) MovePlayer(x_delta int, y_delta int) { @@ -88,10 +105,10 @@ func (game *Game) MovePlayer(x_delta int, y_delta int) { } } -func (game *Game) HandleKeys(ev *tcell.EventKey) { +func (game *Game) HandleKeys(ev *tcell.EventKey) bool { switch ev.Key() { case tcell.KeyEscape: - game.Exit() + return false case tcell.KeyUp: game.MovePlayer(0, -1) case tcell.KeyDown: @@ -104,17 +121,23 @@ func (game *Game) HandleKeys(ev *tcell.EventKey) { switch ev.Rune() { case 'q': - game.Exit() + return false } + + return true } -func (game *Game) HandleEvents() { +func (game *Game) HandleEvents() bool { + if !RENDER { return false } + switch ev := game.screen.PollEvent().(type) { case *tcell.EventResize: game.screen.Sync() case *tcell.EventKey: - game.HandleKeys(ev) + return game.HandleKeys(ev) } + + return true } func MakeGame(width int, height int) (*Game) { @@ -125,14 +148,17 @@ func MakeGame(width int, height int) (*Game) { game.width = width game.height = height + game.enemies = make(map[Position]Enemy) game.level = make([][]rune, height, height) - game.screen, err = tcell.NewScreen() - if err != nil { log.Fatal(err) } + if RENDER { + game.screen, err = tcell.NewScreen() + if err != nil { log.Fatal(err) } - err = game.screen.Init() - if err != nil { log.Fatal(err) } + err = game.screen.Init() + if err != nil { log.Fatal(err) } + } game.player = Position{1,1} @@ -236,8 +262,10 @@ func (game *Game) HuntAndKill() []Position { on = nb } - game.Render() - time.Sleep(50 * time.Millisecond) + if SHOW_RENDER { + game.Render() + time.Sleep(50 * time.Millisecond) + } } return dead_ends @@ -288,8 +316,7 @@ func (game *Game) MakeMap() []Position { func (game *Game) PlaceEnemies(places []Position) { for _, pos := range places { if rand.Int() % 2 == 0 { - game.enemies = append(game.enemies, pos) - + game.enemies[pos] = Enemy{10} } } } @@ -300,13 +327,14 @@ func main() { if err != nil { log.Fatal(err) } dbg = log.New(out, "", log.LstdFlags) - game := MakeGame(27, 17) + game := MakeGame(43, 27) dead_ends := game.MakeMap() game.PlaceEnemies(dead_ends) game.Render() - for { - game.HandleEvents() + for game.HandleEvents() { game.Render() } + + game.Exit() }