#include "game_core.h" #include const int directions[8][2] = {{-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1}}; const uint32_t colors[2] = {BLACK, WHITE}; Board init_board(size_t width, size_t height, int random) { Board board = {NULL, width, height}; board.pixels = malloc(height * sizeof(uint32_t *)); for (size_t y = 0; y < height; y++) { board.pixels[y] = malloc(width * sizeof(uint32_t)); for (size_t x = 0; x < width; x++) { if (random) board.pixels[y][x] = colors[rand() % 2]; else board.pixels[y][x] = BLACK; } } return board; } void free_board(Board board) { for (size_t y = 0; y < board.height; y++) free(board.pixels[y]); free(board.pixels); } Board copy_board(Board board) { Board copy = init_board(board.width, board.height, 0); for (size_t x = 0; x < board.width; x++) { for (size_t y = 0; y < board.height; y++) { copy.pixels[y][x] = board.pixels[y][x]; } } return copy; } void display_board(Board board) { for (size_t y = 0; y < board.height; y++) { for (size_t x = 0; x < board.width; x++) { printf("%c", board.pixels[y][x] == BLACK ? ' ' : 'X'); } puts(""); } } int count_adjacent(Board board, size_t x, size_t y) { size_t i; int w, h; uint8_t count = 0; for (i = 0; i < 8; i++) { w = x + directions[i][1]; h = y + directions[i][0]; if (!((w < 0 || w >= (int)board.width) || (h < 0 || h >= (int)board.height))) if (board.pixels[h][w] == WHITE) count++; } return count; } Board process_game(Board board) { Board new_board = copy_board(board); size_t x, y; uint8_t count = 0; for (y = 0; y < board.height; y++) { for (x = 0; x < board.width; x++) { count = count_adjacent(board, x, y); if (board.pixels[y][x] == BLACK && count == 3) { new_board.pixels[y][x] = WHITE; } else if (board.pixels[y][x] == WHITE && count != 2 && count != 3) { new_board.pixels[y][x] = BLACK; } } } free_board(board); return new_board; }