mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-21 08:01:30 -07:00
Adjust Keen's grid generation to constrain the maximum size of clue
blocks, because 'make test' showed up very large blocks as an occasional slowdown factor in game generation (takes too long to iterate over all possibilities). This is a good idea in any case, because really big multiplicative clue numbers have trouble fitting in the square. [originally from svn r9827]
This commit is contained in:
26
keen.c
26
keen.c
@ -42,6 +42,14 @@ static char const keen_diffchars[] = DIFFLIST(ENCODE);
|
|||||||
#define CMASK 0x60000000L
|
#define CMASK 0x60000000L
|
||||||
#define CUNIT 0x20000000L
|
#define CUNIT 0x20000000L
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Maximum size of any clue block. Very large ones are annoying in UI
|
||||||
|
* terms (if they're multiplicative you end up with too many digits to
|
||||||
|
* fit in the square) and also in solver terms (too many possibilities
|
||||||
|
* to iterate over).
|
||||||
|
*/
|
||||||
|
#define MAXBLK 6
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
COL_BACKGROUND,
|
COL_BACKGROUND,
|
||||||
COL_GRID,
|
COL_GRID,
|
||||||
@ -847,26 +855,34 @@ done
|
|||||||
x = i % w;
|
x = i % w;
|
||||||
y = i / w;
|
y = i / w;
|
||||||
|
|
||||||
if (x > 0 &&
|
if (x > 0 && dsf_size(dsf, i-1) < MAXBLK &&
|
||||||
(best == -1 || revorder[i-1] < revorder[best]))
|
(best == -1 || revorder[i-1] < revorder[best]))
|
||||||
best = i-1;
|
best = i-1;
|
||||||
if (x+1 < w &&
|
if (x+1 < w && dsf_size(dsf, i+1) < MAXBLK &&
|
||||||
(best == -1 || revorder[i+1] < revorder[best]))
|
(best == -1 || revorder[i+1] < revorder[best]))
|
||||||
best = i+1;
|
best = i+1;
|
||||||
if (y > 0 &&
|
if (y > 0 && dsf_size(dsf, i-w) < MAXBLK &&
|
||||||
(best == -1 || revorder[i-w] < revorder[best]))
|
(best == -1 || revorder[i-w] < revorder[best]))
|
||||||
best = i-w;
|
best = i-w;
|
||||||
if (y+1 < w &&
|
if (y+1 < w && dsf_size(dsf, i+w) < MAXBLK &&
|
||||||
(best == -1 || revorder[i+w] < revorder[best]))
|
(best == -1 || revorder[i+w] < revorder[best]))
|
||||||
best = i+w;
|
best = i+w;
|
||||||
|
|
||||||
if (best >= 0) {
|
if (best >= 0) {
|
||||||
singletons[i] = FALSE;
|
singletons[i] = singletons[best] = FALSE;
|
||||||
dsf_merge(dsf, i, best);
|
dsf_merge(dsf, i, best);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Quit and start again if we have any singletons left over
|
||||||
|
* which we weren't able to do anything at all with. */
|
||||||
|
for (i = 0; i < a; i++)
|
||||||
|
if (singletons[i])
|
||||||
|
break;
|
||||||
|
if (i < a)
|
||||||
|
continue;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Decide what would be acceptable clues for each block.
|
* Decide what would be acceptable clues for each block.
|
||||||
*
|
*
|
||||||
|
Reference in New Issue
Block a user