From 9048881b1621ea6d314665ea12998285414bac96 Mon Sep 17 00:00:00 2001 From: Laurent MAZET Date: Fri, 21 Jun 2024 16:03:42 +0200 Subject: [PATCH] next generation computation --- display.c | 21 ++++++++++++++++-- function.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++- function.h | 4 ++++ gameoflife.c | 1 + 4 files changed, 85 insertions(+), 3 deletions(-) diff --git a/display.c b/display.c index ed898b6..36eb132 100644 --- 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); } } } diff --git a/function.c b/function.c index 0c9923b..7155af7 100644 --- a/function.c +++ b/function.c @@ -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: */ diff --git a/function.h b/function.h index fc5101a..4aab699 100644 --- a/function.h +++ b/function.h @@ -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: */ diff --git a/gameoflife.c b/gameoflife.c index 4e56d35..a249599 100644 --- a/gameoflife.c +++ b/gameoflife.c @@ -149,6 +149,7 @@ int main (int argc, char *argv[]) switch (getch ()) { case '\n': case '\r': + computenextgen (board); break; case KEY_UP: case 'i': -- 2.30.2