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

wirehaze git hosting

add lifeboot.asm skel
[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
19 clearscr ()
20 {
21 printf ("\e[1;1H\e[2J");
22 }
23
24 static void
25 print_row (char row[COLS])
26 {
27 printf ("%." STR (COLS) "s\n", row);
28 }
29
30 static void
31 print_grid (char grid[COLS * ROWS])
32 {
33 for (int i = 0; i < ROWS; i++)
34 print_row (grid + i * COLS);
35 }
36
37 static void
38 init_grid (char grid[COLS * ROWS])
39 {
40 for (int i = 0; i < COLS * ROWS; i++)
41 {
42 if (rand () % INIT_RATIO)
43 grid[i] = DEAD;
44 else
45 grid[i] = ALIVE;
46 }
47 }
48
49 static char
50 get_state (char grid[COLS * ROWS], int row, int col)
51 {
52 if (row < 0 || row >= ROWS || col < 0 || col >= COLS)
53 return DEAD;
54
55 return grid[row * COLS + col];
56 }
57
58 static int
59 alive_neighbours (char grid[COLS * ROWS], int idx)
60 {
61 int row = idx / COLS;
62 int col = idx % COLS;
63 int neighbours = 0;
64
65 for (int i = -1; i <= 1; i++)
66 for (int j = -1; j <= 1; j++)
67 if (get_state (grid, row + i, col + j) == ALIVE)
68 neighbours++;
69
70 if (get_state (grid, row, col) == ALIVE)
71 neighbours--;
72
73 return neighbours;
74 }
75
76 static char
77 next_state (char grid[COLS * ROWS], int idx)
78 {
79 int n = alive_neighbours (grid, idx);
80
81 if (get_state (grid, idx / COLS, idx % COLS) == ALIVE)
82 {
83 if (n < 2 || n > 3)
84 return DEAD;
85
86 return ALIVE;
87 }
88
89 if (n == 3)
90 return ALIVE;
91
92 return DEAD;
93 }
94
95 static void
96 update_grid (char grid[COLS * ROWS])
97 {
98 char new[COLS * ROWS];
99
100 for (int i = 0; i < COLS * ROWS; i++)
101 new[i] = next_state (grid, i);
102
103 memcpy (grid, new, COLS * ROWS);
104 }
105
106 int
107 main ()
108 {
109 char grid[COLS * ROWS];
110
111 srand (time (0));
112 init_grid (grid);
113
114 do
115 {
116 clearscr ();
117 print_grid (grid);
118 update_grid (grid);
119 }
120 while (getchar () != 'q');
121
122 return 0;
123 }