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

wirehaze git hosting

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