85 lines
2.1 KiB
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;
|
|
}
|