#include #include #include "include/main.h" #include "include/segment.h" #include "include/snake.h" #include "include/field.h" #include "include/apple.h" #include "../config.h" Snake *new_snake(size_t len, int x, int y) { Snake *s; s = (Snake *)malloc(sizeof(Snake)); if (!s) die("snake.c: new_snake(): 's' is null pointer"); s->len = len; s->n = (Segment **)malloc(sizeof(Segment *) * s->len); if (!s->n) die("snake.c: new_snake(): 's->n' is null pointer"); for (size_t i = 0; i < s->len; i++) s->n[i] = new_segment(x, y++); return s; } void delete_snake(Snake *s) { for (size_t i = 0; i < s->len; i++) delete_segment(s->n[i]); free_s(s); } void snake_forward(Snake *s , int dirn) { if (!s) die("snake.c: snake_forward(): 's' is null pointer"); switch (dirn) { case UP: segment_move(s->n[0], s->n[0]->x, s->n[0]->y - 1); break; case DOWN: segment_move(s->n[0], s->n[0]->x, s->n[0]->y + 1); break; case RIGHT: segment_move(s->n[0], s->n[0]->x + 1, s->n[0]->y); break; case LEFT: segment_move(s->n[0], s->n[0]->x - 1, s->n[0]->y); break; } for (size_t i = 1; i < s->len; i++) segment_move(s->n[i], s->n[i - 1]->prev_x, s->n[i - 1]->prev_y); } void snake_print(Snake *s) { if (!s) die("snake.c: snake_print(): 's' is null pointer"); for (size_t i = 0; i < s->len; i++) mvaddch(s->n[i]->y, s->n[i]->x, snake_ch); } int snake_eat(Snake *s, Field *f) { size_t i; Segment *c; if (field_xy_is_apple(f, s->n[0]->x, s->n[0]->y, &i)) { if (!field_relocate_apple(f, i)) return 0; c = new_segment(s->n[s->len - 1]->prev_x, s->n[s->len - 1]->prev_y); s->n = (Segment **)realloc(s->n, sizeof(Segment *) * ++(s->len)); if (!s->n) die("snake.c: snake_eat(): 's->n' is null pointer"); s->n[s->len - 1] = c; return 1; } return 0; }