Files
snake2025/snake.c
2025-05-20 13:04:52 +02:00

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;
}