diff --git a/du5/snake.c b/du5/snake.c index 7038cdb..810947a 100644 --- a/du5/snake.c +++ b/du5/snake.c @@ -1,23 +1,57 @@ #include "snake.h" #include -struct snake* add_snake(struct snake* snake,int x,int y){ - return NULL; +struct snake* add_snake(struct snake* snake, int x, int y) { + struct snake* head = calloc(1, sizeof(struct snake)); + if (head == NULL) { + return NULL; // Handle memory allocation failure + } + head->x = x; + head->y = y; + head->next = snake; + return head; } -struct snake* remove_snake(struct snake* snake){ - return NULL; +struct snake* remove_snake(struct snake* snake) { + if (snake == NULL) { + return NULL; + } + if (snake->next == NULL) { + free(snake); + return NULL; + } + + struct snake* this = snake; + struct snake* prev = NULL; + while (this->next != NULL) { + prev = this; + this = this->next; + } + + free(this); + prev->next = NULL; + return snake; } -void free_snake(struct snake* sn){ +void free_snake(struct snake* sn) { + if (sn == NULL) { + return; + } + free_snake(sn->next); + free(sn); } -int is_snake(struct snake* snake,int x,int y){ +int is_snake(struct snake* snake, int x, int y) { + for (struct snake* this = snake; this != NULL; this = this->next) { + if (this->x == x && this->y == y) { + return 1; + } + } return 0; } -int step_state(struct state* st){ - int nx = (st->snake->x + st->sx); +int step_state(struct state* st) { + int nx = (st->snake->x + st->sx); int ny = (st->snake->y + st->sy); return END_CONTINUE; }