diff options
Diffstat (limited to 'vroomba-analysis/src/main.rs')
-rw-r--r-- | vroomba-analysis/src/main.rs | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/vroomba-analysis/src/main.rs b/vroomba-analysis/src/main.rs new file mode 100644 index 0000000..e1d244b --- /dev/null +++ b/vroomba-analysis/src/main.rs @@ -0,0 +1,63 @@ +use pathfinding::directed::astar; +use std::path::PathBuf; +use structopt::StructOpt; +use vroomba::command::Command; +use vroomba::consts::*; +use vroomba::global_json; +use vroomba::state::{GameState, GameStatus}; + +#[derive(StructOpt, Debug)] +#[structopt(name = "vroomba-analysis")] +struct Opt { + /// Path to GlobalState.json + path: PathBuf, +} + +fn main() { + let opt = Opt::from_args(); + let initial_node = Node { + state: global_json::read_initial_state_from_global_json_file(opt.path.to_str().unwrap()) + .unwrap(), + last_command: Command::Nothing, + }; + + let shortest_path = astar::astar( + &initial_node, + |node| { + let player_moves = node.state.valid_moves(0); + player_moves + .into_iter() + .map(|player_move| { + let mut state = node.state.clone(); + state.update([player_move, Command::Accelerate]); + ( + Node { + state, + last_command: player_move, + }, + 1, + ) + }) + .collect::<Vec<_>>() + }, + |node| (WIDTH - node.state.players[0].position.x) / SPEED_BOOST, + |node| node.state.status != GameStatus::Continue, + ) + .unwrap(); + + println!( + "{:?}", + shortest_path + .0 + .into_iter() + .map(|node| node.last_command) + .collect::<Vec<_>>() + ); + println!("{}", shortest_path.1); +} + +#[derive(Debug, Clone, Hash, PartialEq, Eq)] +struct Node { + state: GameState, + last_command: Command, +} |