commit 6b646b9

wf  ·  2026-07-13 20:18:23 +0000 UTC
parent 6b646b9
init
4 files changed,  +112, -0
A README
A gol.c
+1, -0
1@@ -0,0 +1 @@
2+gol
+5, -0
1@@ -0,0 +1,5 @@
2+CC ?= cc
3+CFLAGS += -g -Oz -Wall -Wextra -std=c99 -pedantic
4+
5+all: gol
6+gol: gol.c
A README
+8, -0
1@@ -0,0 +1,8 @@
2+gol
3+===
4+
5+Hacky C99 game of life thing. You can specify a
6+few neat starting patterns by uncommenting the
7+appropriate segments in the code :P
8+
9+Usage: `gol [rows columns]`
A gol.c
+98, -0
 1@@ -0,0 +1,98 @@
 2+#define _XOPEN_SOURCE 500 // yikes
 3+
 4+#include <stdio.h>
 5+#include <stdlib.h>
 6+#include <unistd.h>
 7+#include <signal.h>
 8+#include <sys/random.h>
 9+
10+void sig(int s) { (void)s; write(STDIN_FILENO, "\033[?25h\033[?7h", 11); _exit(0); }
11+
12+int
13+main(int argc, char **argv) {
14+	int w = 16, h = 16;
15+
16+	if (argc > 1) {
17+		if (argv[1]) h = atoi(argv[1]);
18+		if (argv[2]) w = atoi(argv[2]);
19+	}
20+
21+	char g[w][h];
22+
23+	signal(SIGINT,  sig);
24+	signal(SIGTERM, sig);
25+
26+	for (int i = 0; i < w; i++) {
27+		for (int j = 0; j < h; j++) {
28+			char b = 0;
29+			getrandom(&b, 1, 0);
30+			g[i][j] = b & 1;
31+		}
32+	}
33+
34+	// for (int i = 0; i < w; i++)
35+	// 	for (int j = 0; j < h; j++)
36+	// 		g[i][j] = 0;
37+	// 
38+
39+	// some neat patterns:
40+	//
41+	// glider:
42+	// g[0][0] =
43+	//           g[1][1] = g[1][2] =
44+	// g[2][0] = g[2][1] = 1;
45+	//
46+	// anvil: (not very functional)
47+	//           g[6][8] = g[6][9] = g[6][10] = g[6][11] =
48+	// g[7][7] =                                           g[7][12] =
49+	//           g[8][8] = g[8][9] = g[8][10] =            g[8][12] =
50+	//                               g[9][10] =            g[9][12] = g[9][13] = 1;
51+
52+	printf("\033[?25l\033[?7l\033[2J\033[H");
53+
54+	for (;;) {
55+		int d[8][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}, {1, 1}, {-1, -1}, {1, -1}, {-1, 1}};
56+
57+		for (int i = 0; i < w; i++) {
58+			for (int j = 0; j < h; j++) {
59+				int l = 0;
60+				for (int c = 0; c < 8; c++) {
61+					int x = i + d[c][0],
62+					    y = j + d[c][1];
63+					if (x >= 0 && x < w && y >= 0 && y < h
64+						&& (g[x][y] == 1 || g[x][y] == 3))
65+					    l++;
66+				}
67+
68+				if (g[i][j] == 1 && (l < 2 || l > 3))
69+					g[i][j] = 3;
70+				else if (g[i][j] == 0 && l == 3)
71+					g[i][j] = 2;
72+			}
73+		}
74+
75+		printf("\033[H");
76+		for (int i = 0; i < w; i++) {
77+			for (int j = 0; j < h; j++) {
78+				if (g[i][j] == 2) {
79+					g[i][j] = 1;
80+					printf("\033[7m \033[0m");
81+				}
82+				else if (g[i][j] == 3) {
83+					g[i][j] = 0;
84+					putchar(' ');
85+				}
86+				else if (g[i][j] == 1)
87+					printf("\033[7m \033[0m");
88+				else
89+					putchar(' ');
90+			}
91+			putchar('\n');
92+		}
93+		fflush(stdout);
94+		usleep(100000);
95+	}
96+
97+	// NOTREACHED
98+	return 0;
99+}