summaryrefslogtreecommitdiff
path: root/vroomba-analysis/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vroomba-analysis/src/main.rs')
-rw-r--r--vroomba-analysis/src/main.rs63
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,
+}