From a866bde485c7d8bc82820f2def70af7b6c70a066 Mon Sep 17 00:00:00 2001 From: Justin Wernick Date: Tue, 19 Apr 2022 21:25:36 +0200 Subject: Refile for merging repos --- 2017-battleships/src/lib.rs | 67 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 2017-battleships/src/lib.rs (limited to '2017-battleships/src/lib.rs') 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))) +} + -- cgit v1.2.3