103 lines
2.1 KiB
C
103 lines
2.1 KiB
C
#include <stdlib.h>
|
|
#include "grid.h"
|
|
#include "snake.h"
|
|
|
|
Snake *new_snake(void)
|
|
{
|
|
Snake *snake = (Snake *)malloc(sizeof(Snake));
|
|
if (snake == NULL)
|
|
{
|
|
fprintf(stderr, "Memory allocation failed\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
snake->size = 0;
|
|
snake->segments_list = NULL;
|
|
|
|
return snake;
|
|
}
|
|
|
|
void add_segment(Snake *snake, int x, int y)
|
|
{
|
|
Position *new_segment = (Position *)malloc(sizeof(Position));
|
|
if (new_segment == NULL)
|
|
{
|
|
fprintf(stderr, "Memory allocation failed\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
new_segment->x = x;
|
|
new_segment->y = y;
|
|
new_segment->next = NULL;
|
|
|
|
if (snake->segments_list == NULL)
|
|
{
|
|
snake->segments_list = new_segment;
|
|
}
|
|
else
|
|
{
|
|
Position *current = snake->segments_list;
|
|
while (current->next != NULL)
|
|
{
|
|
current = current->next;
|
|
}
|
|
current->next = new_segment;
|
|
}
|
|
|
|
snake->size++;
|
|
}
|
|
|
|
void free_snake(Snake *snake)
|
|
{
|
|
Position *current = snake->segments_list;
|
|
while (current != NULL)
|
|
{
|
|
Position *next = current->next;
|
|
free(current);
|
|
current = next;
|
|
}
|
|
free(snake);
|
|
}
|
|
|
|
void crawl(Snake *snake, struct GridStruct *g)
|
|
{
|
|
Position *new_head = (Position *)malloc(sizeof(Position));
|
|
Position *current;
|
|
if (new_head == NULL)
|
|
{
|
|
fprintf(stderr, "Memory allocation failed\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
new_head->x = snake->segments_list->x;
|
|
new_head->y = snake->segments_list->y;
|
|
|
|
switch (snake->dir)
|
|
{
|
|
case LEFT:
|
|
new_head->x = (new_head->x - 1 + g->nbc) % g->nbc;
|
|
break;
|
|
case RIGHT:
|
|
new_head->x = (new_head->x + 1) % g->nbc;
|
|
break;
|
|
case TOP:
|
|
new_head->y = (new_head->y - 1 + g->nbl) % g->nbl;
|
|
break;
|
|
case BOTTOM:
|
|
new_head->y = (new_head->y + 1) % g->nbl;
|
|
break;
|
|
}
|
|
|
|
new_head->next = snake->segments_list;
|
|
snake->segments_list = new_head;
|
|
|
|
current = snake->segments_list;
|
|
while (current->next != NULL && current->next->next != NULL)
|
|
{
|
|
current = current->next;
|
|
}
|
|
|
|
free(current->next);
|
|
current->next = NULL;
|
|
}
|