#define DOT 2
#define STILL_UNKNOWN 3
+#ifdef STANDALONE_SOLVER
+int verbose = FALSE;
+#endif
+
static void do_recurse(unsigned char *known, unsigned char *deduced,
unsigned char *row, int *data, int len,
int freespace, int ndone, int lowest)
static int do_row(unsigned char *known, unsigned char *deduced,
unsigned char *row,
- unsigned char *start, int len, int step, int *data)
+ unsigned char *start, int len, int step, int *data
+#ifdef STANDALONE_SOLVER
+ , const char *rowcol, int index, int cluewid
+#endif
+ )
{
int rowlen, i, freespace, done_any;
start[i*step] = deduced[i];
done_any = TRUE;
}
+#ifdef STANDALONE_SOLVER
+ if (verbose && done_any) {
+ char buf[80];
+ int thiscluewid;
+ printf("%s %2d: [", rowcol, index);
+ for (thiscluewid = -1, i = 0; data[i]; i++)
+ thiscluewid += sprintf(buf, " %d", data[i]);
+ printf("%*s", cluewid - thiscluewid, "");
+ for (i = 0; data[i]; i++)
+ printf(" %d", data[i]);
+ printf(" ] ");
+ for (i = 0; i < len; i++)
+ putchar(known[i] == BLOCK ? '#' :
+ known[i] == DOT ? '.' : '?');
+ printf(" -> ");
+ for (i = 0; i < len; i++)
+ putchar(start[i*step] == BLOCK ? '#' :
+ start[i*step] == DOT ? '.' : '?');
+ putchar('\n');
+ }
+#endif
return done_any;
}
for (i=0; i<h; i++) {
rowdata[compute_rowdata(rowdata, grid+i*w, w, 1)] = 0;
done_any |= do_row(workspace, workspace+max, workspace+2*max,
- matrix+i*w, w, 1, rowdata);
+ matrix+i*w, w, 1, rowdata
+#ifdef STANDALONE_SOLVER
+ , NULL, 0, 0 /* never do diagnostics here */
+#endif
+ );
}
for (i=0; i<w; i++) {
rowdata[compute_rowdata(rowdata, grid+i, h, w)] = 0;
done_any |= do_row(workspace, workspace+max, workspace+2*max,
- matrix+i, h, w, rowdata);
+ matrix+i, h, w, rowdata
+#ifdef STANDALONE_SOLVER
+ , NULL, 0, 0 /* never do diagnostics here */
+#endif
+ );
}
} while (done_any);
max*sizeof(int));
rowdata[state->rowlen[w+i]] = 0;
done_any |= do_row(workspace, workspace+max, workspace+2*max,
- matrix+i*w, w, 1, rowdata);
+ matrix+i*w, w, 1, rowdata
+#ifdef STANDALONE_SOLVER
+ , NULL, 0, 0 /* never do diagnostics here */
+#endif
+ );
}
for (i=0; i<w; i++) {
memcpy(rowdata, state->rowdata + state->rowsize*i, max*sizeof(int));
rowdata[state->rowlen[i]] = 0;
done_any |= do_row(workspace, workspace+max, workspace+2*max,
- matrix+i, h, w, rowdata);
+ matrix+i, h, w, rowdata
+#ifdef STANDALONE_SOLVER
+ , NULL, 0, 0 /* never do diagnostics here */
+#endif
+ );
}
} while (done_any);
ui->drag = LEFT_DRAG;
ui->release = LEFT_RELEASE;
#ifdef STYLUS_BASED
- ui->state = currstate == GRID_FULL ? GRID_UNKNOWN : GRID_FULL;
+ ui->state = (currstate + 2) % 3; /* FULL -> EMPTY -> UNKNOWN */
#else
ui->state = GRID_FULL;
#endif
ui->drag = RIGHT_DRAG;
ui->release = RIGHT_RELEASE;
#ifdef STYLUS_BASED
- ui->state = currstate == GRID_EMPTY ? GRID_UNKNOWN : GRID_EMPTY;
+ ui->state = (currstate + 1) % 3; /* EMPTY -> FULL -> UNKNOWN */
#else
ui->state = GRID_EMPTY;
#endif
return 0.0F;
}
+static int game_status(game_state *state)
+{
+ return state->completed ? +1 : 0;
+}
+
static int game_timing_state(game_state *state, game_ui *ui)
{
return TRUE;
game_redraw,
game_anim_length,
game_flash_length,
+ game_status,
TRUE, FALSE, game_print_size, game_print,
FALSE, /* wants_statusbar */
FALSE, game_timing_state,
while (--argc > 0) {
char *p = *++argv;
if (*p == '-') {
- fprintf(stderr, "%s: unrecognised option `%s'\n", argv[0], p);
- return 1;
+ if (!strcmp(p, "-v")) {
+ verbose = TRUE;
+ } else {
+ fprintf(stderr, "%s: unrecognised option `%s'\n", argv[0], p);
+ return 1;
+ }
} else {
id = p;
}
s = new_game(NULL, p, desc);
{
- int w = p->w, h = p->h, i, j, done_any, max;
+ int w = p->w, h = p->h, i, j, done_any, max, cluewid = 0;
unsigned char *matrix, *workspace;
int *rowdata;
memset(matrix, 0, w*h);
+ if (verbose) {
+ int thiswid;
+ /*
+ * Work out the maximum text width of the clue numbers
+ * in a row or column, so we can print the solver's
+ * working in a nicely lined up way.
+ */
+ for (i = 0; i < (w+h); i++) {
+ char buf[80];
+ for (thiswid = -1, j = 0; j < s->rowlen[i]; j++)
+ thiswid += sprintf(buf, " %d", s->rowdata[s->rowsize*i+j]);
+ if (cluewid < thiswid)
+ cluewid = thiswid;
+ }
+ }
+
do {
done_any = 0;
for (i=0; i<h; i++) {
max*sizeof(int));
rowdata[s->rowlen[w+i]] = 0;
done_any |= do_row(workspace, workspace+max, workspace+2*max,
- matrix+i*w, w, 1, rowdata);
+ matrix+i*w, w, 1, rowdata
+#ifdef STANDALONE_SOLVER
+ , "row", i+1, cluewid
+#endif
+ );
}
for (i=0; i<w; i++) {
memcpy(rowdata, s->rowdata + s->rowsize*i, max*sizeof(int));
rowdata[s->rowlen[i]] = 0;
done_any |= do_row(workspace, workspace+max, workspace+2*max,
- matrix+i, h, w, rowdata);
+ matrix+i, h, w, rowdata
+#ifdef STANDALONE_SOLVER
+ , "col", i+1, cluewid
+#endif
+ );
}
} while (done_any);