commit 6b646b9
wf
·
2026-07-13 20:18:23 +0000 UTC
parent 6b646b9
init
4 files changed,
+112,
-0
+1,
-0
1@@ -0,0 +1 @@
2+gol
A
Makefile
+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+}