diff --git a/battlesnake/src/types/simulation.rs b/battlesnake/src/types/simulation.rs index 8c66432..2ab807d 100644 --- a/battlesnake/src/types/simulation.rs +++ b/battlesnake/src/types/simulation.rs @@ -60,7 +60,7 @@ impl From<&Request> for Board { board.free.set(index, false); } let snake = Snake { - body: snake.body.iter().copied().collect(), + body: snake.body.iter().rev().copied().collect(), id: u8::try_from(id).unwrap_or(u8::MAX), health: snake.health, }; @@ -206,9 +206,7 @@ impl Board { |(_, action)| *action, ); let new_head = snake.head().wrapping_apply(action); - let snake = &mut self.snakes[i]; - snake.body.push_front(new_head); - snake.body.pop_back(); + self.snakes[i].advance(new_head); } } @@ -244,9 +242,7 @@ impl Board { fn feed_snakes_standard(&mut self) { if self.constrictor { for snake in &mut self.snakes { - snake.health = 100; - let tail = snake.tail(); - snake.body.push_back(tail); + snake.feed(); } } else { let mut eaten_food = vec![]; @@ -256,10 +252,7 @@ impl Board { let head_index = self.coord_to_linear(head); if self.food[head_index] { eaten_food.push(head_index); - let snake = &mut self.snakes[i]; - snake.health = 100; - let tail = snake.tail(); - snake.body.push_back(tail); + self.snakes[i].feed(); } } } @@ -380,16 +373,28 @@ struct Snake { impl Snake { pub fn head(&self) -> Coord { - self.body.front().copied().unwrap_or_else(|| { + self.body.back().copied().unwrap_or_else(|| { error!("Snake without a head: {self:?}"); Coord { x: 0, y: 0 } }) } pub fn tail(&self) -> Coord { - self.body.back().copied().unwrap_or_else(|| { + self.body.front().copied().unwrap_or_else(|| { error!("Snake without a tail: {self:?}"); Coord { x: 0, y: 0 } }) } + + pub fn advance(&mut self, head: Coord) { + self.body.push_back(head); + self.body.pop_front(); + self.health = 100; + } + + pub fn feed(&mut self) { + if let Some(tail) = self.body.front() { + self.body.push_front(*tail); + } + } }