diff options
Diffstat (limited to 'examples/life.c')
| -rw-r--r-- | examples/life.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/examples/life.c b/examples/life.c new file mode 100644 index 0000000..212ece9 --- /dev/null +++ b/examples/life.c @@ -0,0 +1,84 @@ +#include <stdio.h> + +#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); + } +} |