it works but without figures

This commit is contained in:
Rorikstr | Rust Dev 2025-09-29 17:17:35 +03:00
parent e9785c4906
commit f5b65a390b
6 changed files with 75 additions and 17 deletions

View file

@ -45,7 +45,7 @@ typedef struct {
Automato_t state; Automato_t state;
Moving_t moving_type; Moving_t moving_type;
int field[FIELD_HEIGHT][FIELD_WIDTH]; int field[FIELD_HEIGHT][FIELD_WIDTH];
GameInfo_t info; GameInfo_t* info;
long long last_time; long long last_time;
} GameState_t; } GameState_t;

View file

@ -9,8 +9,8 @@ void userInput(UserAction_t action, bool hold) {
state->state = Init; state->state = Init;
break; break;
case Terminate: case Terminate:
if (state->info.score > state->info.high_score) { if (state->info->score > state->info->high_score) {
state->info.high_score = state->info.score; state->info->high_score = state->info->score;
} }
state->state = GameOver; state->state = GameOver;
break; break;
@ -31,7 +31,7 @@ void userInput(UserAction_t action, bool hold) {
state->moving_type = ToDown; state->moving_type = ToDown;
break; break;
case Pause: case Pause:
state->info.pause = !state->info.pause; state->info->pause = !state->info->pause;
break; break;
default: default:
break; break;
@ -61,9 +61,19 @@ GameInfo_t updateCurrentState() {
break; break;
} }
GameInfo_t info = state->info; // Копируем данные в уже выделенную память
info.field = (int**)state->field; for (int i = 0; i < FIELD_HEIGHT; i++) {
info.next = (int**)state->next.mtrx; for (int j = 0; j < FIELD_WIDTH; j++) {
info.pause = 0; state->info->field[i][j] = state->field[i][j];
return info; }
}
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;
} }

View file

@ -1,11 +1,59 @@
#include "01_automato.h" #include "01_automato.h"
#include <stdlib.h>
GameState_t* get_game_state(void) { GameState_t* get_game_state(void) {
static GameState_t state = {0}; static GameState_t state = {0};
static int initialized = 0; static int initialized = 0;
if (!initialized) { 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; state.state = GameOver;
initialized = 1; initialized = 1;
} }
return &state; 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;
}
}

View file

@ -7,8 +7,8 @@ void do_init(void) {
for (int j = 0; j < FIELD_WIDTH; ++j) for (int j = 0; j < FIELD_WIDTH; ++j)
state->field[i][j] = 0; state->field[i][j] = 0;
state->info.score = 0; state->info->score = 0;
state->info.level = 1; state->info->level = 1;
state->info.speed = 1; state->info->speed = 1;
state->state = Spawn; state->state = Spawn;
} }

View file

@ -10,7 +10,7 @@ void do_move(void) {
long long current_time = get_time_ms(); 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) { if (current_time - state->last_time < delay) {
return; // ещё не время return; // ещё не время

View file

@ -87,10 +87,10 @@ void clear_lines() {
// Начисление очков // Начисление очков
if (lines_cleared > 0) { if (lines_cleared > 0) {
int points[] = {0, 100, 300, 700, 1500}; int points[] = {0, 100, 300, 700, 1500};
state->info.score += points[lines_cleared]; state->info->score += points[lines_cleared];
if (state->info.score / 600 > state->info.level - 1) { if (state->info->score / 600 > state->info->level - 1) {
state->info.level++; state->info->level++;
state->info.speed = state->info.level; state->info->speed = state->info->level;
} }
} }
} }