From 67f127df2156cb0975977607bc444c09c6431efc Mon Sep 17 00:00:00 2001 From: Christine Dodrill Date: Wed, 18 Dec 2019 03:20:09 +0000 Subject: [PATCH] ugh --- src/main.rs | 66 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 21 deletions(-) diff --git a/src/main.rs b/src/main.rs index a4514ed..792fc38 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,7 +12,9 @@ use std::sync::{Arc, Mutex}; mod battlesnake; -type Cache = Arc>>; +type Cache = Mutex>; + +#[derive(Debug, Clone)] pub struct GameState { path: Option>, target: battlesnake::Coord, @@ -38,7 +40,9 @@ fn begin(cache: State, msg: Json) -> Json, msg: Json) -> Json Option> { +fn find_path( + msg: &battlesnake::SnakeRequest, + head: &battlesnake::Coord, + target: &battlesnake::Coord +) -> Option> { let path = pathfinding::directed::astar::astar( head, |n| msg.board.safe_neighbors(n).into_iter(), @@ -64,25 +72,42 @@ fn find_path(msg: &battlesnake::SnakeRequest, head: &battlesnake::Coord, target: } #[post("/move", format = "json", data = "")] -fn make_move(msg: Json) -> Json { - let target = find_target(&msg); - println!("target: {:?}", target); +fn make_move(cache: State, msg: Json) -> Json { + let head = msg.you.body[0]; + if let Some(mut gs) = cache.lock().expect("wanted cache to be unlockable").get(&msg.game.id) { + let gs_path = gs.path.as_ref().or_else(|| { + let target = find_target(&msg); + let path = find_path(&msg, &head, &target); + gs = &GameState{ + target: *target, + path: path, + }; - let head = &msg.you.body[0]; - println!("me: {:?}", head); - for ne in &msg.board.safe_neighbors(&head) { - println!("{:?} {}", ne.0, battlesnake::Line{ - start: &head, - end: &ne.0, - }.direction()); + path.as_ref() + }); + let mut inner = gs_path.expect("what"); + let next = inner[0]; + inner.pop(); + + if inner.len() == 0 { + gs.path = None; + } + + return Json(battlesnake::MoveResponse{ + move_field: battlesnake::Line{ + start: &head, + end: &next, + }.direction().to_string(), + }) } - println!("{:?}", pathfinding::directed::astar::astar( - head, - |n| msg.board.safe_neighbors(n).into_iter(), - |n| (battlesnake::manhattan(n, &target) as usize), - |n| n == target, - )); + let target = find_target(&msg); + let path = find_path(&msg, &head, &target); + let gs = GameState{ + target: *target, + path: path, + }; + println!("{:?}", gs); Json(battlesnake::MoveResponse { move_field: "up".to_string(), @@ -112,13 +137,12 @@ fn find_target<'a>(gs: &'a battlesnake::SnakeRequest) -> &'a battlesnake::Coord fn main() { let map = HashMap::::new(); let mutex_map = Mutex::from(map); - let arc_mutex_map = Arc::from(mutex_map); rocket::ignite().mount("/", routes![ index, begin, ping, make_move, ]) - .manage(arc_mutex_map) + .manage(mutex_map) .launch(); }