summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/sudoku.cxx79
1 files changed, 46 insertions, 33 deletions
diff --git a/test/sudoku.cxx b/test/sudoku.cxx
index f16c43c5b..f5a000505 100644
--- a/test/sudoku.cxx
+++ b/test/sudoku.cxx
@@ -496,48 +496,61 @@ Sudoku::new_game() {
// Show N cells, starting with potential confusing ones...
count = difficulty_;
- for (i = 0; i < 9; i ++) {
- j = rand() % 9;
- cell = grid_cells_[i][j];
+ int numbers[9];
- for (m = 0; m < 9; m ++)
- if (m != j && grid_values_[i][j] == grid_values_[i][m]) {
- cell->value(grid_values_[i][j]);
- cell->readonly(1);
- cell->color(FL_GRAY);
+ for (i = 0; i < 9; i ++) numbers[i] = i + 1;
- count --;
- }
- }
+ while (count > 0) {
+ for (i = 0; i < 20; i ++) {
+ k = rand() % 9;
+ m = rand() % 9;
+ t = numbers[k];
+ numbers[k] = numbers[m];
+ numbers[m] = t;
+ }
- for (j = 0; j < 9; j ++) {
- do {
- i = rand() % 9;
- cell = grid_cells_[i][j];
- } while (cell->readonly());
+ for (i = 0; count > 0 && i < 9; i ++) {
+ t = numbers[i];
- for (k = 0; k < 9; k ++)
- if (k != i && grid_values_[i][j] == grid_values_[k][j]) {
- cell->value(grid_values_[i][j]);
- cell->readonly(1);
- cell->color(FL_GRAY);
+ for (j = 0; count > 0 && j < 9; j ++) {
+ cell = grid_cells_[i][j];
- count --;
+ if (grid_values_[i][j] == t && !cell->readonly()) {
+ cell->value(grid_values_[i][j]);
+ cell->readonly(1);
+ cell->color(FL_GRAY);
+
+ count --;
+ break;
+ }
}
- }
+ }
- // Now show random fields...
- while (count > 0) {
- i = rand() % 9;
- j = rand() % 9;
- cell = grid_cells_[i][j];
+ if (count <= 0) break;
- if (!cell->readonly()) {
- cell->value(grid_values_[i][j]);
- cell->readonly(1);
- cell->color(FL_GRAY);
+ for (i = 0; i < 20; i ++) {
+ k = rand() % 9;
+ m = rand() % 9;
+ t = numbers[k];
+ numbers[k] = numbers[m];
+ numbers[m] = t;
+ }
+
+ for (j = 0; count > 0 && j < 9; j ++) {
+ t = numbers[j];
- count --;
+ for (i = 0; count > 0 && i < 9; i ++) {
+ cell = grid_cells_[i][j];
+
+ if (grid_values_[i][j] == t && !cell->readonly()) {
+ cell->value(grid_values_[i][j]);
+ cell->readonly(1);
+ cell->color(FL_GRAY);
+
+ count --;
+ break;
+ }
+ }
}
}
}