package main func (game *Game) initRobots() { var fabricate int = game.level * 16 for i := 0; i < fabricate; i++ { var found bool var rndPos Position for !found { rndPos = game.randPos() if !game.onPlayer(rndPos) { found = true } } rndRobot := Robot{ id: i, position: rndPos, } game.robots = append(game.robots, rndRobot) } } func (game *Game) drawRobots() { for _, r := range game.robots { game.screen.SetContent(r.position.x, r.position.y, '+', nil, game.style) } } func (game *Game) moveRobots() { // Iterate through the robots for i, r := 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++ } } // After all the moves, lets check if any of the rowboz collided with anything for _, r := range game.robots { // Hit a player? Game over! if game.onPlayer(r.position) { game.gameover = 1 return } // Robots mingling? Trash! if game.onRobot(r) { // Delete robot game.deleteRobot(r) // Create trash game.addTrash(r) } // Hugging Trash? More trash! if game.onTrash(r.position) { // Delete robot game.deleteRobot(r) } } } func (game *Game) onRobot(robot Robot) bool { var found bool = false for _, r := range game.robots { if robot.id != r.id && robot.position == r.position { found = true } } return found } // TODO: improve this func (game *Game) deleteRobot(robot Robot) { // The following would work, if it wasn't for the fact you are iterating through an array, // and deleting elements form that same array. So deleting item #15 isn't going to work // when the array has been reduced to 13 elements. // if robot < len(game.robots) { // game.robots = append(game.robots[:robot], game.robots[robot+1:]...) // } // This isn't going to work for the same reason, // and it adds the issue that random robots will get deleted. // var rowboz []Position // for i, r := range game.robots { // if robot != i { // rowboz = append(rowboz, r) // } // } // game.robots = nil // game.robots = rowboz // Conclusion: I need to find a different way to do this properly while iterating to that same array. var rowboz []Robot for _, r := range game.robots { if robot != r { rowboz = append(rowboz, r) } } game.robots = nil game.robots = rowboz game.player.score++ }