summaryrefslogtreecommitdiff
path: root/src/lib.rs
diff options
context:
space:
mode:
authorJustin Worthe <justin.worthe@gmail.com>2017-05-20 18:01:43 +0200
committerJustin Worthe <justin.worthe@gmail.com>2017-05-20 18:01:43 +0200
commit7dd0fe43fe7e72e5f56a8a61bbaec3a78399e6c8 (patch)
tree4b1cfd0375609019c0e1a07f34bf8e5574ffce84 /src/lib.rs
parent10c8ceb168e86a58e38086691ddd519bac63ff03 (diff)
Moved ship placement knowledge out to be one per ship
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs40
1 files changed, 22 insertions, 18 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 81dd845..f84c172 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -14,6 +14,7 @@ mod shooting;
mod state;
mod knowledge;
+use actions::*;
use math::*;
use files::*;
use ships::*;
@@ -30,34 +31,37 @@ pub fn write_move(working_dir: PathBuf) -> Result<(), String> {
let is_place_phase = state_json["Phase"] == 1;
let map_size = State::map_size_from_json(&state_json)?;
- let starting_knowledge = if is_place_phase {
- Knowledge::new()
- }
- else {
- read_knowledge()?
- };
-
- let action = if is_place_phase {
- place_ships_randomly(map_size)
+ let (action, knowledge) = if is_place_phase {
+ placement(map_size)
}
else {
let state = State::new(&state_json)?;
- shoot_randomly(&state)
+ shoot(&state)?
};
-
- let ending_knowledge = starting_knowledge
- .with_action(action.clone());
-
- write_knowledge(&ending_knowledge)
+
+ 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!("Input state:\n{}\n\n", state_json);
- println!("Existing knowledge:\n{}\n\n", serde_json::to_string(&starting_knowledge).unwrap_or(String::from("")));
- println!("End of turn knowledge:\n{}\n\n", serde_json::to_string(&ending_knowledge).unwrap_or(String::from("")));
+ 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_randomly(&state);
+
+ Ok((action.clone(), knowledge.with_action(action)))
+}
+