aboutsummaryrefslogtreecommitdiff
path: root/loopgen.h
diff options
context:
space:
mode:
authorSimon Tatham <anakin@pobox.com>2012-01-22 14:14:26 +0000
committerSimon Tatham <anakin@pobox.com>2012-01-22 14:14:26 +0000
commitb16eece9fc502afb9dfb0aca9fd7bfba2239d3e3 (patch)
treeda546ca795efe17585032a75898390da83be3022 /loopgen.h
parentb2d7429d539238258ca6f9061da5a25a0835f2a9 (diff)
downloadpuzzles-b16eece9fc502afb9dfb0aca9fd7bfba2239d3e3.zip
puzzles-b16eece9fc502afb9dfb0aca9fd7bfba2239d3e3.tar.gz
puzzles-b16eece9fc502afb9dfb0aca9fd7bfba2239d3e3.tar.bz2
puzzles-b16eece9fc502afb9dfb0aca9fd7bfba2239d3e3.tar.xz
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]
Diffstat (limited to 'loopgen.h')
-rw-r--r--loopgen.h35
1 files changed, 35 insertions, 0 deletions
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