]> git.friedersdorff.com Git - max/gol.git/blobdiff - tick.c
First working implementation
[max/gol.git] / tick.c
diff --git a/tick.c b/tick.c
index 07cc19575d6ac8b26e93479813acd3b209ed4d8d..db98e7d9eb930524e88e08b83a61d8edac00cf4d 100644 (file)
--- a/tick.c
+++ b/tick.c
@@ -5,8 +5,12 @@
 int gol_tick(struct gol_board *state)
 {
        struct gol_board tmp_state;
+       char is_live;
+       unsigned char n_live_adj;
+       int i, j;
+
        tmp_state = (struct gol_board ) {
-               .live_cells = malloc(10 * sizeof(typeof(*tmp_state.live_cells))),
+               .live_cells = malloc(10 * sizeof(int_least32_t)),
                .n = 0,
                .size = 10,
                .max_x = 0,
@@ -14,33 +18,46 @@ int gol_tick(struct gol_board *state)
                .max_y = 0,
                .min_y = 0
        };
+
        if (!tmp_state.live_cells) {
                return 0;
        }
-       unsigned char n_live_adj;
-       for (int i = state->min_x; i < state->max_x; ++i) {
-               for (int j = state->min_y; j < state->max_y; ++j) {
-                       n_live_adj = gol_is_live(state, i - 1, j - 1) +
-                               gol_is_live(state, i, j - 1) +
-                               gol_is_live(state, i + 1, j - 1) +
-                               gol_is_live(state, i - 1, j) +
-                               gol_is_live(state, i + 1, j) +
-                               gol_is_live(state, i - 1 , j + 1) +
-                               gol_is_live(state, i, j + 1) +
-                               gol_is_live(state, i + 1, j + 1);
-                               
+
+       for (i = state->min_x - 1; i <= state->max_x + 1; ++i) {
+               for (j = state->min_y - 1; j <= state->max_y + 1; ++j) {
+                       n_live_adj = 0;
+                       gol_is_live(state, i - 1, j - 1, &is_live);
+                       n_live_adj += is_live;
+                       gol_is_live(state, i, j - 1, &is_live);
+                       n_live_adj += is_live;
+                       gol_is_live(state, i + 1, j - 1, &is_live);
+                       n_live_adj += is_live;
+                       gol_is_live(state, i - 1, j, &is_live);
+                       n_live_adj += is_live;
+                       gol_is_live(state, i + 1, j, &is_live);
+                       n_live_adj += is_live;
+                       gol_is_live(state, i - 1 , j + 1, &is_live);
+                       n_live_adj += is_live;
+                       gol_is_live(state, i, j + 1, &is_live);
+                       n_live_adj += is_live;
+                       gol_is_live(state, i + 1, j + 1, &is_live);
+                       n_live_adj += is_live;
+
                        switch (n_live_adj) {
                        case (3):
-                               gol_vivify(&tmp_state, i, j);
+                               if(!gol_vivify(&tmp_state, i, j)) {
+                                       return 0;
+                               }
+
                                break;
                        case(2):
-                               if (gol_is_live(state, i, j)) {
+                               if (gol_is_live(state, i, j, &is_live) && is_live) {
                                        gol_vivify(&tmp_state, i, j);
                                }
+                               break;
                        default:
                                break;
                        }
-                       
                }
        }
        free(state->live_cells);