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}