it works but without figures
This commit is contained in:
parent
e9785c4906
commit
f5b65a390b
6 changed files with 75 additions and 17 deletions
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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; // ещё не время
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue