diff options
| author | Simon Tatham <anakin@pobox.com> | 2008-04-08 10:30:18 +0000 |
|---|---|---|
| committer | Simon Tatham <anakin@pobox.com> | 2008-04-08 10:30:18 +0000 |
| commit | ea13d39a1780406421d2e9aa01c4caeca100c9eb (patch) | |
| tree | 4784bbafc14087faa64ef7048da6193f85f69210 /solo.c | |
| parent | c8a843ee62e2a4a984a39aecd65865d7e9ab189d (diff) | |
| download | puzzles-ea13d39a1780406421d2e9aa01c4caeca100c9eb.zip puzzles-ea13d39a1780406421d2e9aa01c4caeca100c9eb.tar.gz puzzles-ea13d39a1780406421d2e9aa01c4caeca100c9eb.tar.bz2 puzzles-ea13d39a1780406421d2e9aa01c4caeca100c9eb.tar.xz | |
Having got Jigsaw mode generation working at reasonable speed, we
can now productise it.
[originally from svn r7979]
Diffstat (limited to 'solo.c')
| -rw-r--r-- | solo.c | 62 |
1 files changed, 27 insertions, 35 deletions
@@ -3,26 +3,6 @@ * * TODO: * - * - Jigsaw Sudoku is currently an undocumented feature enabled - * by setting r (`Rows of sub-blocks' in the GUI configurer) to - * 1. The reason it's undocumented is because they're rather - * erratic to generate, because gridgen tends to hang up for - * ages. I think this is because some jigsaw block layouts - * simply do not admit very many valid filled grids (and - * perhaps some have none at all). - * + To fix this, I think probably the solution is a change in - * grid generation policy: gridgen needs to have less of an - * all-or-nothing attitude and instead make only a limited - * amount of effort to construct a filled grid before giving - * up and trying a new layout. (Come to think of it, this - * same change might also make 5x5 standard Sudoku more - * practical to generate, if correctly tuned.) - * + If I get this fixed, other work needed on jigsaw mode is: - * * introduce a GUI config checkbox. game_configure() - * ticks this box iff r==1; if it's ticked in a call to - * custom_params(), we replace (c, r) with (c*r, 1). - * * document it. - * * - reports from users are that `Trivial'-mode puzzles are still * rather hard compared to newspapers' easy ones, so some better * low-end difficulty grading would be nice @@ -258,6 +238,9 @@ static int game_fetch_preset(int i, char **name, game_params **params) { "3x3 Advanced X", { 3, 3, SYMM_ROT2, DIFF_SET, TRUE } }, { "3x3 Extreme", { 3, 3, SYMM_ROT2, DIFF_EXTREME, FALSE } }, { "3x3 Unreasonable", { 3, 3, SYMM_ROT2, DIFF_RECURSIVE, FALSE } }, + { "9 Jigsaw Basic", { 9, 1, SYMM_ROT2, DIFF_SIMPLE, FALSE } }, + { "9 Jigsaw Basic X", { 9, 1, SYMM_ROT2, DIFF_SIMPLE, TRUE } }, + { "9 Jigsaw Advanced", { 9, 1, SYMM_ROT2, DIFF_SET, FALSE } }, #ifndef SLOW_SYSTEM { "3x4 Basic", { 3, 4, SYMM_ROT2, DIFF_SIMPLE, FALSE } }, { "4x4 Basic", { 4, 4, SYMM_ROT2, DIFF_SIMPLE, FALSE } }, @@ -376,7 +359,7 @@ static config_item *game_configure(game_params *params) config_item *ret; char buf[80]; - ret = snewn(6, config_item); + ret = snewn(7, config_item); ret[0].name = "Columns of sub-blocks"; ret[0].type = C_STRING; @@ -395,22 +378,27 @@ static config_item *game_configure(game_params *params) ret[2].sval = NULL; ret[2].ival = params->xtype; - ret[3].name = "Symmetry"; - ret[3].type = C_CHOICES; - ret[3].sval = ":None:2-way rotation:4-way rotation:2-way mirror:" + ret[3].name = "Jigsaw (irregularly shaped sub-blocks)"; + ret[3].type = C_BOOLEAN; + ret[3].sval = NULL; + ret[3].ival = (params->r == 1); + + ret[4].name = "Symmetry"; + ret[4].type = C_CHOICES; + ret[4].sval = ":None:2-way rotation:4-way rotation:2-way mirror:" "2-way diagonal mirror:4-way mirror:4-way diagonal mirror:" "8-way mirror"; - ret[3].ival = params->symm; + ret[4].ival = params->symm; - ret[4].name = "Difficulty"; - ret[4].type = C_CHOICES; - ret[4].sval = ":Trivial:Basic:Intermediate:Advanced:Extreme:Unreasonable"; - ret[4].ival = params->diff; + ret[5].name = "Difficulty"; + ret[5].type = C_CHOICES; + ret[5].sval = ":Trivial:Basic:Intermediate:Advanced:Extreme:Unreasonable"; + ret[5].ival = params->diff; - ret[5].name = NULL; - ret[5].type = C_END; - ret[5].sval = NULL; - ret[5].ival = 0; + ret[6].name = NULL; + ret[6].type = C_END; + ret[6].sval = NULL; + ret[6].ival = 0; return ret; } @@ -422,8 +410,12 @@ static game_params *custom_params(config_item *cfg) ret->c = atoi(cfg[0].sval); ret->r = atoi(cfg[1].sval); ret->xtype = cfg[2].ival; - ret->symm = cfg[3].ival; - ret->diff = cfg[4].ival; + if (cfg[3].ival) { + ret->c *= ret->r; + ret->r = 1; + } + ret->symm = cfg[4].ival; + ret->diff = cfg[5].ival; return ret; } |