put disk (not functional)
authorLaurent Mazet <mazet@softndesign.org>
Wed, 18 Sep 2024 22:28:46 +0000 (00:28 +0200)
committerLaurent Mazet <mazet@softndesign.org>
Wed, 18 Sep 2024 22:28:46 +0000 (00:28 +0200)
constant.c
function.c
function.h
reversi.c

index 8b5229d4340c80f450055314e25fc6ae0ca470cd..129865d88fef1b64c42374f90cd695cf0a831b80 100644 (file)
@@ -29,8 +29,12 @@ board_t *getboard (char *name)
         board = initboard (10, 10);
     } else if (strcmp (name, "12x12") == 0) {
         board = initboard (12, 12);
+    } else if (strcmp (name, "14x14") == 0) {
+        board = initboard (14, 14);
+    } else if (strcmp (name, "16x16") == 0) {
+        board = initboard (16, 16);
     } else if (strcmp (name, "list") == 0) {
-        printf ("board: 6x6 8x8 10x10 12x12\n");
+        printf ("board: 6x6 8x8 10x10 12x12 14x14 16x16\n");
         board = (board_t *)(-1);
     }
 
index 4b3c1ff05cd2b32112a3aace6e8e7b76385667ab..c6c3448e04f053bdc44d6f9f9c280aeb3cf58162 100644 (file)
@@ -196,4 +196,75 @@ board_t *loadboard (char *str)
     return board;
 }
 
+int _evaldir (int dir, int a)
+{
+    int dx = 0;
+    int dy = 0;
+    switch (dir) {
+    case 0:
+        dx = 1;
+        break;
+    case 1:
+        dx = dy = 1;
+        break;
+    case 2:
+        dy = 1;
+        break;
+    case 3:
+        dx = -1;
+        dy = 1;
+        break;
+    case 4:
+        dx = -1;
+        break;
+    case 5:
+        dx = dy = -1;
+        break;
+    case 6:
+        dy = -1;
+        break;
+    case 7:
+        dx = 1;
+        dy = -1;
+        break;
+    }
+
+    return (a) ? dy : dx;
+}
+
+int _checklines (board_t *board, int x, int y, int id)
+{
+    int ret = 0;
+    int dir;
+
+    for (dir = 0; dir < 8; 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) &&
+               (*getcell (board, x + n * dx, y + n * dy) == '0' + (id ? 0 : 1))) {
+            n++;
+            *getcell (board, x + n * dx, y + n * dy) = '0' + id;
+            ret = 1;
+        }
+    }
+
+    return ret;
+}
+
+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;
+        }
+    }
+    return ret;
+}
+
 /* vim: set ts=4 sw=4 et: */
index 0483576b94d172714feb75465b45eacd3558671a..7a94cf76d85dd613ab42d5f72beeed031535d2af 100644 (file)
@@ -39,6 +39,8 @@ char *atos (char *str);
 
 board_t *loadboard (char *str);
 
+int putdisk (board_t *board, int x, int y, int id);
+
 #endif /* __FUNCTION_H__ */
 
 /* vim: set ts=4 sw=4 et: */
index 3afe321159bcbb34d2dcae74b30b9f541bdd4432..fdbe5b8c3a500d3f86c804832527fa3fd472543d 100644 (file)
--- a/reversi.c
+++ b/reversi.c
@@ -20,7 +20,7 @@ char *version = "0.1";
 
 char *filename = NULL;
 int scale = 1;
-char *boardname = "8x8";
+char *boardname = "12x12";
 
 char *help =
     "<i> Move up cursor\n"
@@ -205,8 +205,9 @@ int main (int argc, char *argv[])
 
         /* game controls */
         switch (ch) {
-        case '\n':
-        case '\r':
+        case KEY_BACKSPACE:
+        case KEY_DELETE:
+        case 127:
         case ' ':
             id = (id == 0) ? 1 : 0;
             break;
@@ -234,6 +235,13 @@ int main (int argc, char *argv[])
                 xcursor++;
             }
             break;
+        case '\n':
+        case '\r':
+        case 'o':
+            if (putdisk (board, xcursor, ycursor, id)) {
+                id = (id == 0) ? 1 : 0;
+            }
+            break;
         }
 
     }