From 06aa9b54c701db5340e151d5c5b1bed96cd5765e Mon Sep 17 00:00:00 2001 From: Sacha Ligthert Date: Mon, 8 Jan 2024 11:12:13 +0100 Subject: [PATCH] Attempt to start using Go Routines --- robots/game.go | 15 ++++---- robots/robots.go | 89 +++++++++++++++++++++++++++++++++++++----------- robots/types.go | 1 + 3 files changed, 78 insertions(+), 27 deletions(-) diff --git a/robots/game.go b/robots/game.go index 3959201..7e663b0 100644 --- a/robots/game.go +++ b/robots/game.go @@ -65,7 +65,7 @@ func initialize() (Game, error) { gameover: 0, } - // game.initRobots() + game.initRobots() return game, err } @@ -73,19 +73,18 @@ func initialize() (Game, error) { func (game *Game) gameDirector() { defer quit(game) - // TODO reorder this for game.gameover == 0 { // Clean the screen game.screen.Clear() // Draw robots?? - // if len(game.robots) == 0 { - // game.level++ - // game.cleanTrash() - // game.resetPlayer() - // game.initRobots() - // } + if len(game.robots) == 0 { + game.level++ + game.cleanTrash() + game.resetPlayer() + game.initRobots() + } // Draw starter conditions game.drawBox() diff --git a/robots/robots.go b/robots/robots.go index d974e73..7c65a65 100644 --- a/robots/robots.go +++ b/robots/robots.go @@ -3,6 +3,12 @@ package robots func (game *Game) initRobots() { var fabricate int = game.level * 16 for i := 0; i < fabricate; i++ { + + var robot Robot + + robot.id = i + robot.comms = make(chan Position) + var found bool var rndPos Position for !found { @@ -11,11 +17,10 @@ func (game *Game) initRobots() { found = true } } - rndRobot := Robot{ - id: i, - position: rndPos, - } - game.robots = append(game.robots, rndRobot) + + robot.position = rndPos + game.robots = append(game.robots, robot) + go game.Robot(robot) } } @@ -26,21 +31,15 @@ func (game *Game) drawRobots() { } func (game *Game) moveRobots() { + + var robotPos Position + // Iterate through the robots - for i, r := range game.robots { + for i, _ := range game.robots { - // Determine in which direction to go - if game.player.position.x < r.position.x { - game.robots[i].position.x-- - } else if game.player.position.x > r.position.x { - game.robots[i].position.x++ - } - - if game.player.position.y < r.position.y { - game.robots[i].position.y-- - } else if game.player.position.y > r.position.y { - game.robots[i].position.y++ - } + game.robots[i].comms <- game.player.position + robotPos = <-game.robots[i].comms + game.robots[i].position = robotPos } @@ -89,14 +88,66 @@ func (game *Game) deleteRobot(robot Robot) { var rowboz []Robot + // Delete from Array for _, r := range game.robots { - if robot != r { + if robot.id != r.id { rowboz = append(rowboz, r) } } game.robots = nil game.robots = rowboz + // Close the channel + close(robot.comms) + game.player.score++ } + +func (game *Game) Robot(robot Robot) { + var player Position + var robotPos Position = robot.position + var emptyPos Position + + for { + // Wait for input from the channel + player = <-robot.comms + + if player == emptyPos { + close(robot.comms) + return + } + + //fmt.Println(player, robotPos) + + // Determine direction to move in + robotPos = game.moveRobot(player, robot.position) + robot.position = robotPos + + // Return new position of robot + robot.comms <- robotPos + } + +} + +func (game *Game) moveRobot(player Position, robot Position) Position { + + var newPosition Position + + // Determine in which direction to go + if player.x < robot.x { + newPosition.x = robot.x - 1 + } else if player.x > robot.x { + newPosition.x = robot.x + 1 + } + + if player.y < robot.y { + newPosition.y = robot.y - 1 + } else if player.y > robot.y { + newPosition.y = robot.y + 1 + } + + //fmt.Println(player, robot, newPosition) + + return newPosition +} diff --git a/robots/types.go b/robots/types.go index c426c1e..2249e9c 100644 --- a/robots/types.go +++ b/robots/types.go @@ -41,5 +41,6 @@ type Game struct { type Robot struct { id int + comms chan Position position Position }