#include #include #define ROWS 25 #define COLUMNS 80 void init(); void deinit(); int input(); void field(int rows, int columns, char f_field[][columns]); void display(int rows, int columns, char simulation[][columns], int speed); void nextGen(int rows, int columns, char prev_simulation[][columns], char next_simulation[][columns]); int countNeighbors(int rows, int columns, int x, int y, char simulation[][columns]); int main(int argc, char **argv) { if (argc < 2) { printf("no map file?\n"); } else { FILE *op; op = fopen(argv[1], "rt"); char first_field[ROWS][COLUMNS]; for (int y = 0; y < ROWS; y++) { for (int x = 0; x < COLUMNS; x++) { fscanf(op, "%c", &first_field[y][x]); } } fclose(op); init(); field(ROWS, COLUMNS, first_field); deinit(); } return 0; } void init() { initscr(); cbreak(); clear(); curs_set(0); refresh(); timeout(20); } void deinit() { curs_set(1); clear(); endwin(); } int input() { int key; key = wgetch(stdscr); return key; } void display(int rows, int columns, char simulation[][columns], int speed) { clear(); for (int y = 0; y < rows; y++) { for (int x = 0; x < columns; x++) { printw("%c", simulation[y][x]); } printw("\n"); } refresh(); napms(speed); } int countNeighbors(int rows, int columns, int x, int y, char simulation[][columns]) { int count = 0; for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { int row = (y + i + rows) % rows; int col = (x + j + columns) % columns; char c = simulation[row][col]; if (c == '#') { count++; } else { continue; } } } return count; } void nextGen(int rows, int columns, char prev_simulation[][columns], char next_simulation[][columns]) { for (int y = 0; y < rows; y++) { for (int x = 0; x< columns; x++) { int live = countNeighbors(rows, columns, x, y, prev_simulation); char cell = prev_simulation[y][x]; next_simulation[y][x] = cell; if (cell == '#') live--; if (live < 2) { next_simulation[y][x] = '.'; } else if ((live == 2 || live == 3) && cell == '#') { next_simulation[y][x] = '#'; } else if (live > 3 && cell == '#') { next_simulation[y][x] = '.'; } else if (live == 3 && cell == '.') { next_simulation[y][x] = '#'; } } } } void field(int rows, int columns, char f_field[][columns]) { int speed = 300; char simulation[rows][columns]; for (int y = 0; y < rows; y++) { for (int x = 0; x < columns; x++) { simulation[y][x] = f_field[y][x]; } } display(rows, columns, simulation, speed); while (1) { char new_simulation[rows][columns]; nextGen(rows, columns, simulation, new_simulation); for (int y = 0; y < rows; y++) { for (int x = 0; x < columns; x++) { simulation[y][x] = new_simulation[y][x]; } } display(rows, columns, simulation, speed); int key = input(); if (key == ERR) { continue; } if (key == 'f') { speed -= 25; } if (key == 's') { speed += 25; } if (key == 'e') { break; } } }