loading bar, better ui
This commit is contained in:
parent
29aa1b9e00
commit
3d2f846858
59
src/main.rs
59
src/main.rs
|
@ -160,6 +160,39 @@ impl Sudoku {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn propagate_collapse(&mut self, _debug_display: bool) {
|
||||||
|
let Some(last_choice) = self.history.last() else {
|
||||||
|
self.update_possibilities();
|
||||||
|
return
|
||||||
|
};
|
||||||
|
|
||||||
|
let collapsed_row = last_choice.cell_selected[0];
|
||||||
|
let collapsed_column = last_choice.cell_selected[1];
|
||||||
|
|
||||||
|
let Some(collapsed_value) = self.grid[collapsed_row][collapsed_column].value else {
|
||||||
|
return
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut collapsed_possibility = HashSet::new();
|
||||||
|
collapsed_possibility.insert(collapsed_value);
|
||||||
|
|
||||||
|
for column_index in 0..self.size {
|
||||||
|
self.grid[collapsed_row][column_index].remove_possibilities(&collapsed_possibility);
|
||||||
|
}
|
||||||
|
|
||||||
|
for row_index in 0..self.size {
|
||||||
|
self.grid[row_index][collapsed_column].remove_possibilities(&collapsed_possibility);
|
||||||
|
}
|
||||||
|
|
||||||
|
for row_index in 0..self.square_size {
|
||||||
|
for column_index in 0..self.square_size {
|
||||||
|
let row = (collapsed_row/self.square_size)*self.square_size + row_index;
|
||||||
|
let column = (collapsed_column/self.square_size)*self.square_size + column_index;
|
||||||
|
self.grid[row][column].remove_possibilities(&collapsed_possibility);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn collapse(&mut self, debug_display: bool) -> bool {
|
fn collapse(&mut self, debug_display: bool) -> bool {
|
||||||
let mut min_row_index: usize = 0;
|
let mut min_row_index: usize = 0;
|
||||||
let mut min_column_index: usize = 0;
|
let mut min_column_index: usize = 0;
|
||||||
|
@ -260,6 +293,15 @@ impl Sudoku {
|
||||||
if debug_display {
|
if debug_display {
|
||||||
println!("--------");
|
println!("--------");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mut filled_cells_number: usize = 0;
|
||||||
|
for row in &self.grid {
|
||||||
|
for cell in row {
|
||||||
|
if !cell.value.is_none() {
|
||||||
|
filled_cells_number += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
println!("# started");
|
println!("# started");
|
||||||
|
|
||||||
|
@ -267,9 +309,18 @@ impl Sudoku {
|
||||||
let mut counter: usize = 0;
|
let mut counter: usize = 0;
|
||||||
|
|
||||||
while self.collapse(debug_display) {
|
while self.collapse(debug_display) {
|
||||||
self.update_possibilities();
|
//self.update_possibilities();
|
||||||
|
self.propagate_collapse(debug_display);
|
||||||
counter +=1;
|
counter +=1;
|
||||||
|
|
||||||
|
if !debug_display {
|
||||||
|
let bar_size = (self.size + self.square_size - 1)*2 + 1;
|
||||||
|
let progress = self.history.len()*bar_size/(self.size*self.size - filled_cells_number);
|
||||||
|
let to_do = bar_size - progress;
|
||||||
|
print!("\r[{}{}]", "#".repeat(progress), "-".repeat(to_do));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
println!();
|
||||||
|
|
||||||
let elapsed = now.elapsed();
|
let elapsed = now.elapsed();
|
||||||
|
|
||||||
|
@ -295,6 +346,12 @@ impl Sudoku {
|
||||||
None => {}
|
None => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
let height = self.size + self.square_size + 2;
|
||||||
|
print!("\x1b[{}A", height);
|
||||||
|
for i in 0..height {
|
||||||
|
println!("{}"," ".repeat((self.size + self.square_size - 1)*2 + 5));
|
||||||
|
}
|
||||||
|
print!("\x1b[{}A", height);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue