diff --git a/du4/snake.c b/du4/snake.c new file mode 100644 index 0000000..4d6cac1 --- /dev/null +++ b/du4/snake.c @@ -0,0 +1,72 @@ +#include "snake.h" +#include + +struct snake* add_snake(struct snake* snake, int x, int y) { + struct snake* nova_hlava = malloc(sizeof(struct snake)); + nova_hlava->x = x; + nova_hlava->y = y; + nova_hlava->next = snake; + return nova_hlava; +} + +struct snake* remove_snake(struct snake* snake) { + if (snake == NULL) return NULL; + if (snake->next == NULL) { + free(snake); + return NULL; + } + struct snake* aktualny = snake; + while (aktualny->next->next != NULL) { + aktualny = aktualny->next; + } + free(aktualny->next); + aktualny->next = NULL; + return snake; +} + +void free_snake(struct snake* sn) { + while (sn != NULL) { + struct snake* dalsi = sn->next; + free(sn); + sn = dalsi; + } +} + +int is_snake(struct snake* snake, int x, int y) { + struct snake* aktualny = snake; + while (aktualny != NULL) { + if (aktualny->x == x && aktualny->y == y) return 1; + aktualny = aktualny->next; + } + return 0; +} + +int step_state(struct state* st) { + int nx = (st->snake->x + st->sx); + int ny = (st->snake->y + st->sy); + + if (nx < 0 || nx >= st->width || + ny < 0 || ny >= st->height) { + return END_WALL; + } + + if (is_snake(st->snake, nx, ny)) { + return END_SNAKE; + } + + for (int i = 0; i < FOOD_COUNT; i++) { + if (st->foodx[i] == nx && st->foody[i] == ny) { + st->snake = add_snake(st->snake, nx, ny); + st->foodx[i] = -1; + st->foody[i] = -1; + for (int j = 0; j < FOOD_COUNT; j++) { + if (st->foodx[j] >= 0) return END_CONTINUE; + } + return END_FOOD; + } + } + + st->snake = add_snake(st->snake, nx, ny); + st->snake = remove_snake(st->snake); + return END_CONTINUE; +}