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;
Moving_t moving_type;
int field[FIELD_HEIGHT][FIELD_WIDTH];
GameInfo_t info;
GameInfo_t* info;
long long last_time;
} GameState_t;

View file

@ -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;
}

View file

@ -1,11 +1,59 @@
#include "01_automato.h"
#include <stdlib.h>
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;
}
}

View file

@ -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;
}

View file

@ -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; // ещё не время

View file

@ -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;
}
}
}