From e1ca53c7dbc3a2be05f8b764afe4db28c1909f02 Mon Sep 17 00:00:00 2001 From: Dan Windows Date: Fri, 21 Jul 2023 21:59:53 -0400 Subject: [PATCH 1/2] Made it so the first sweep will be in a sufficiently empty field --- src/minesweeper.rs | 52 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/src/minesweeper.rs b/src/minesweeper.rs index ae31be2..519e7bc 100644 --- a/src/minesweeper.rs +++ b/src/minesweeper.rs @@ -312,9 +312,55 @@ impl Minesweeper { fn sweep(&mut self, x: i32, y: i32) -> Result { if self.mine_generation_state == MineGenerationState::Deferred { - // We don't want the first thing that the user clicks to be a mine. - // Generate mines but avoid putting it where the user clicked. - self.generate_mines(self.num_mines, x, y); + // Make the first sweep a large blank area. + let mut starting_field_size = 0; + let mut sweeps: VecDeque; + let mut visited: Vec; + + while starting_field_size < 10 { + starting_field_size = 0; + sweeps = VecDeque::new(); + visited = vec![false; self.game_board_height as usize * self.game_board_width as usize]; + + // We don't want the first thing that the user clicks to be a mine. + // Generate mines but avoid putting it where the user clicked. + self.generate_mines(self.num_mines, x, y); + + let index = self.index_helper.compute_index(x, y); + if self.neighbor_counts[index] != 0 { + continue; + } + + // Do a breadth-first search to count the empty tiles + sweeps.push_front(index); + while !sweeps.is_empty() { + let current_index = sweeps.pop_front().unwrap(); + let current_x: i32 = self.index_helper.compute_x_from_index(current_index); + let current_y: i32 = self.index_helper.compute_y_from_index(current_index); + + if !visited[current_index] { + starting_field_size += 1; + } + + if !visited[current_index] && self.neighbor_counts[current_index] == 0 { + visited[current_index] = true; + + for d_x in -1..=1 { + for d_y in -1..=1 { + let new_x = current_x + d_x; + let new_y = current_y + d_y; + let new_index = self.index_helper.compute_index(new_x, new_y); + + if self.index_helper.is_in_bounds(new_x, new_y) && !visited[new_index] { + sweeps.push_back(new_index); + } + } + } + } + } + } + + self.mine_generation_state = MineGenerationState::Generated; } From 30a1f1ba9b0d1566067ab800e30c8173964f2a3a Mon Sep 17 00:00:00 2001 From: Dan Windows Date: Fri, 21 Jul 2023 22:05:59 -0400 Subject: [PATCH 2/2] Removed redundant visitation check for starting field --- src/minesweeper.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/minesweeper.rs b/src/minesweeper.rs index 519e7bc..7dd0969 100644 --- a/src/minesweeper.rs +++ b/src/minesweeper.rs @@ -327,9 +327,6 @@ impl Minesweeper { self.generate_mines(self.num_mines, x, y); let index = self.index_helper.compute_index(x, y); - if self.neighbor_counts[index] != 0 { - continue; - } // Do a breadth-first search to count the empty tiles sweeps.push_front(index);