refactor code
authorLaurent Mazet <mazet@softndesign.org>
Thu, 19 Sep 2024 17:31:55 +0000 (19:31 +0200)
committerLaurent Mazet <mazet@softndesign.org>
Thu, 19 Sep 2024 17:31:55 +0000 (19:31 +0200)
function.c

index 63c6fcf150dd9f4391a19ed64ca8f2c19d065c5c..ca43ba22f789e524b14e09fa12b8d2309f1f28ca 100644 (file)
@@ -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;