From 150d71d75584bbbf26f373481155f1de09aeda03 Mon Sep 17 00:00:00 2001 From: Andrii Hutsuliak Date: Sun, 30 Mar 2025 20:15:49 +0200 Subject: [PATCH] zmeny --- du5/snake.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 du5/snake.c diff --git a/du5/snake.c b/du5/snake.c new file mode 100644 index 0000000..f406dcf --- /dev/null +++ b/du5/snake.c @@ -0,0 +1,86 @@ +#include "snake.h" +#include + +// 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 +} +