next generation computation
authorLaurent MAZET <laurent.mazet@thalesgroup.com>
Fri, 21 Jun 2024 14:03:42 +0000 (16:03 +0200)
committerLaurent MAZET <laurent.mazet@thalesgroup.com>
Fri, 21 Jun 2024 14:03:42 +0000 (16:03 +0200)
display.c
function.c
function.h
gameoflife.c

index ed898b6965b99fcaafa97d9465ef577a3f722970..36eb132ecb1cb4665bc17b203d0a3d5d2fb01f02 100644 (file)
--- a/display.c
+++ b/display.c
@@ -107,11 +107,28 @@ void boardwindow (board_t *board, int xoffset, int yoffset, int bound)
 
     for (i = 0; i < board->xsize; i++) {
         for (j = 0; j < board->ysize; j++) {
-            if (board->tab[i + board->xsize * j] != ' ') {
+            char cell = *getcell (board, i, j);
+            switch (cell) {
+            case '1':
+                set_color (yellow);
+                break;
+            case 'N':
+                set_color (green);
+                break;
+            case 'O':
+                set_color (red);
+                break;
+            case 'X':
                 set_color (black);
-                mvaddch (yoffset + j, xoffset + i, ' ');
+                break;
+            case ' ':
                 set_color (white);
+                break;
+            default:
+                VERBOSE (WARNING, printf ("unknown code '%c'\n", cell));
             }
+            mvaddch (yoffset + j, xoffset + i, ' ');
+            set_color (white);
         }
     }
 }
index 0c9923b70be69c2ce5df7b40cad7d3a543c3acd7..7155af7a564548257304daa3d2ea4160115e21b6 100644 (file)
@@ -152,7 +152,7 @@ board_t *loadboard (char *str)
     board_t *board = NULL;
     if ((tab) && (strlen (tab) == (size_t)(xsize * ysize))) {
         board = initboard (xsize, ysize);
-        strcpy (board->tab, tab); 
+        strcpy (board->tab, tab);
     } else if (xsize * ysize > 0) {
         board = initboard (xsize, ysize);
     }
@@ -160,4 +160,64 @@ board_t *loadboard (char *str)
     return board;
 }
 
+char *getcell (board_t *board, int x, int y)
+{
+    return board->tab + x + board->xsize * y;
+}
+
+int getnbneighbours (board_t *board, int x, int y)
+{
+    int xp = (x + board->xsize - 1) % board->xsize;
+    int xn = (x + 1) % board->xsize;
+    int yp = (y + board->ysize - 1) % board->ysize;
+    int yn = (y + 1) % board->ysize;
+
+    int nb = (*getcell (board, xp, yp) != ' ');
+    nb += (*getcell (board, x, yp) != ' ');
+    nb += (*getcell (board, xn, yp) != ' ');
+    nb += (*getcell (board, xp, y) != ' ');
+    nb += (*getcell (board, xn, y) != ' ');
+    nb += (*getcell (board, xp, yn) != ' ');
+    nb += (*getcell (board, x, yn) != ' ');
+    nb += (*getcell (board, xn, yn) != ' ');
+
+    return nb;
+}
+
+void computenextgen (board_t *board)
+{
+    int i, j;
+    board_t *nextboard = initboard (board->xsize, board->ysize);
+
+    for (i = 0; i < board->xsize; i++) {
+        for (j = 0; j < board->ysize; j++) {
+            int n = getnbneighbours (board, i, j);
+            if (*getcell (board, i, j) == ' ') {
+                if ((n >= 3) && (n <= 3)) {
+                    *getcell (nextboard, i, j) = 'N';
+                }
+            } else {
+                if ((n >= 2) && (n <= 3)) {
+                    *getcell (nextboard, i, j) = 'X';
+                }
+            }
+        }
+    }
+
+    for (i = 0; i < nextboard->xsize; i++) {
+        for (j = 0; j < nextboard->ysize; j++) {
+            char *cell = getcell (nextboard, i, j);
+            if (*cell != ' ') {
+                int n = getnbneighbours (nextboard, i, j);
+                if ((n < 2) || (n > 3)) {
+                    *cell = (*cell == 'X') ? 'O' : '1'; // for 'N'
+                }
+            }
+        }
+    }
+
+    strcpy (board->tab, nextboard->tab);
+    freeboard (nextboard);
+}
+
 /* vim: set ts=4 sw=4 et: */
index fc5101a51fe797911bc8b2a464eaac4143e89805..4aab6998c5f32244250980e42e41d7166b23169f 100644 (file)
@@ -27,6 +27,10 @@ char *readdata (char *filename);
 
 board_t *loadboard (char *str);
 
+char *getcell (board_t *board, int x, int y);
+
+void computenextgen (board_t *board);
+
 #endif /* __FUNCTION_H__ */
 
 /* vim: set ts=4 sw=4 et: */
index 4e56d359e29b37510a3334576a9b419b07a209eb..a2495997a8ffa96a4a47d0fa8fc057159e890a0c 100644 (file)
@@ -149,6 +149,7 @@ int main (int argc, char *argv[])
         switch (getch ()) {
         case '\n':
         case '\r':
+            computenextgen (board);
             break;
         case KEY_UP:
         case 'i':