diff options
| author | Simon Tatham <anakin@pobox.com> | 2012-04-08 13:45:10 +0000 |
|---|---|---|
| committer | Simon Tatham <anakin@pobox.com> | 2012-04-08 13:45:10 +0000 |
| commit | ec732a4f4e3944071c8a0119f351464c702c48a1 (patch) | |
| tree | 4f5a00ed9ea501ee9eda62030b712c325bc6627c | |
| parent | b40b89f87988c33b28936ca55a06f6b83438ec1f (diff) | |
| download | puzzles-ec732a4f4e3944071c8a0119f351464c702c48a1.zip puzzles-ec732a4f4e3944071c8a0119f351464c702c48a1.tar.gz puzzles-ec732a4f4e3944071c8a0119f351464c702c48a1.tar.bz2 puzzles-ec732a4f4e3944071c8a0119f351464c702c48a1.tar.xz | |
Add a difficulty exception to prevent Pearl spinning forever when
asked to generate a 5x5 Tricky puzzle. (Debian bug #667963)
[originally from svn r9454]
| -rw-r--r-- | pearl.c | 18 |
1 files changed, 13 insertions, 5 deletions
@@ -1161,9 +1161,17 @@ void pearl_loopgen(int w, int h, char *lines, random_state *rs) static int new_clues(game_params *params, random_state *rs, char *clues, char *grid) { - int w = params->w, h = params->h; + int w = params->w, h = params->h, diff = params->difficulty; int ngen = 0, x, y, d, ret, i; + + /* + * Difficulty exception: 5x5 Tricky is not generable (the + * generator will spin forever trying) and so we fudge it to Easy. + */ + if (w == 5 && h == 5 && diff > DIFF_EASY) + diff = DIFF_EASY; + while (1) { ngen++; pearl_loopgen(w, h, grid, rs); @@ -1245,7 +1253,7 @@ static int new_clues(game_params *params, random_state *rs, /* * See if we can solve the puzzle just like this. */ - ret = pearl_solve(w, h, clues, grid, params->difficulty, FALSE); + ret = pearl_solve(w, h, clues, grid, diff, FALSE); assert(ret > 0); /* shouldn't be inconsistent! */ if (ret != 1) continue; /* go round and try again */ @@ -1253,8 +1261,8 @@ static int new_clues(game_params *params, random_state *rs, /* * Check this puzzle isn't too easy. */ - if (params->difficulty > DIFF_EASY) { - ret = pearl_solve(w, h, clues, grid, params->difficulty-1, FALSE); + if (diff > DIFF_EASY) { + ret = pearl_solve(w, h, clues, grid, diff-1, FALSE); assert(ret > 0); if (ret == 1) continue; /* too easy: try again */ @@ -1321,7 +1329,7 @@ static int new_clues(game_params *params, random_state *rs, clue = clues[y*w+x]; clues[y*w+x] = 0; /* try removing this clue */ - ret = pearl_solve(w, h, clues, grid, params->difficulty, FALSE); + ret = pearl_solve(w, h, clues, grid, diff, FALSE); assert(ret > 0); if (ret != 1) clues[y*w+x] = clue; /* oops, put it back again */ |