#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 }