nsnake/src/snake.c

85 lines
2.1 KiB
C

#include <stdlib.h>
#include <ncurses.h>
#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;
}