zmeny
This commit is contained in:
parent
88142f570c
commit
150d71d755
86
du5/snake.c
Normal file
86
du5/snake.c
Normal file
@ -0,0 +1,86 @@
|
||||
#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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user