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,
.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);