From: Laurent Mazet Date: Wed, 5 Mar 2025 06:31:12 +0000 (+0100) Subject: code refactoring X-Git-Url: https://secure.softndesign.org/git/?a=commitdiff_plain;h=9f00076ee1bd6df05e0f9cda78191e083ee0e0cc;p=sudoku.git code refactoring --- diff --git a/function.c b/function.c index 4d8769a..54583fd 100644 --- a/function.c +++ b/function.c @@ -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; } diff --git a/function.h b/function.h index a1a7fc6..55d88e0 100644 --- a/function.h +++ b/function.h @@ -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); diff --git a/sudoku.c b/sudoku.c index 811770c..3b14783 100644 --- 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 ();