diff options
Diffstat (limited to 'src/knowledge.rs')
-rw-r--r-- | src/knowledge.rs | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/knowledge.rs b/src/knowledge.rs index 1923f41..4a66e8b 100644 --- a/src/knowledge.rs +++ b/src/knowledge.rs @@ -170,6 +170,11 @@ impl Knowledge { let possible_placements = self.opponent_map.possible_placements(); // let lattice = self.lattice_size(); //TODO use the lattice still? + let guaranteed_hits = self.get_points_that_touch_all_possibilities_on_unsunk_ship(); + if !guaranteed_hits.is_empty() { + return (Weapon::SingleShot, guaranteed_hits); + } + let mut best_shots: HashMap<Weapon, (Vec<Point>, usize)> = HashMap::new(); for &weapon in self.available_weapons.iter() { @@ -234,6 +239,16 @@ impl Knowledge { (best.0.clone(), (best.1).0) } + fn get_points_that_touch_all_possibilities_on_unsunk_ship(&self) -> Vec<Point> { + self.opponent_map.flat_cell_position_list().iter().cloned().filter(|&point| { + self.opponent_map.ships.values() + .any(|ref ship| !ship.destroyed && + ship.possible_placements.iter().all(|placement| { + placement.touches_point(point) + })) + }).collect() + } + fn lattice_size(&self) -> u16 { let any_long_ships = self.opponent_map.ships.iter() .any(|(ship, knowledge)| ship.length() >= 4 && !knowledge.destroyed); |