From b16eece9fc502afb9dfb0aca9fd7bfba2239d3e3 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Sun, 22 Jan 2012 14:14:26 +0000 Subject: New puzzle! Or rather, new-ish, because this one has been lying around in the 'unfinished' directory for a while, and has now been finished up thanks to James Harvey putting in some effort and galvanising me to put in the rest. This is 'Pearl', an implementation of Nikoli's 'Masyu'. The code in Loopy that generates a random loop along grid edges to use as the puzzle solution has been abstracted out into loopgen.[ch] so that Pearl can use it for its puzzle solutions too. I've also introduced a new utility module called 'tdq' (for 'to-do queue'). [originally from svn r9379] --- loopgen.h | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 loopgen.h (limited to 'loopgen.h') diff --git a/loopgen.h b/loopgen.h new file mode 100644 index 0000000..079c87c --- /dev/null +++ b/loopgen.h @@ -0,0 +1,35 @@ +/* + * loopgen.h: interface file for loop generation functions for grid.[ch]. + */ + +#ifndef _LOOPGEN_H +#define _LOOPGEN_H + +#include "puzzles.h" +#include "grid.h" + +enum face_colour { FACE_WHITE, FACE_GREY, FACE_BLACK }; + +/* face should be of type grid_face* here. */ +#define FACE_COLOUR(face) \ + ( (face) == NULL ? FACE_BLACK : \ + board[(face) - g->faces] ) + +typedef int (*loopgen_bias_fn_t)(void *ctx, char *board, int face); + +/* 'board' should be a char array whose length is the same as + * g->num_faces: this will be filled in with FACE_WHITE or FACE_BLACK + * after loop generation. + * + * If 'bias' is non-null, it should be a user-provided function which + * rates a half-finished board (i.e. may include some FACE_GREYs) for + * desirability; this will cause the loop generator to bias in favour + * of loops with a high return value from that function. The 'face' + * parameter to the bias function indicates which face of the grid has + * been modified since the last call; it is guaranteed that only one + * will have been (so that bias functions can work incrementally + * rather than re-scanning the whole grid on every call). */ +extern void generate_loop(grid *g, char *board, random_state *rs, + loopgen_bias_fn_t bias, void *biasctx); + +#endif -- cgit v1.1