chiark / gitweb /
Forbid undo of new-game if it would change the params.
[sgt-puzzles.git] / pattern.c
index 9a74e553186bb1b35c3f3f5ac476107423879c08..e5f958abb817a600f10b1f9985ca2fd095380b7c 100644 (file)
--- a/pattern.c
+++ b/pattern.c
@@ -308,7 +308,18 @@ static void generate(random_state *rs, int w, int h, unsigned char *retgrid)
     fgrid2 = snewn(w*h, float);
     memcpy(fgrid2, fgrid, w*h*sizeof(float));
     qsort(fgrid2, w*h, sizeof(float), float_compare);
-    threshold = fgrid2[w*h/2];
+    /* Choose a threshold that makes half the pixels black. In case of
+     * an odd number of pixels, select randomly between just under and
+     * just over half. */
+    {
+        int index = w * h / 2;
+        if (w & h & 1)
+            index += random_upto(rs, 2);
+        if (index < w*h)
+            threshold = fgrid2[index];
+        else
+            threshold = fgrid2[w*h-1] + 1;
+    }
     sfree(fgrid2);
 
     for (i = 0; i < h; i++) {
@@ -446,6 +457,8 @@ static int do_row(unsigned char *known, unsigned char *deduced,
 
     if (rowlen == 0) {
         memset(deduced, DOT, len);
+    } else if (rowlen == 1 && data[0] == len) {
+        memset(deduced, BLOCK, len);
     } else {
         do_recurse(known, deduced, row, minpos_done, maxpos_done, minpos_ok,
                    maxpos_ok, data, len, freespace, 0, 0);