]> wirehaze git hosting - lifeboot.git/blob - prototype.c

wirehaze git hosting

wip
[lifeboot.git] / prototype.c
1 #include <stdint.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <time.h>
5
6 #define COLS 80
7 #define ROWS 25
8
9 #define DEAD ' '
10 #define ALIVE '#'
11
12 #define INIT_RATIO 4
13
14 #define STR(x) _STR (x)
15 #define _STR(x) #x
16
17 static uint16_t xss; /* xs() state */
18
19 static uint16_t
20 xs () /* xorshift prng */
21 {
22 xss ^= (xss << 1);
23 xss ^= (xss >> 3);
24 xss ^= (xss << 10);
25
26 return xss;
27 }
28
29 static void
30 clearscr ()
31 {
32 printf ("\e[1;1H\e[2J");
33 }
34
35 static void
36 print_row (char row[COLS])
37 {
38 printf ("%." STR (COLS) "s\n", row);
39 }
40
41 static void
42 print_grid (char grid[COLS * ROWS])
43 {
44 for (int i = 0; i < ROWS; i++)
45 print_row (grid + i * COLS);
46 }
47
48 static void
49 init_grid (char grid[COLS * ROWS])
50 {
51 for (int i = 0; i < COLS * ROWS; i++)
52 {
53 if (xs () % INIT_RATIO)
54 grid[i] = DEAD;
55 else
56 grid[i] = ALIVE;
57 }
58 }
59
60 static char
61 get_state (char grid[COLS * ROWS], int row, int col)
62 {
63 if (row < 0 || row >= ROWS || col < 0 || col >= COLS)
64 return DEAD;
65
66 return grid[row * COLS + col];
67 }
68
69 static int
70 alive_neighbours (char grid[COLS * ROWS], int idx)
71 {
72 int row = idx / COLS;
73 int col = idx % COLS;
74 int neighbours = 0;
75
76 for (int i = -1; i <= 1; i++)
77 for (int j = -1; j <= 1; j++)
78 if (get_state (grid, row + i, col + j) == ALIVE)
79 neighbours++;
80
81 if (get_state (grid, row, col) == ALIVE)
82 neighbours--;
83
84 return neighbours;
85 }
86
87 static char
88 next_state (char grid[COLS * ROWS], int idx)
89 {
90 int n = alive_neighbours (grid, idx);
91
92 if (get_state (grid, idx / COLS, idx % COLS) == ALIVE)
93 {
94 if (n < 2 || n > 3)
95 return DEAD;
96
97 return ALIVE;
98 }
99
100 if (n == 3)
101 return ALIVE;
102
103 return DEAD;
104 }
105
106 static void
107 update_grid (char grid[COLS * ROWS])
108 {
109 char new[COLS * ROWS];
110
111 for (int i = 0; i < COLS * ROWS; i++)
112 new[i] = next_state (grid, i);
113
114 memcpy (grid, new, COLS * ROWS);
115 }
116
117 int
118 main ()
119 {
120 char grid[COLS * ROWS];
121
122 xss = time (0);
123 init_grid (grid);
124
125 do
126 {
127 clearscr ();
128 print_grid (grid);
129 update_grid (grid);
130 }
131 while (getchar () != 'q');
132
133 return 0;
134 }