summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/knowledge.rs10
1 files changed, 6 insertions, 4 deletions
diff --git a/src/knowledge.rs b/src/knowledge.rs
index f271dbe..44693e5 100644
--- a/src/knowledge.rs
+++ b/src/knowledge.rs
@@ -114,7 +114,7 @@ impl Knowledge {
fn to_hits_and_misses(points: Vec<Option<Point>>, state: &State) -> (Vec<Point>, Vec<Point>, Vec<Point>) {
let points = points.iter().filter_map(|&p| p).collect::<Vec<_>>();
- let hits = points.iter().filter(|p| !state.opponent_map.cells[p.x as usize][p.y as usize].damaged).cloned().collect();
+ let hits = points.iter().filter(|p| state.opponent_map.cells[p.x as usize][p.y as usize].damaged).cloned().collect();
let misses = points.iter().filter(|p| state.opponent_map.cells[p.x as usize][p.y as usize].missed).cloned().collect();
let unknown = points.iter().filter(|p| !state.opponent_map.cells[p.x as usize][p.y as usize].missed && !state.opponent_map.cells[p.x as usize][p.y as usize].damaged).cloned().collect();
@@ -297,9 +297,11 @@ impl OpponentMapKnowledge {
if knowledge.possible_placements.len() == 1 {
let ref true_placement = knowledge.possible_placements[0];
for p in true_placement.points_on_ship() {
- self.cells[p.x as usize][p.y as usize].known_ship = Some(true_placement.ship);
+ if self.cells[p.x as usize][p.y as usize].known_ship == None {
+ self.cells[p.x as usize][p.y as usize].known_ship = Some(true_placement.ship);
+ any_changes = true;
+ }
}
- any_changes = true;
}
}
any_changes
@@ -323,7 +325,7 @@ impl OpponentMapKnowledge {
let cells_copy = self.cells.clone();
for knowledge in self.ships.values_mut() {
- knowledge.possible_placements.retain(|x| sunk_ships.contains(&x.ship) && x.touches_any_point(&must_touch_any) && x.all_are_hits(&cells_copy));
+ knowledge.possible_placements.retain(|x| !sunk_ships.contains(&x.ship) || (x.touches_any_point(&must_touch_any) && x.all_are_hits(&cells_copy)));
}
}