#include #include #include "tick.h" 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(int_least32_t)), .n = 0, .size = 10, .max_x = 0, .min_x = 0, .max_y = 0, .min_y = 0 }; if (!tmp_state.live_cells) { return 0; } 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): if(!gol_vivify(&tmp_state, i, j)) { return 0; } break; case(2): if (gol_is_live(state, i, j, &is_live) && is_live) { gol_vivify(&tmp_state, i, j); } break; default: break; } } } free(state->live_cells); *state = tmp_state; return 1; }