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

wirehaze git hosting

c2979532ea5a29644ca492ebc360efef19daa1da
[lifeboot.git] / prototype.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <time.h>
5 #include <unistd.h>
6
7 #define COLS 80
8 #define ROWS 25
9
10 #define DEAD ' '
11 #define ALIVE '#'
12
13 #define INIT_RATIO 4
14
15 #define STR(x) _STR(x)
16 #define _STR(x) #x
17
18 static void clearscr() { printf("\e[1;1H\e[2J"); }
19
20 static void print_row(char row[COLS]) { printf("%." STR(COLS) "s\n", row); }
21
22 static void print_grid(char grid[COLS * ROWS]) {
23 for (int i = 0; i < ROWS; i++)
24 print_row(grid + i * COLS);
25 }
26
27 static void init_grid(char grid[COLS * ROWS]) {
28 for (int i = 0; i < COLS * ROWS; i++) {
29 if (rand() % INIT_RATIO)
30 grid[i] = DEAD;
31 else
32 grid[i] = ALIVE;
33 }
34 }
35
36 static char get_state(char grid[COLS * ROWS], int row, int col) {
37 if (row < 0 || row >= ROWS || col < 0 || col >= COLS)
38 return DEAD;
39
40 return grid[row * COLS + col];
41 }
42
43 static int alive_neighbours(char grid[COLS * ROWS], int idx) {
44 int row = idx / COLS;
45 int col = idx % COLS;
46 int neighbours = 0;
47
48 for (int i = -1; i <= 1; i++)
49 for (int j = -1; j <= 1; j++)
50 if (get_state(grid, row + i, col + j) == ALIVE)
51 neighbours++;
52
53 if (get_state(grid, row, col) == ALIVE)
54 neighbours--;
55
56 return neighbours;
57 }
58
59 static char next_state(char grid[COLS * ROWS], int idx) {
60 int n = alive_neighbours(grid, idx);
61
62 if (get_state(grid, idx / COLS, idx % COLS) == ALIVE) {
63 if (n < 2 || n > 3)
64 return DEAD;
65
66 return ALIVE;
67 }
68
69 if (n == 3)
70 return ALIVE;
71
72 return DEAD;
73 }
74
75 static void update_grid(char grid[COLS * ROWS]) {
76 char new[COLS * ROWS];
77
78 for (int i = 0; i < COLS * ROWS; i++)
79 new[i] = next_state(grid, i);
80
81 memcpy(grid, new, COLS * ROWS);
82 }
83
84 int main() {
85 char grid[COLS * ROWS];
86
87 srand(time(0));
88 init_grid(grid);
89
90 do {
91 clearscr();
92 print_grid(grid);
93 update_grid(grid);
94 } while (getchar() != 'q');
95
96 return 0;
97 }