1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
use serde::Deserialize;
use crate::moves::Direction;
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq)]
pub struct Location {
pub x: i32,
pub y: i32,
}
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq)]
pub struct Turn {
pub game: Game,
pub turn: u32,
pub board: Board,
pub you: Snake,
}
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq)]
pub struct Game {
pub id: String,
pub timeout: u32,
}
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq)]
pub struct Board {
pub height: u32,
pub width: u32,
pub food: Vec<Location>,
pub hazards: Vec<Location>,
pub snakes: Vec<Snake>,
}
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq)]
#[serde(default)]
pub struct Snake {
pub id: String,
pub name: String,
pub health: u32,
pub body: Vec<Location>,
pub latency: String,
pub head: Location,
pub length: u32,
pub shout: String,
pub squad: String,
}
impl Turn {
pub fn last_direction(&self) -> Direction {
let head_loc = self.you.body.first().unwrap();
let next_loc = self.you.body.get(1).unwrap();
let diff: (i32, i32) = (head_loc.x - next_loc.x, head_loc.y - next_loc.y);
match diff {
( 1, 0) => Direction::Right,
(-1, 0) => Direction::Left,
( 0, 1) => Direction::Up,
( 0, -1) => Direction::Down,
_ => Direction::Up,
}
}
}