Implement Map tick method
This commit is contained in:
@ -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<Direction>) -> Map {
|
||||
if decisions.len() < self.snakeInfos.len() {
|
||||
panic!("All snakes have to make a decision");
|
||||
}
|
||||
|
||||
let worldTick = self.worldTick + 1;
|
||||
let mut newSnakeInfos: Vec<SnakeInfo> = 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)]
|
||||
|
||||
15
src/util.rs
15
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<i32>, map_width: i32) -> Vec<(i32,i32)> {
|
||||
positions.into_iter().map(|pos| translate_position(*pos, map_width)).collect()
|
||||
|
||||
Reference in New Issue
Block a user