pvjc24/cv9/snake.c
2024-04-17 12:54:03 +02:00

223 lines
6.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "world.h"
#include <stdlib.h>
#include <curses.h>
#include <stdlib.h>
#include <string.h>
#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;
}*/