diff --git a/src/brick_game/tetris/01_automato.h b/src/brick_game/tetris/01_automato.h index 83b2569..d7831b7 100644 --- a/src/brick_game/tetris/01_automato.h +++ b/src/brick_game/tetris/01_automato.h @@ -45,7 +45,7 @@ typedef struct { Automato_t state; Moving_t moving_type; int field[FIELD_HEIGHT][FIELD_WIDTH]; - GameInfo_t info; + GameInfo_t* info; long long last_time; } GameState_t; diff --git a/src/brick_game/tetris/02_tetris.c b/src/brick_game/tetris/02_tetris.c index c7ea2fc..002a55f 100644 --- a/src/brick_game/tetris/02_tetris.c +++ b/src/brick_game/tetris/02_tetris.c @@ -9,8 +9,8 @@ void userInput(UserAction_t action, bool hold) { state->state = Init; break; case Terminate: - if (state->info.score > state->info.high_score) { - state->info.high_score = state->info.score; + if (state->info->score > state->info->high_score) { + state->info->high_score = state->info->score; } state->state = GameOver; break; @@ -31,7 +31,7 @@ void userInput(UserAction_t action, bool hold) { state->moving_type = ToDown; break; case Pause: - state->info.pause = !state->info.pause; + state->info->pause = !state->info->pause; break; default: break; @@ -61,9 +61,19 @@ GameInfo_t updateCurrentState() { break; } - GameInfo_t info = state->info; - info.field = (int**)state->field; - info.next = (int**)state->next.mtrx; - info.pause = 0; - return info; + // Копируем данные в уже выделенную память + for (int i = 0; i < FIELD_HEIGHT; i++) { + for (int j = 0; j < FIELD_WIDTH; j++) { + state->info->field[i][j] = state->field[i][j]; + } + } + + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + state->info->next[i][j] = state->next.mtrx[i][j]; + } + } + + state->info->pause = 0; + return *state->info; } \ No newline at end of file diff --git a/src/brick_game/tetris/03_automato.c b/src/brick_game/tetris/03_automato.c index 82f10c2..93f22bc 100644 --- a/src/brick_game/tetris/03_automato.c +++ b/src/brick_game/tetris/03_automato.c @@ -1,11 +1,59 @@ #include "01_automato.h" +#include GameState_t* get_game_state(void) { static GameState_t state = {0}; static int initialized = 0; + if (!initialized) { + // Выделяем память для GameInfo_t + state.info = malloc(sizeof(GameInfo_t)); + + // Выделяем память для field + state.info->field = malloc(FIELD_HEIGHT * sizeof(int*)); + for (int i = 0; i < FIELD_HEIGHT; i++) { + state.info->field[i] = malloc(FIELD_WIDTH * sizeof(int)); + } + + // Выделяем память для next + state.info->next = malloc(4 * sizeof(int*)); + for (int i = 0; i < 4; i++) { + state.info->next[i] = malloc(4 * sizeof(int)); + } + state.state = GameOver; initialized = 1; } return &state; +} + +void terminate_and_free() { + GameState_t* state = get_game_state(); + + if (state->info) { + if (state->info->field != NULL) { + for (int i = 0; i < FIELD_HEIGHT; i++) { + if (state->info->field[i] != NULL) { + free(state->info->field[i]); + state->info->field[i] = NULL; + } + } + free(state->info->field); + state->info->field = NULL; + } + + if (state->info->next != NULL) { + for (int i = 0; i < 4; i++) { + if (state->info->next[i] != NULL) { + free(state->info->next[i]); + state->info->next[i] = NULL; + } + } + free(state->info->next); + state->info->next = NULL; + } + + free(state->info); + state->info = NULL; + } } \ No newline at end of file diff --git a/src/brick_game/tetris/04_init.c b/src/brick_game/tetris/04_init.c index 7391594..a7a6f0a 100644 --- a/src/brick_game/tetris/04_init.c +++ b/src/brick_game/tetris/04_init.c @@ -7,8 +7,8 @@ void do_init(void) { for (int j = 0; j < FIELD_WIDTH; ++j) state->field[i][j] = 0; - state->info.score = 0; - state->info.level = 1; - state->info.speed = 1; + state->info->score = 0; + state->info->level = 1; + state->info->speed = 1; state->state = Spawn; } \ No newline at end of file diff --git a/src/brick_game/tetris/06_move.c b/src/brick_game/tetris/06_move.c index 8f20f01..aec1d01 100644 --- a/src/brick_game/tetris/06_move.c +++ b/src/brick_game/tetris/06_move.c @@ -10,7 +10,7 @@ void do_move(void) { long long current_time = get_time_ms(); - int delay = (state->moving_type == ToDown) ? 50 : (1000 / state->info.speed); + int delay = (state->moving_type == ToDown) ? 50 : (1000 / state->info->speed); if (current_time - state->last_time < delay) { return; // ещё не время diff --git a/src/brick_game/tetris/08_attaching.c b/src/brick_game/tetris/08_attaching.c index ade7674..f1e5e67 100644 --- a/src/brick_game/tetris/08_attaching.c +++ b/src/brick_game/tetris/08_attaching.c @@ -87,10 +87,10 @@ void clear_lines() { // Начисление очков if (lines_cleared > 0) { int points[] = {0, 100, 300, 700, 1500}; - state->info.score += points[lines_cleared]; - if (state->info.score / 600 > state->info.level - 1) { - state->info.level++; - state->info.speed = state->info.level; + state->info->score += points[lines_cleared]; + if (state->info->score / 600 > state->info->level - 1) { + state->info->level++; + state->info->speed = state->info->level; } } } \ No newline at end of file