code refactoring
authorLaurent Mazet <mazet@softndesign.org>
Wed, 5 Mar 2025 06:31:12 +0000 (07:31 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Wed, 5 Mar 2025 06:31:12 +0000 (07:31 +0100)
function.c
function.h
sudoku.c

index 4d8769a4d04e9bcf84cd9c2e60175d454221605a..54583fd286c5eea3e72a891aec3cdb1a6f3d8b6b 100644 (file)
@@ -71,15 +71,65 @@ char _itoh (int x)
     return h;
 }
 
-board_t *initplay (board_t *board)
+board_t *_lookforforbidenposition (board_t *board, board_t *box, int i, char val)
 {
+    int j;
     int n = sqrti (board->length);
 
-    /* k is value */
+    for (j = 0; j < board->length; j++) {
+
+        /* box check */
+        if (getvalue (board, n * (i % n) + j % n, n * (i / n) + j / n) != ' ') {
+            *getcell (box, j % n, j / n) = '#';
+        }
+
+        /* verical check */
+        if ((j / n == i / n) && (j % n != i % n)) {
+            int l;
+            for (l = 0; l < board->length; l++) {
+                if (getvalue (board, n * (j % n) + l % n, n * (j / n) + l / n) == val) {
+                    int t;
+                    for (t = 0; t < n; t++) {
+                        *getcell (box, t, l / n) = '#';
+                    }
+                }
+            }
+        }
+
+        /* horizontal check */
+        if ((j / n != i / n) && (j % n == i % n)) {
+            int l;
+            for (l = 0; l < board->length; l++) {
+                if (getvalue (board, n * (j % n) + l % n, n * (j / n) + l / n) == val) {
+                    int t;
+                    for (t = 0; t < n; t++) {
+                        *getcell (box, l % n, t) = '#';
+                    }
+                }
+            }
+        }
+
+    }
+
+    return box;
+}
+
+board_t *initplay (board_t *board, int nb_known_tiles)
+{
     int k;
+    int n = sqrti (board->length);
+
+    /* init boxes */
+    board_t **vboxes = (board_t **) calloc (sizeof (board_t *), board->length);
+    CHECKALLOC (vboxes);
     for (k = 0; k < board->length; k++) {
+        vboxes[k] = initboard (n);
+    }
+
+    /* k is value */
+    for (k = 0; k < nb_known_tiles; k++) {
         char val = _itoh (1 + k);
-        board_t *vbox = initboard (n);
+        board_t *vbox = vboxes[k];
 
         /* i in position */
         int i;
@@ -87,42 +137,7 @@ board_t *initplay (board_t *board)
             int j;
 
             /* look for forbiden position */
-            board_t *box = copyboard (vbox);
-
-            for (j = 0; j < board->length; j++) {
-
-                /* box check */
-                if (getvalue (board, n * (i % n) + j % n, n * (i / n) + j / n) != ' ') {
-                    *getcell (box, j % n, j / n) = '#';
-                }
-
-                /* verical check */
-                if ((j / n == i / n) && (j % n != i % n)) {
-                    int l;
-                    for (l = 0; l < board->length; l++) {
-                        if (getvalue (board, n * (j % n) + l % n, n * (j / n) + l / n) == val) {
-                            int t;
-                            for (t = 0; t < n; t++) {
-                                *getcell (box, t, l / n) = '#';
-                            }
-                        }
-                    }
-                }
-
-                /* horizontal check */
-                if ((j / n != i / n) && (j % n == i % n)) {
-                    int l;
-                    for (l = 0; l < board->length; l++) {
-                        if (getvalue (board, n * (j % n) + l % n, n * (j / n) + l / n) == val) {
-                            int t;
-                            for (t = 0; t < n; t++) {
-                                *getcell (box, l % n, t) = '#';
-                            }
-                        }
-                    }
-                }
-
-            }
+            board_t *box = _lookforforbidenposition (board, copyboard (vbox), i, val);
 
             /* count avaliable position */
             int pos = 0;
@@ -156,9 +171,13 @@ board_t *initplay (board_t *board)
             freeboard (box);
         }
 
-        freeboard (vbox);
     }
 
+    for (k = 0; k < board->length; k++) {
+        freeboard (vboxes[k]);
+    }
+    free (vboxes);
+
     return board;
 }
 
index a1a7fc6821cbefcb30e394268d33092b83b529ce..55d88e08fd3889799daa4efc6f91b76a9bb61ed1 100644 (file)
@@ -25,7 +25,7 @@ board_t *initboard (int length);
 
 board_t *copyboard (board_t *board);
 
-board_t *initplay (board_t *board);
+board_t *initplay (board_t *board, int nb_known_tiles);
 
 void freeboard (board_t *board);
 
index 811770c377da92039bdb5e57c62f8eafa6936125..3b14783567f34f0d29fd1cec81e8e6c06160b316 100644 (file)
--- a/sudoku.c
+++ b/sudoku.c
@@ -101,7 +101,7 @@ int main (int argc, char *argv[])
     /* init board */
     srand (seed);
     board_t *board = initboard (length * length);
-    initplay (board);
+    initplay (board, length * length);
 
     /* init curses */
     initscr ();