]> git.friedersdorff.com Git - max/gol.git/blobdiff - tick.c
MINIMAL implementation. Single glider gun
[max/gol.git] / tick.c
diff --git a/tick.c b/tick.c
new file mode 100644 (file)
index 0000000..07cc195
--- /dev/null
+++ b/tick.c
@@ -0,0 +1,49 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include "tick.h"
+
+int gol_tick(struct gol_board *state)
+{
+       struct gol_board tmp_state;
+       tmp_state = (struct gol_board ) {
+               .live_cells = malloc(10 * sizeof(typeof(*tmp_state.live_cells))),
+               .n = 0,
+               .size = 10,
+               .max_x = 0,
+               .min_x = 0,
+               .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);
+                               
+                       switch (n_live_adj) {
+                       case (3):
+                               gol_vivify(&tmp_state, i, j);
+                               break;
+                       case(2):
+                               if (gol_is_live(state, i, j)) {
+                                       gol_vivify(&tmp_state, i, j);
+                               }
+                       default:
+                               break;
+                       }
+                       
+               }
+       }
+       free(state->live_cells);
+       *state = tmp_state;
+       return 1;
+}