summaryrefslogtreecommitdiff
path: root/2017-battleships/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to '2017-battleships/src/lib.rs')
-rw-r--r--2017-battleships/src/lib.rs67
1 files changed, 67 insertions, 0 deletions
diff --git a/2017-battleships/src/lib.rs b/2017-battleships/src/lib.rs
new file mode 100644
index 0000000..00eaf02
--- /dev/null
+++ b/2017-battleships/src/lib.rs
@@ -0,0 +1,67 @@
+extern crate json;
+extern crate rand;
+extern crate serde;
+extern crate serde_json;
+#[macro_use]
+extern crate serde_derive;
+
+mod actions;
+mod math;
+mod files;
+mod ships;
+mod placement;
+mod shooting;
+mod state;
+mod knowledge;
+
+use actions::*;
+use math::*;
+use files::*;
+use ships::*;
+use placement::*;
+use shooting::*;
+use state::*;
+use knowledge::*;
+
+use std::path::PathBuf;
+
+pub fn write_move(working_dir: PathBuf) -> Result<(), String> {
+ let state_json = read_file(&working_dir)?;
+
+ let is_place_phase = state_json["Phase"] == 1;
+ let map_size = State::map_size_from_json(&state_json)?;
+
+ let (action, knowledge) = if is_place_phase {
+ placement(map_size)
+ }
+ else {
+ let state = State::new(&state_json)?;
+ shoot(&state)?
+ };
+
+ write_knowledge(&knowledge)
+ .map_err(|e| format!("Failed to write knowledge to file. Error: {}", e))?;
+
+ write_action(&working_dir, is_place_phase, action)
+ .map_err(|e| format!("Failed to write action to file. Error: {}", e))?;
+
+ println!("Knowledge:\n{}\n\n", serde_json::to_string(&knowledge).unwrap_or(String::from("")));
+
+ Ok(())
+}
+
+fn placement(map_size: u16) -> (Action, Knowledge) {
+ let action = place_ships_randomly(map_size);
+ let knowledge = Knowledge::new(map_size, action.clone());
+
+ (action, knowledge)
+}
+
+fn shoot(state: &State) -> Result<(Action, Knowledge), String> {
+ let old_knowledge = read_knowledge()?;
+ let knowledge = old_knowledge.resolve_last_action(&state);
+ let action = shoot_smartly(&knowledge);
+
+ Ok((action.clone(), knowledge.with_action(action)))
+}
+