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

wirehaze git hosting

bc414d5f23a2932ff38547affb00b7ec20ba8917
[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 row, int col) {
41 if (row < 0 || row >= ROWS || col < 0 || col >= COLS)
42 return DEAD;
43
44 return grid[row * COLS + col];
45 }
46
47 static int alive_neighbours(char grid[COLS * ROWS], int idx) {
48 int row = idx / COLS;
49 int col = idx % COLS;
50 int neighbours = 0;
51
52 for (int i = -1; i <= 1; i++)
53 for (int j = -1; j <= 1; j++)
54 if (get_state(grid, row + i, col + j) == ALIVE)
55 neighbours++;
56
57 if (get_state(grid, row, col) == ALIVE)
58 neighbours--;
59
60 return neighbours;
61 }
62
63 static char next_state(char grid[COLS * ROWS], int idx) {
64 int n = alive_neighbours(grid, idx);
65
66 if (get_state(grid, idx / COLS, idx % COLS) == ALIVE) {
67 if (n < 2 || n > 3)
68 return DEAD;
69
70 return ALIVE;
71 }
72
73 if (n == 3)
74 return ALIVE;
75
76 return DEAD;
77 }
78
79 static void update_grid(char grid[COLS * ROWS]) {
80 char new[COLS * ROWS];
81
82 for (int i = 0; i < COLS * ROWS; i++)
83 new[i] = next_state(grid, i);
84
85 memcpy(grid, new, COLS * ROWS);
86 }
87
88 int main () {
89 char grid[COLS * ROWS];
90
91 srand(time(0));
92 init_grid(grid);
93
94 for (;;) {
95 clearscr();
96 print_grid(grid);
97 update_grid(grid);
98 getchar();
99 }
100
101 return 0;
102 }