summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael R Sweet <michael.r.sweet@gmail.com>2005-11-26 14:25:01 +0000
committerMichael R Sweet <michael.r.sweet@gmail.com>2005-11-26 14:25:01 +0000
commitfd9a51e43b57b61ae1a321b6b4e627388b3179f7 (patch)
treed73a5e6e2e4764d34500ab6499d72b01899a55bb
parent4a12c536fd180b3d27f49e38262797bd009f5e64 (diff)
Fix up new game code to expose at least one of every number in each axis
so puzzles are solvable with a unique solution. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@4657 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
-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;
+ }
+ }
}
}
}