main
gol.c
1#define _XOPEN_SOURCE 500 // yikes
2
3#include <stdio.h>
4#include <stdlib.h>
5#include <unistd.h>
6#include <signal.h>
7#include <sys/random.h>
8
9void sig(int s) { (void)s; write(STDIN_FILENO, "\033[?25h\033[?7h", 11); _exit(0); }
10
11int
12main(int argc, char **argv) {
13 int w = 16, h = 16;
14
15 if (argc > 1) {
16 if (argv[1]) h = atoi(argv[1]);
17 if (argv[2]) w = atoi(argv[2]);
18 }
19
20 char g[w][h];
21
22 signal(SIGINT, sig);
23 signal(SIGTERM, sig);
24
25 for (int i = 0; i < w; i++) {
26 for (int j = 0; j < h; j++) {
27 char b = 0;
28 getrandom(&b, 1, 0);
29 g[i][j] = b & 1;
30 }
31 }
32
33 // for (int i = 0; i < w; i++)
34 // for (int j = 0; j < h; j++)
35 // g[i][j] = 0;
36 //
37
38 // some neat patterns:
39 //
40 // glider:
41 // g[0][0] =
42 // g[1][1] = g[1][2] =
43 // g[2][0] = g[2][1] = 1;
44 //
45 // anvil: (not very functional)
46 // g[6][8] = g[6][9] = g[6][10] = g[6][11] =
47 // g[7][7] = g[7][12] =
48 // g[8][8] = g[8][9] = g[8][10] = g[8][12] =
49 // g[9][10] = g[9][12] = g[9][13] = 1;
50
51 printf("\033[?25l\033[?7l\033[2J\033[H");
52
53 for (;;) {
54 int d[8][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}, {1, 1}, {-1, -1}, {1, -1}, {-1, 1}};
55
56 for (int i = 0; i < w; i++) {
57 for (int j = 0; j < h; j++) {
58 int l = 0;
59 for (int c = 0; c < 8; c++) {
60 int x = i + d[c][0],
61 y = j + d[c][1];
62 if (x >= 0 && x < w && y >= 0 && y < h
63 && (g[x][y] == 1 || g[x][y] == 3))
64 l++;
65 }
66
67 if (g[i][j] == 1 && (l < 2 || l > 3))
68 g[i][j] = 3;
69 else if (g[i][j] == 0 && l == 3)
70 g[i][j] = 2;
71 }
72 }
73
74 printf("\033[H");
75 for (int i = 0; i < w; i++) {
76 for (int j = 0; j < h; j++) {
77 if (g[i][j] == 2) {
78 g[i][j] = 1;
79 printf("\033[7m \033[0m");
80 }
81 else if (g[i][j] == 3) {
82 g[i][j] = 0;
83 putchar(' ');
84 }
85 else if (g[i][j] == 1)
86 printf("\033[7m \033[0m");
87 else
88 putchar(' ');
89 }
90 putchar('\n');
91 }
92 fflush(stdout);
93 usleep(100000);
94 }
95
96 // NOTREACHED
97 return 0;
98}