From 3d38da89150835237767047c2fb9555ec306be49 Mon Sep 17 00:00:00 2001 From: hkz Date: Wed, 16 Jul 2025 14:24:57 +0200 Subject: [PATCH] Add base game logic --- src/game_logic.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++-- src/game_logic.h | 5 ++-- 2 files changed, 74 insertions(+), 6 deletions(-) diff --git a/src/game_logic.c b/src/game_logic.c index 8bf9235..0a2faf0 100644 --- a/src/game_logic.c +++ b/src/game_logic.c @@ -1,7 +1,9 @@ #include "game_logic.h" -static uint8_t game_grid_alpha[GRID_WIDTH * GRID_HEIGHT]; -static uint8_t game_grid_beta[GRID_WIDTH * GRID_HEIGHT]; +#include + +static uint8_t game_grid_alpha[GRID_SIDE * GRID_SIDE]; +static uint8_t game_grid_beta[GRID_SIDE * GRID_SIDE]; static uint8_t *front_grid = game_grid_alpha; static uint8_t *back_grid = game_grid_beta; @@ -15,13 +17,80 @@ void swap_grids(void) { back_grid = temp; } -uint8_t *get_current_grid(void) { +uint8_t *get_front_grid(void) { return front_grid; } uint8_t *step_game(step_direction dir) { // TODO: Update the grid state calculating the new state in the back grid + uint8_t start_offset; + int8_t column_step; + int8_t row_step; + + /* + * UP: scans TOP to BOTTOM, RIGHT to LEFT + * DOWN: scans BOTTOM to TOP, RIGHT to LEFT + * LEFT: scans LEFT to RIGHT, TOP to BOTTOM + * RIGHT: scans RIGHT to LEFT, TOP to BOTTOM + */ + + switch(dir) { + case UP: + start_offset = GRID_SIDE; + column_step = GRID_SIDE; + row_step = -1; + break; + case DOWN: + start_offset = (GRID_SIDE * GRID_SIDE) - 1; + column_step = -GRID_SIDE; + row_step = -1; + break; + case LEFT: + start_offset = 0; + column_step = 1; + row_step = GRID_SIDE; + break; + break; + case RIGHT: + start_offset = GRID_SIDE - 1; + column_step = -1; + row_step = GRID_SIDE; + break; + }; + + // Clear the back grid + memset(back_grid, 0, GRID_SIDE * GRID_SIDE); + + for (int8_t row = 0; row < GRID_SIDE; row++) { + for(int8_t col = 0; col < GRID_SIDE; col++) { + uint8_t current_offset = start_offset + (col * column_step) + (row * row_step); + uint8_t sub_col; + + // Search for the first non-zero value in the front grid and copy it in the current place of the back grid (zeroing it in the front) + for(sub_col = col; sub_col < GRID_SIDE; sub_col++) { + uint8_t sub_col_offset = start_offset + (sub_col * column_step) + (row * row_step); + if(front_grid[sub_col_offset]) { + back_grid[current_offset] = front_grid[sub_col_offset]; + front_grid[sub_col_offset] = 0; + break; + } + } + + // The value is still 0, we found nothing. On to the next row! + if (!back_grid[current_offset]) break; + + // Now search if there is an identical value following this one, so we can merge them + for(; sub_col < GRID_SIDE; sub_col++) { + uint8_t sub_col_offset = start_offset + (sub_col * column_step) + (row * row_step); + if(front_grid[sub_col_offset] == back_grid[current_offset]) { + back_grid[current_offset]++; // Merge them (by increasing the value of the current square and removing the merged one) + front_grid[sub_col_offset] = 0; + break; + } + } + } + } swap_grids(); diff --git a/src/game_logic.h b/src/game_logic.h index 94057cb..fc9d6ac 100644 --- a/src/game_logic.h +++ b/src/game_logic.h @@ -3,8 +3,7 @@ #include -#define GRID_WIDTH 5 -#define GRID_HEIGHT 5 +#define GRID_SIDE 5 typedef enum { UP, @@ -13,7 +12,7 @@ typedef enum { RIGHT } step_direction; -uint8_t *get_current_grid(void); +uint8_t *get_front_grid(void); uint8_t *step_game(step_direction dir); #endif /* _GAME_LOGIC_HEADER_ */