diff options
| author | Michael R Sweet <michael.r.sweet@gmail.com> | 2005-12-02 01:34:25 +0000 |
|---|---|---|
| committer | Michael R Sweet <michael.r.sweet@gmail.com> | 2005-12-02 01:34:25 +0000 |
| commit | 912f6acf1fa8523156d9956e7517418f4a94fd1b (patch) | |
| tree | b97be0faca8ae2d7aea882b67805451c58dfc63c | |
| parent | 0992f4ef15c5fe054d938c6aad2692f7f67fcd60 (diff) | |
Allow multiple solutions to solve the puzzle.
Don't show solved grids - not compatible with new code anyways, and made
the game too easy.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@4678 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
| -rw-r--r-- | test/sudoku.cxx | 104 |
1 files changed, 20 insertions, 84 deletions
diff --git a/test/sudoku.cxx b/test/sudoku.cxx index 178ecf464..832300a18 100644 --- a/test/sudoku.cxx +++ b/test/sudoku.cxx @@ -364,7 +364,7 @@ void Sudoku::check_game(bool highlight) { bool empty = false; bool correct = true; - int i, j; + int i, j, k; // Check the game for right/wrong answers... for (i = 0; i < 9; i ++) @@ -373,47 +373,32 @@ Sudoku::check_game(bool highlight) { int val = cell->value(); if (!val) empty = true; + else { + for (k = 0; k < 9; k ++) + if ((i != k && grid_cells_[k][j]->value() == val) || + (j != k && grid_cells_[i][k]->value() == val)) break; + + if (k < 9) { + if (highlight) { + cell->color(FL_YELLOW); + cell->redraw(); + } - if (val && grid_values_[i][j] != val) { - if (highlight) { - cell->color(FL_YELLOW); - cell->redraw(); + correct = false; } - - correct = false; } } if (!empty && correct) { // Success! - solve_game(); - fl_message("Congratulations, you solved the game!"); - } else { - int k, m; - - for (i = 0; i < 9; i += 3) - for (j = 0; j < 9; j += 3) { - correct = true; - - for (k = 0; correct && k < 3; k ++) - for (m = 0; m < 3; m ++) - if (grid_cells_[i + k][j + m]->value() != - grid_values_[i + k][j + m]) { - correct = false; - break; - } - - if (correct) { - for (k = 0; k < 3; k ++) - for (m = 0; m < 3; m ++) { - SudokuCell *cell = grid_cells_[i + k][j + m]; - - cell->readonly(1); - cell->color(fl_color_average(FL_GRAY, FL_GREEN, 0.5f)); - } - } - + for (i = 0; i < 9; i ++) + for (j = 0; j < 9; j ++) { + SudokuCell *cell = grid_cells_[i][j]; + cell->color(FL_GREEN); + cell->readonly(1); } + + fl_message("Congratulations, you solved the game!"); } } @@ -611,7 +596,7 @@ Sudoku::new_game() { } // Show N cells... - count = 5 * (5 - difficulty_); + count = 10 * (5 - difficulty_); int numbers[9]; @@ -643,55 +628,6 @@ Sudoku::new_game() { } } } - - // Show additional cells as needed to avoid ambiguous solutions. - // The basic premise is to find all possible numbers for each hidden - // cell and show the cell if we have more than two possible solutions. - int possible; - - count = 5 * (5 - difficulty_); - - while (count > 0) { - i = rand() % 9; - j = rand() % 9; - cell = grid_cells_[i][j]; - - if (cell->readonly()) continue; - - possible = 9; - memset(numbers, 0, sizeof(numbers)); - - // Check vertical cells - for (k = 0; k < 9; k ++) { - cell = grid_cells_[k][j]; - t = grid_values_[k][j] - 1; - - if (i != k && !numbers[t] && cell->readonly()) { - possible --; - numbers[t] = 1; - } - } - - // Check horizontal cells - for (m = 0; m < 9; m ++) { - cell = grid_cells_[i][m]; - t = grid_values_[i][m] - 1; - - if (j != m && !numbers[t] && cell->readonly()) { - possible --; - numbers[t] = 1; - } - } - - // Now, if the count > 2, show this cell... - if (possible > 2) { - cell = grid_cells_[i][j]; - cell->value(grid_values_[i][j]); - cell->readonly(1); - cell->color(FL_GRAY); - count --; - } - } } |
