From 5fd528e22a5545adcf40a9a2a70e85b6c36936ea Mon Sep 17 00:00:00 2001 From: Rorikstr | Rust Dev Date: Mon, 29 Sep 2025 15:20:21 +0300 Subject: [PATCH] arch --- src/brick_game/tetris/01_automato.h | 34 ++++++++++------- .../tetris/{03_tetris.c => 02_tetris.c} | 38 ++++++++++--------- .../tetris/{02_automato.c => 03_automato.c} | 7 ++-- src/brick_game/tetris/04_init.c | 15 ++++++++ src/brick_game/tetris/04_start.c | 14 ------- src/brick_game/tetris/05_spawn.c | 8 ++-- src/brick_game/tetris/08_attaching.c | 9 ++--- src/brick_game/tetris/09_gameover.c | 4 +- src/brick_game/tetris/figure_sprites.c | 4 +- src/gui/cli/display.c | 10 ++--- src/gui/cli/main.c | 2 +- 11 files changed, 78 insertions(+), 67 deletions(-) rename src/brick_game/tetris/{03_tetris.c => 02_tetris.c} (54%) rename src/brick_game/tetris/{02_automato.c => 03_automato.c} (59%) create mode 100644 src/brick_game/tetris/04_init.c delete mode 100644 src/brick_game/tetris/04_start.c diff --git a/src/brick_game/tetris/01_automato.h b/src/brick_game/tetris/01_automato.h index 0ad1f85..f8aef55 100644 --- a/src/brick_game/tetris/01_automato.h +++ b/src/brick_game/tetris/01_automato.h @@ -13,6 +13,13 @@ typedef enum { GameOver } Automato_t; +typedef enum { + RightDown, + LeftDown, + Rotate, + DoNothing +} Moving_t; + typedef enum { I = 0, J, @@ -22,31 +29,32 @@ typedef enum { T, Z, FIGURE_COUNT -} FigureType; +} Sprite_t; typedef struct { int x, y; // Позиция фигуры на поле int mtrx[4][4]; // сама матрица - FigureType type; // Тип фигуры + Sprite_t sprite; // Тип фигуры int rotation; // Поворот (0–3) -} Figure; +} Figure_t; typedef struct { - Figure curr; - Figure next; + Figure_t curr; + Figure_t next; Automato_t state; + Moving_t moving_type; int field[FIELD_HEIGHT][FIELD_WIDTH]; - int score; - int high_score; - int level; - int speed; - long long last_time; + // int score; // НЕ НУЖЕН, это уже есть в GameInfo_t + // int high_score; // НЕ НУЖЕН, это уже есть в GameInfo_t + // int level; // НЕ НУЖЕН, это уже есть в GameInfo_t + // int speed; // НЕ НУЖЕН, это уже есть в GameInfo_t + long long last_time; // нужно пояснение для чего это } GameState_t; GameState_t* get_game_state(void); // Функции состояний -void do_start(void); +void do_init(void); void do_spawn(void); void do_move(void); void do_moving(void); @@ -54,13 +62,13 @@ void do_attaching(void); void do_gameover(void); // Вспомогательные -void place_figure_on_field(); +void place_figure(); int check_collision(); void clear_lines(); int is_game_over(); // Функции фигур -const int (*get_figure_shape(FigureType type, int rotation))[4]; +const int (*get_figure_shape(Sprite_t sprite, int rotation))[4]; // Остальные фигуры... const int (*i_fig_up())[4]; diff --git a/src/brick_game/tetris/03_tetris.c b/src/brick_game/tetris/02_tetris.c similarity index 54% rename from src/brick_game/tetris/03_tetris.c rename to src/brick_game/tetris/02_tetris.c index 41a3f32..5da7688 100644 --- a/src/brick_game/tetris/03_tetris.c +++ b/src/brick_game/tetris/02_tetris.c @@ -2,37 +2,43 @@ #include void userInput(UserAction_t action, bool hold) { - GameState_t* state = get_game_state(); + GameState_t* g_state = get_game_state(); + GameInfo_t* g_info = get_info_state(); switch (action) { case Start: - state->state = Start; + g_state->state = Init; break; case Terminate: - if (state->score > state->high_score) { - state->high_score = state->score; + if (g_info->score > g_info->high_score) { + g_info->high_score = g_info->score; } - exit(0); break; case Left: + g_state->state = Moving; + g_state->moving_type = LeftDown; + break; case Right: + g_state->state = Moving; + g_state->moving_type = RightDown; + break; case Action: - state->state = Moving; + g_state->state = Moving; + g_state->moving_type = Rotate; break; case Down: // Ускорение падения — будет обрабатываться в do_move break; - case Pause: - // Обработка на UI - break; + default: + break; // pause и down - не нужны в backend логике. } } GameInfo_t updateCurrentState() { - GameState_t* state = get_game_state(); - switch (state->state) { + GameState_t* g_state = get_game_state(); + switch (g_state->state) { case Start: - do_start(); + do_init(); break; case Spawn: do_spawn(); @@ -52,12 +58,8 @@ GameInfo_t updateCurrentState() { } GameInfo_t info = {0}; - info.field = (int**)state->field; - info.next = (int**)state->next.mtrx; // теперь next.mtrx - info.score = state->score; - info.high_score = state->high_score; - info.level = state->level; - info.speed = state->speed; + info.field = (int**)g_state->field; + info.next = (int**)g_state->next.mtrx; // теперь next.mtrx info.pause = 0; return info; } \ No newline at end of file diff --git a/src/brick_game/tetris/02_automato.c b/src/brick_game/tetris/03_automato.c similarity index 59% rename from src/brick_game/tetris/02_automato.c rename to src/brick_game/tetris/03_automato.c index 8517f8e..d8c9e42 100644 --- a/src/brick_game/tetris/02_automato.c +++ b/src/brick_game/tetris/03_automato.c @@ -3,10 +3,11 @@ static GameState_t g_state = {0}; GameState_t* get_game_state(void) { - static int initialized = 0; - if (!initialized) { + static GameInfo_t instance = {0}; + static int is_init = 0; + if (!is_init) { g_state.state = GameOver; - initialized = 1; + is_init = 1; } return &g_state; } \ No newline at end of file diff --git a/src/brick_game/tetris/04_init.c b/src/brick_game/tetris/04_init.c new file mode 100644 index 0000000..5497e2c --- /dev/null +++ b/src/brick_game/tetris/04_init.c @@ -0,0 +1,15 @@ +#include "01_automato.h" + +void do_init(void) { + GameState_t* g_state = get_game_state(); + GameInfo_t* g_info = get_game_info(); + // Очистка поля + for (int i = 0; i < FIELD_HEIGHT; ++i) + for (int j = 0; j < FIELD_WIDTH; ++j) + g_state->field[i][j] = 0; + + g_info->score = 0; + g_info->level = 1; + g_info->speed = 1; + g_state->state = Spawn; +} \ No newline at end of file diff --git a/src/brick_game/tetris/04_start.c b/src/brick_game/tetris/04_start.c deleted file mode 100644 index 4f04158..0000000 --- a/src/brick_game/tetris/04_start.c +++ /dev/null @@ -1,14 +0,0 @@ -#include "01_automato.h" - -void do_start(void) { - GameState_t* state = get_game_state(); - // Очистка поля - for (int i = 0; i < FIELD_HEIGHT; i++) - for (int j = 0; j < FIELD_WIDTH; j++) - state->field[i][j] = 0; - - state->score = 0; - state->level = 1; - state->speed = 1; - state->state = Spawn; -} \ No newline at end of file diff --git a/src/brick_game/tetris/05_spawn.c b/src/brick_game/tetris/05_spawn.c index ba50526..0fc6a96 100644 --- a/src/brick_game/tetris/05_spawn.c +++ b/src/brick_game/tetris/05_spawn.c @@ -9,11 +9,11 @@ void do_spawn(void) { state->curr.y = 0; // Генерим следующую фигуру - state->next.type = rand() % FIGURE_COUNT; + state->next.sprite = rand() % FIGURE_COUNT; state->next.rotation = 0; - const int (*shape)[4] = get_figure_shape(state->next.type, 0); - for (int i = 0; i < 4; i++) - for (int j = 0; j < 4; j++) + const int (*shape)[4] = get_figure_shape(state->next.sprite, 0); + for (int i = 0; i < 4; ++i) + for (int j = 0; j < 4; ++j) state->next.mtrx[i][j] = shape[i][j]; // Проверка на GameOver diff --git a/src/brick_game/tetris/08_attaching.c b/src/brick_game/tetris/08_attaching.c index 2fa4c35..33c02f4 100644 --- a/src/brick_game/tetris/08_attaching.c +++ b/src/brick_game/tetris/08_attaching.c @@ -3,17 +3,16 @@ void do_attaching(void) { GameState_t* state = get_game_state(); // Закрепляем фигуру на поле - place_figure_on_field(); + place_figure(); // Удаляем линии clear_lines(); // Проверяем GameOver + int is_gameov = 0; if (is_game_over()) { state->state = GameOver; - return; + } else { + state->state = Spawn; } - - // Переход в Spawn - state->state = Spawn; } \ No newline at end of file diff --git a/src/brick_game/tetris/09_gameover.c b/src/brick_game/tetris/09_gameover.c index 58f515e..719d9e9 100644 --- a/src/brick_game/tetris/09_gameover.c +++ b/src/brick_game/tetris/09_gameover.c @@ -3,7 +3,7 @@ void do_gameover(void) { GameState_t* state = get_game_state(); // Сброс next в пустую фигуру - for (int i = 0; i < 4; i++) - for (int j = 0; j < 4; j++) + for (int i = 0; i < 4; ++i) + for (int j = 0; j < 4; ++j) state->next.mtrx[i][j] = 0; } \ No newline at end of file diff --git a/src/brick_game/tetris/figure_sprites.c b/src/brick_game/tetris/figure_sprites.c index d22bd09..dc12ce7 100644 --- a/src/brick_game/tetris/figure_sprites.c +++ b/src/brick_game/tetris/figure_sprites.c @@ -1,9 +1,9 @@ #include "01_automato.h" #include -const int (*get_figure_shape(FigureType type, int rotation))[4] { +const int (*get_figure_shape(Sprite_t sprite, int rotation))[4] { const int (*result)[4] = NULL; - switch (type) { + switch (sprite) { case I: switch (rotation % 4) { case 0: result = i_fig_up(); break; diff --git a/src/gui/cli/display.c b/src/gui/cli/display.c index 214e168..e6f576d 100644 --- a/src/gui/cli/display.c +++ b/src/gui/cli/display.c @@ -1,6 +1,6 @@ // src/gui/cli/display.c #include -#include "../../brick_game/tetris/tetris.h" +#include "../../brick_game/tetris/00_tetris.h" void display_game() { printf("DEBUG: display_game called\n"); @@ -12,8 +12,8 @@ void display_game() { game_state.field, game_state.next); // Отображение игрового поля - for (int i = 0; i < FIELD_HEIGHT; i++) { - for (int j = 0; j < FIELD_WIDTH; j++) { + for (int i = 0; i < FIELD_HEIGHT; ++i) { + for (int j = 0; j < FIELD_WIDTH; ++j) { if (game_state.field[i][j] == 2) { mvaddch(i + 1, j * 2 + 1, '#'); // Закрепленные блоки } else if (game_state.field[i][j] == 1) { @@ -27,8 +27,8 @@ void display_game() { // Отображение следующей фигуры mvaddstr(1, FIELD_WIDTH * 2 + 5, "Next figure:"); - for (int i = 0; i < 4; i++) { - for (int j = 0; j < 4; j++) { + for (int i = 0; i < 4; ++i) { + for (int j = 0; j < 4; ++j) { if (game_state.next[i][j]) { mvaddch(i + 3, (FIELD_WIDTH * 2 + 5) + j * 2, '@'); } else { diff --git a/src/gui/cli/main.c b/src/gui/cli/main.c index a08d580..e11805f 100644 --- a/src/gui/cli/main.c +++ b/src/gui/cli/main.c @@ -2,7 +2,7 @@ #include #include #include -#include "../../brick_game/tetris/tetris.h" +#include "../../brick_game/tetris/00_tetris.h" void display_game();