86 lines
3.3 KiB
C
86 lines
3.3 KiB
C
#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
|
|
}
|