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);
}
}
}
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);
}
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: */