Galaxies: remove the 'maxtries' system.

Most games in this collection don't have one. If you ask them for a
hard puzzle, they'll just keep looping round until they actually
manage to deliver one. We try to arrange that the standard presets
don't take too long to generate, but if the user turns up the game
size _and_ uses an expensive difficulty level, our view is that that's
up to them.

After fixing the bug from the previous commit in which the Galaxies
recursion depth limit was not actually doing anything, even 15x15
Unreasonable now generates happily in under a second. So I don't see
any reason why Galaxies should be an exception.

Hence, now if you ask Galaxies for an Unreasonable puzzle, you _will_
get a puzzle that it grades as Unreasonable, even if that takes a long
time to generate.
This commit is contained in:
Simon Tatham
2023-03-11 22:13:52 +00:00
parent f018ef97d3
commit 47de8f449c

View File

@ -1316,10 +1316,7 @@ static bool generate_try_block(game_state *state, random_state *rs,
} }
#ifdef STANDALONE_SOLVER #ifdef STANDALONE_SOLVER
static int maxtries; static bool one_try; /* override for soak testing */
#define MAXTRIES maxtries
#else
#define MAXTRIES 50
#endif #endif
#define GP_DOTS 1 #define GP_DOTS 1
@ -1390,7 +1387,7 @@ static char *new_game_desc(const game_params *params, random_state *rs,
game_state *state = blank_game(params->w, params->h), *copy; game_state *state = blank_game(params->w, params->h), *copy;
char *desc; char *desc;
int *scratch, sz = state->sx*state->sy, i; int *scratch, sz = state->sx*state->sy, i;
int diff, ntries = 0; int diff;
bool cc; bool cc;
/* Random list of squares to try and process, one-by-one. */ /* Random list of squares to try and process, one-by-one. */
@ -1399,7 +1396,6 @@ static char *new_game_desc(const game_params *params, random_state *rs,
generate: generate:
clear_game(state, true); clear_game(state, true);
ntries++;
/* generate_pass(state, rs, scratch, 10, GP_DOTS); */ /* generate_pass(state, rs, scratch, 10, GP_DOTS); */
/* generate_pass(state, rs, scratch, 100, 0); */ /* generate_pass(state, rs, scratch, 100, 0); */
@ -1432,12 +1428,17 @@ generate:
assert(diff != DIFF_IMPOSSIBLE); assert(diff != DIFF_IMPOSSIBLE);
if (diff != params->diff) { if (diff != params->diff) {
/* /*
* We'll grudgingly accept a too-easy puzzle, but we must * If the puzzle was insoluble at this difficulty level (i.e.
* _not_ permit a too-hard one (one which the solver * too hard), _or_ soluble at a lower level (too easy), go
* couldn't handle at all). * round again.
*
* An exception is in soak-testing mode, where we return the
* first puzzle we got regardless.
*/ */
if (diff > params->diff || #ifdef STANDALONE_SOLVER
ntries < MAXTRIES) goto generate; if (!one_try)
#endif
goto generate;
} }
#ifdef STANDALONE_PICTURE_GENERATOR #ifdef STANDALONE_PICTURE_GENERATOR
@ -4146,7 +4147,7 @@ static void soak(game_params *p, random_state *rs)
#endif #endif
tt_start = tt_now = time(NULL); tt_start = tt_now = time(NULL);
for (i = 0; i < DIFF_MAX; i++) diffs[i] = 0; for (i = 0; i < DIFF_MAX; i++) diffs[i] = 0;
maxtries = 1; one_try = true;
printf("Soak-generating a %dx%d grid, max. diff %s.\n", printf("Soak-generating a %dx%d grid, max. diff %s.\n",
p->w, p->h, galaxies_diffnames[p->diff]); p->w, p->h, galaxies_diffnames[p->diff]);
@ -4212,8 +4213,6 @@ int main(int argc, char **argv)
} }
} }
maxtries = 50;
p = default_params(); p = default_params();
rs = random_new((void*)&seed, sizeof(time_t)); rs = random_new((void*)&seed, sizeof(time_t));