summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorMichael R Sweet <michael.r.sweet@gmail.com>2005-11-26 06:23:13 +0000
committerMichael R Sweet <michael.r.sweet@gmail.com>2005-11-26 06:23:13 +0000
commit4a12c536fd180b3d27f49e38262797bd009f5e64 (patch)
treefe828db1f3e6fdfe6e746ddb70177fdca6a8a18c /test
parent65727ba06b28c83378aaa49253d09bf98171fc1a (diff)
Better game generation, fix test slot usage.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@4656 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'test')
-rw-r--r--test/sudoku.cxx82
1 files changed, 46 insertions, 36 deletions
diff --git a/test/sudoku.cxx b/test/sudoku.cxx
index 9262ec631..f16c43c5b 100644
--- a/test/sudoku.cxx
+++ b/test/sudoku.cxx
@@ -123,14 +123,12 @@ SudokuCell::draw() {
fl_draw(s, x(), y(), w(), h(), FL_ALIGN_CENTER);
}
- if (test_value_[0]) {
- fl_font(FL_HELVETICA_BOLD, h() / 5);
+ fl_font(FL_HELVETICA_BOLD, h() / 5);
- for (int i = 0; i < 8; i ++) {
- if (test_value_[i]) {
- s[0] = test_value_[i] + '0';
- fl_draw(s, x() + 5, y() + 5, w() - 10, h() - 10, align[i]);
- }
+ for (int i = 0; i < 8; i ++) {
+ if (test_value_[i]) {
+ s[0] = test_value_[i] + '0';
+ fl_draw(s, x() + 5, y() + 5, w() - 10, h() - 10, align[i]);
}
}
}
@@ -167,14 +165,18 @@ SudokuCell::handle(int event) {
if (Fl::event_state() & FL_SHIFT) {
int i;
- for (i = 0; i < 8; i ++) {
- if (!test_value_[i]) {
- test_value_[i] = key;
- break;
- } else if (test_value_[i] == key) {
+ for (i = 0; i < 8; i ++)
+ if (test_value_[i] == key) {
test_value_[i] = 0;
break;
}
+
+ if (i >= 8) {
+ for (i = 0; i < 8; i ++)
+ if (!test_value_[i]) {
+ test_value_[i] = key;
+ break;
+ }
}
if (i >= 8) {
@@ -380,6 +382,8 @@ Sudoku::load_game() {
// Load the current values and state of each grid...
memset(grid_values_, 0, sizeof(grid_values_));
+ bool solved = true;
+
for (int i = 0; i < 9; i ++)
for (int j = 0; j < 9; j ++) {
char name[255];
@@ -405,7 +409,10 @@ Sudoku::load_game() {
cell->readonly(val);
if (val) cell->color(FL_GRAY);
- else cell->color(FL_LIGHT3);
+ else {
+ cell->color(FL_LIGHT3);
+ solved = false;
+ }
for (int k = 0; k < 8; k ++) {
sprintf(name, "test%d%d.%d", k, i, j);
@@ -414,8 +421,9 @@ Sudoku::load_game() {
}
}
- // If we didn't load any values, then create a new game...
- if (!grid_values_[0][0]) new_game();
+ // If we didn't load any values or the last game was solved, then
+ // create a new game automatically...
+ if (solved || !grid_values_[0][0]) new_game();
}
@@ -488,33 +496,35 @@ Sudoku::new_game() {
// Show N cells, starting with potential confusing ones...
count = difficulty_;
- for (i = 0; i < 8; i ++)
- for (j = 0; j < 8; j ++) {
- cell = grid_cells_[i][j];
+ for (i = 0; i < 9; i ++) {
+ j = rand() % 9;
+ cell = grid_cells_[i][j];
- for (k = i + 1; k < 9; k ++) {
- if (grid_values_[i][j] == grid_values_[k][j + 1] &&
- grid_values_[i][j + 1] == grid_values_[k][j]) {
- cell->value(grid_values_[i][j]);
- cell->readonly(1);
- cell->color(FL_GRAY);
+ 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);
- count --;
- }
+ count --;
}
+ }
- for (m = j + 1; m < 9; m ++) {
- if (!cell->readonly() &&
- grid_values_[i][j] == grid_values_[i + 1][m] &&
- grid_values_[i + 1][m] == grid_values_[i][m]) {
- cell->value(grid_values_[i][j]);
- cell->readonly(1);
- cell->color(FL_GRAY);
+ for (j = 0; j < 9; j ++) {
+ do {
+ i = rand() % 9;
+ cell = grid_cells_[i][j];
+ } while (cell->readonly());
- count --;
- }
+ 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);
+
+ count --;
}
- }
+ }
// Now show random fields...
while (count > 0) {