#include #define W 60 #define H 40 typedef unsigned char Board[W*H/8]; static Board board; static _Bool get(Board *b, unsigned x, unsigned y) { x %= W; y %= H; unsigned idx = x + y * W; return (*b)[idx/8] & (1 << (idx % 8)); } static void set(Board *b, unsigned x, unsigned y, _Bool set) { x %= W; y %= H; unsigned idx = x + y * W; (*b)[idx/8] &= ~(1 << (idx % 8)); if (set) (*b)[idx/8] |= (1 << (idx % 8)); } static void next(Board *b) { Board temp; memcpy(temp, &**b, sizeof temp); for (int y = 0; y < H; ++y) for (int x = 0; x < W; ++x) { #define C(ox, oy) get(&temp, x + ox, y + oy) int n = C(-1,-1) + C(0,-1) + C(1,-1) + C(-1, 0) + C(1, 0) + C(-1, 1) + C(0, 1) + C(1, 1); set(b, x, y, 0); if (get(&temp, x, y)) set(b, x, y, n == 3); else if (n == 2) set(b, x, y, 1); else if (n == 3) set(b, x, y, 1); } } static void draw(Board *b) { printf("\x1B[H\n"); printf("\n"); for (int y = 0; y < H; ++y) { printf(" "); for (int x = 0; x < W; ++x) { if (get(b, x, y)) { printf("W"); } else { printf(" "); } } printf(" \n"); } } static void init(Board *b) { int time(void *); unsigned rnd = time(0); for (int y = 0; y < H; ++y) { for (int x = 0; x < W; ++x) { set(b, x, y, (_Bool)((rnd >> 31) & 1)); rnd = (rnd * 134775813) + 1; } } } void usleep(unsigned); int main () { init(&board); for (;;) { draw(&board); usleep(100); next(&board); } }