From 6b81b6bc406d6886d53bb2ea652a3fe1a4a581b3 Mon Sep 17 00:00:00 2001 From: Joakim Hulthe Date: Tue, 31 Oct 2017 19:57:45 +0100 Subject: [PATCH] Implement Map tick method --- src/maputil.rs | 43 ++++++++++++++++++++++++++++++++++++++++++- src/util.rs | 15 +++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/src/maputil.rs b/src/maputil.rs index 211b1d7..c939387 100644 --- a/src/maputil.rs +++ b/src/maputil.rs @@ -1,7 +1,7 @@ use structs::{ Map, SnakeInfo }; use util; use serde::ser::{ Serialize, Serializer }; -use util::{ translate_position }; +use util::{ translate_position, step_in_direction }; #[derive(PartialEq, Debug)] pub enum Tile<'a> { @@ -126,6 +126,47 @@ impl Map { let (x,y) = coordinate; x < 0 || x >= self.width || y < 0 || y >= self.height } + + pub fn tick(&self, decisions: Vec) -> Map { + if decisions.len() < self.snakeInfos.len() { + panic!("All snakes have to make a decision"); + } + + let worldTick = self.worldTick + 1; + let mut newSnakeInfos: Vec = vec![]; + + let grow_snakes: bool = worldTick % 3 == 1; + + if !grow_snakes { + for i in 0..newSnakeInfos.len() { + newSnakeInfos[i].positions.pop(); + } + } + + for i in 0..self.snakeInfos.len() { + let snake: &mut SnakeInfo = &mut newSnakeInfos[i]; + + if(self.can_snake_move_in_direction(snake, decisions[i])) { + let head_position = snake.positions[0].clone(); + snake.positions.insert(0, + step_in_direction( + head_position, + decisions[i], + self.width + ), + ); + } + } + + Map { + width: self.width.clone(), + height: self.height.clone(), + worldTick: worldTick, + snakeInfos: newSnakeInfos, + foodPositions: self.foodPositions.clone(), + obstaclePositions: self.obstaclePositions.clone(), + } + } } #[cfg(test)] diff --git a/src/util.rs b/src/util.rs index 6c22cdd..e2fb490 100644 --- a/src/util.rs +++ b/src/util.rs @@ -1,3 +1,5 @@ +use maputil::{ Direction }; + #[allow(dead_code)] pub fn vector_diff(a: (i32, i32), b: (i32, i32)) -> (i32,i32) {( a.0 - b.0, @@ -15,6 +17,19 @@ pub fn translate_position(position: i32, map_width: i32) -> (i32,i32) { (x as i32, y as i32) } +#[allow(dead_code)] +pub fn step_in_direction(position: i32, direction: Direction, map_width: i32) -> i32 { + let xy = translate_position(position, map_width); + let dxy = match direction { + Direction::Down => (xy.0, xy.1 + 1), + Direction::Up => (xy.0, xy.1 - 1), + Direction::Left => (xy.0 - 1, xy.1), + Direction::Right => (xy.0 + 1, xy.1), + }; + + translate_coordinate(dxy, map_width) +} + #[allow(dead_code)] pub fn translate_positions(positions: &Vec, map_width: i32) -> Vec<(i32,i32)> { positions.into_iter().map(|pos| translate_position(*pos, map_width)).collect()