From acc17f19b39411e4a23817cd70a546b8ef87c73a Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Thu, 19 Sep 2024 19:31:55 +0200 Subject: [PATCH] refactor code --- function.c | 84 ++++++++++++++++++++++++++---------------------------- 1 file changed, 41 insertions(+), 43 deletions(-) diff --git a/function.c b/function.c index 63c6fcf..ca43ba2 100644 --- a/function.c +++ b/function.c @@ -232,60 +232,58 @@ int _evaldir (int dir, int a) return (a) ? dy : dx; } -int _checklines (board_t *board, int x, int y, int id) +int _checkline (board_t *board, int x, int y, int id, int dir) { int ret = 0; - int dir; - - for (dir = 0; dir < 8; dir++) { - int dx = _evaldir (dir, 0); - int dy = _evaldir (dir, 1); - - int n = 1; - int line = 0; - VERBOSE (DEBUG, printf ("dx: %d dy: %d ", dx, dy)); - while ((x + n * dx >= 0) && (x + n * dx < board->width) && - (y + n * dy >= 0) && (y + n * dy < board->height)) { - char *cell = getcell (board, x + n * dx, y + n * dy); - VERBOSE (DEBUG, printf ("cell: 0x%02x (%c) ", *cell, *cell)); - if (*cell == (id ? '0' : '1')) { - n++; - } else if (*cell == '0' + id) { - line = n - 1; - break; - } else { - break; - } + int dx = _evaldir (dir, 0); + int dy = _evaldir (dir, 1); + + int n = 1; + while ((x + n * dx >= 0) && (x + n * dx < board->width) && + (y + n * dy >= 0) && (y + n * dy < board->height)) { + char *cell = getcell (board, x + n * dx, y + n * dy); + if (*cell == (id ? '0' : '1')) { + n++; + } else if (*cell == '0' + id) { + ret = (n > 1); + break; + } else { + break; } - if (line) { - VERBOSE (DEBUG, printf ("n: %d", n)); - n = 1; - while ((x + n * dx >= 0) && (x + n * dx < board->width) && - (y + n * dy >= 0) && (y + n * dy < board->height)) { - char *cell = getcell (board, x + n * dx, y + n * dy); - if (*cell == (id ? '0' : '1')) { - n++; - *cell = '0' + id; - } else { - break; - } - } - ret = 1; + } + return ret; +} + +void _switchdisks (board_t *board, int x, int y, int id, int dir) +{ + int dx = _evaldir (dir, 0); + int dy = _evaldir (dir, 1); + + int n = 1; + while ((x + n * dx >= 0) && (x + n * dx < board->width) && + (y + n * dy >= 0) && (y + n * dy < board->height)) { + char *cell = getcell (board, x + n * dx, y + n * dy); + if (*cell == (id ? '0' : '1')) { + n++; + *cell = '0' + id; + } else { + break; } - VERBOSE (DEBUG, printf ("\n")); } - return ret; + *getcell (board, x, y) = '0' + id; } int putdisk (board_t *board, int x, int y, int id) { int ret = 0; - char *cell = getcell (board, x, y); - if (*cell == ' ') { - if (_checklines (board, x, y, id)) { - *cell = '0' + id; - ret = 1; + if (*getcell (board, x, y) == ' ') { + int dir; + for (dir = 0; dir < 8; dir++) { + if (_checkline (board, x, y, id, dir)) { + _switchdisks (board, x, y, id, dir); + ret = 1; + } } } return ret; -- 2.30.2