This commit is contained in:
Andrii Hutsuliak 2025-04-28 21:31:41 +02:00
parent 423985ff42
commit b01eafe5ac

85
a3/snake.c Normal file
View File

@ -0,0 +1,85 @@
#include "snake.h"
#include <stdlib.h>
// Pridá novú hlavu hada
struct snake* add_snake(struct snake* snake, int x, int y) {
struct snake* new_head = (struct snake*)malloc(sizeof(struct snake)); // Alokujeme pamäť pre novú hlavu hada
if (!new_head) return NULL; // Ak sa pamäť nepodarilo alokovať, vrátime NULL
new_head->x = x; // Nastavíme súradnicu X pre novú hlavu
new_head->y = y; // Nastavíme súradnicu Y pre novú hlavu
new_head->next = snake; // Nová hlava ukazuje na predchádzajúcu hlavu hada
return new_head; // Vrátime ukazovateľ na novú hlavu
}
// Odstráni chvost hada
struct snake* remove_snake(struct snake* snake) {
if (!snake || !snake->next) return NULL; // Ak had neexistuje alebo má iba jednu časť, vrátime NULL
struct snake* current = snake;
while (current->next->next) { // Prejdeme na predposledný prvok v zozname
current = current->next;
}
free(current->next); // Uvoľníme pamäť posledného prvku
current->next = NULL; // Odstránime ukazovateľ na posledný prvok
return snake; // Vrátime aktualizovaného hada
}
// Uvoľní celého hada
void free_snake(struct snake* sn) {
while (sn) { // Kým existuje had
struct snake* temp = sn; // Uchováme ukazovateľ na aktuálny prvok
sn = sn->next; // Posunieme sa na ďalší prvok
free(temp); // Uvoľníme pamäť aktuálneho prvku
}
}
// Skontroluje, či súradnice zodpovedajú akejkoľvek časti hada
int is_snake(struct snake* snake, int x, int y) {
while (snake) { // Prejdeme celého hada
if (snake->x == x && snake->y == y) return 1; // Ak sa súradnice zhodujú, vrátime 1
snake = snake->next; // Posunieme sa na ďalšiu časť hada
}
return 0; // Ak sa súradnice nezhodujú, vrátime 0
}
// Aktualizuje stav hry
int step_state(struct state* st) {
int nx = st->snake->x + st->sx; // Vypočítame novú súradnicu X
int ny = st->snake->y + st->sy; // Vypočítame novú súradnicu Y
// Skontrolujeme kolíziu so stenami
if (nx < 0 || ny < 0 || nx >= st->width || ny >= st->height) {
return END_WALL; // Ak had narazí do steny, hra končí
}
// Skontrolujeme kolíziu s hadom
if (is_snake(st->snake, nx, ny)) {
return END_SNAKE; // Ak had narazí do seba, hra končí
}
// Skontrolujeme, či sa na novej pozícii nachádza jedlo
for (int i = 0; i < FOOD_COUNT; i++) {
if (st->foodx[i] == nx && st->foody[i] == ny) {
st->foodx[i] = -1; // Označíme jedlo ako zjedené
st->foody[i] = -1;
st->snake = add_snake(st->snake, nx, ny); // Pridáme novú hlavu hada
// Skontrolujeme, či ostáva nejaké jedlo
int food_left = 0;
for (int j = 0; j < FOOD_COUNT; j++) {
if (st->foodx[j] >= 0 && st->foody[j] >= 0) {
food_left = 1;
break;
}
}
return food_left ? END_CONTINUE : END_FOOD; // Ak je jedlo, pokračujeme, inak hra končí
}
}
// Posunieme hada, ak sa jedlo nezjedlo
st->snake = add_snake(st->snake, nx, ny); // Pridáme novú hlavu hada
st->snake = remove_snake(st->snake); // Odstránime chvost hada
return END_CONTINUE; // Pokračujeme v hre
}