]> git.friedersdorff.com Git - max/gol.git/blob - tick.c
First working implementation
[max/gol.git] / tick.c
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include "tick.h"
4
5 int gol_tick(struct gol_board *state)
6 {
7         struct gol_board tmp_state;
8         char is_live;
9         unsigned char n_live_adj;
10         int i, j;
11
12         tmp_state = (struct gol_board ) {
13                 .live_cells = malloc(10 * sizeof(int_least32_t)),
14                 .n = 0,
15                 .size = 10,
16                 .max_x = 0,
17                 .min_x = 0,
18                 .max_y = 0,
19                 .min_y = 0
20         };
21
22         if (!tmp_state.live_cells) {
23                 return 0;
24         }
25
26         for (i = state->min_x - 1; i <= state->max_x + 1; ++i) {
27                 for (j = state->min_y - 1; j <= state->max_y + 1; ++j) {
28                         n_live_adj = 0;
29                         gol_is_live(state, i - 1, j - 1, &is_live);
30                         n_live_adj += is_live;
31                         gol_is_live(state, i, j - 1, &is_live);
32                         n_live_adj += is_live;
33                         gol_is_live(state, i + 1, j - 1, &is_live);
34                         n_live_adj += is_live;
35                         gol_is_live(state, i - 1, j, &is_live);
36                         n_live_adj += is_live;
37                         gol_is_live(state, i + 1, j, &is_live);
38                         n_live_adj += is_live;
39                         gol_is_live(state, i - 1 , j + 1, &is_live);
40                         n_live_adj += is_live;
41                         gol_is_live(state, i, j + 1, &is_live);
42                         n_live_adj += is_live;
43                         gol_is_live(state, i + 1, j + 1, &is_live);
44                         n_live_adj += is_live;
45
46                         switch (n_live_adj) {
47                         case (3):
48                                 if(!gol_vivify(&tmp_state, i, j)) {
49                                         return 0;
50                                 }
51
52                                 break;
53                         case(2):
54                                 if (gol_is_live(state, i, j, &is_live) && is_live) {
55                                         gol_vivify(&tmp_state, i, j);
56                                 }
57                                 break;
58                         default:
59                                 break;
60                         }
61                 }
62         }
63         free(state->live_cells);
64         *state = tmp_state;
65         return 1;
66 }