#include "world.h" #include #include #include #include #include "snake.h" #include "main.c" typedef struct Snake { int x; int y; struct Snake *next; } Snake; typedef struct State { Snake *snake; int food[2]; int foodCount; int height; int width; int speedX; int speedY; } State; /*enum endgame { END_CONTINUE, END_SNAKE, END_FOOD };*/ void calculateNewSnakeHeadPosition(State *state, int *newX, int *newY) { *newX = state->snake->x + state->speedX; *newY = state->snake->y + state->speedY; } int isPointInsideSnake(Snake *snake, int x, int y) { Snake *current = snake; while (current != NULL) { if (current->x == x && current->y == y) { return 1; } current = current->next; } return 0; } void removeLastSnakePart(Snake *snake) { Snake *current = snake; Snake *previous = NULL; while (current->next != NULL) { previous = current; current = current->next; } free(current); if (previous != NULL) { previous->next = NULL; } } void addNewSnakePart(Snake *snake, int x, int y) { Snake *newPart = (Snake*)malloc(sizeof(Snake)); if (newPart == NULL) { printf("Error\n"); exit(1); } newPart->x = x; newPart->y = y; newPart->next = NULL; Snake *current = snake; while (current->next != NULL) { current = current->next; } current->next = newPart; } /*int step_state(struct state* state) { int newX, newY; calculateNewSnakeHeadPosition(state, &newX, &newY); if (isPointInsideSnake(state->snake, newX, newY)) { return END_SNAKE; } if (newX == state->foodx[0] && newY == state->foody[1]) { state->foodx[0] = -1; state->foody[1] = -1; addNewSnakePart(state->snake, newX, newY); state->foodCount--; if (state->foodCount == 0) { return END_FOOD; } else { return END_CONTINUE; } } if (newX >= 0 && newX < state->width && newY >= 0 && newY < state->height) { addNewSnakePart(state->snake, newX, newY); removeLastSnakePart(state->snake); return END_CONTINUE; } else { return END_SNAKE; } }*/ int step_state(struct state* state) { // Рассчитываем новые координаты головы змеи int newHeadX = state->snake->x + state->sx; int newHeadY = state->snake->y + state->sy; // Проверяем, находится ли новая позиция головы змеи на змее struct snake *current = state->snake->next; while (current != NULL) { if (current->x == newHeadX && current->y == newHeadY) { return END_SNAKE; // Игра завершается из-за столкновения со змеей } current = current->next; } // Проверяем, находится ли новая позиция головы змеи на еде for (int i = 0; i < FOOD_COUNT; ++i) { if (newHeadX == state->foodx[i] && newHeadY == state->foody[i]) { // Помечаем еду как съеденную и добавляем новый элемент змеи state->foodx[i] = -1; state->foody[i] = -1; struct snake *newPart = (struct snake*)malloc(sizeof(struct snake)); if (newPart == NULL) { printf("Ошибка выделения памяти\n"); exit(1); } newPart->x = newHeadX; newPart->y = newHeadY; newPart->next = state->snake; state->snake = newPart; return (i == FOOD_COUNT - 1) ? END_FOOD : END_CONTINUE; } } // Проверяем, находится ли новая позиция головы змеи в пределах поля if (newHeadX >= 0 && newHeadX < state->width && newHeadY >= 0 && newHeadY < state->height) { // Добавляем новую часть змеи и удаляем последнюю struct snake *newHead = (struct snake*)malloc(sizeof(struct snake)); if (newHead == NULL) { printf("Ошибка выделения памяти\n"); exit(1); } newHead->x = newHeadX; newHead->y = newHeadY; newHead->next = state->snake; state->snake = newHead; // Удаляем последнюю часть змеи struct snake *tail = state->snake; while (tail->next->next != NULL) { tail = tail->next; } free(tail->next); tail->next = NULL; return END_CONTINUE; // Игра продолжается после перемещения змеи } else { return END_SNAKE; // Игра завершается из-за выхода за пределы поля } } /*int main() { State *gameState = (State*)malloc(sizeof(State)); if (gameState == NULL) { printf("Error\n"); return 1; } gameState->snake = (Snake*)malloc(sizeof(Snake)); if (gameState->snake == NULL) { printf("Error\n"); return 1; } gameState->snake->x = 0; gameState->snake->y = 0; gameState->snake->next = NULL; gameState->food[0] = 5; gameState->food[1] = 5; gameState->foodCount = 1; gameState->height = 10; gameState->width = 10; gameState->speedX = 1; gameState->speedY = 0; int endGameReason = step_state(gameState); switch (endGameReason) { case END_CONTINUE: printf("Game continue.\n"); break; case END_SNAKE: printf("Game is finished due to colision.\n"); break; case END_FOOD: printf("Game is finished due to lack of food.\n"); break; } free(gameState->snake); free(gameState); return 0; }*/