snake-pp/src/snake.c
2023-12-20 16:57:29 +01:00

165 lines
4.2 KiB
C

#include "snake.h"
#include "game.h" //for access to global 'game' struct
bool snakeSetDirectionIsAllowed = true;
void snakeInit()
{
//-----------------------------------
//-------------Default---------------
//-----------------------------------
// length
config.snakeDefaultLength = 2; // inkl head
game.snake.length = config.snakeDefaultLength;
// coordinates of head
game.snake.headX = game.map.width / 2;
game.snake.headY = game.map.height / 2;
// movement direction
game.snake.direction = 3; // left
// coordinates of tail
game.snake.tail[0][0] = game.snake.headX; // X-coordinate
game.snake.tail[0][1] = game.snake.headY; // Y-coordinate
game.snake.tail[1][0] = game.snake.headX - 1; // X-coordinate
game.snake.tail[1][1] = game.snake.headY - 1; // Y-coordinate
// alive
game.snake.isAlive = true;
return;
}
void snakeGrow()
{
game.snake.length++;
// tail part is attached left of last tail part
// maybe problem while rendering --> MUST BE SOLVED THEN
game.snake.tail[game.snake.length - 1][0] = game.snake.tail[game.snake.length - 2][0];
game.snake.tail[game.snake.length - 1][1] = game.snake.tail[game.snake.length - 2][1];
return;
}
void snakeMove()
{
int i = game.snake.length - 1; // counter for snake moving
snakeSetDirectionIsAllowed = true; // direction can be changed now
// update head position automatically
snakeUpdateHeadPos();
// tail part of[x,y][0,1] get coordinates of tail part before
while(i)
{
game.snake.tail[i][0] = game.snake.tail[i-1][0];
game.snake.tail[i][1] = game.snake.tail[i-1][1];
i--;
}
game.snake.tail[0][0] = game.snake.headX;
game.snake.tail[0][1] = game.snake.headY;
return;
}
void snakeSetDir(snakeDirection_t dir)
{
// if direction mustn changed
if(!snakeSetDirectionIsAllowed)
{
return;
}
// check, if snake should be move in opposite direction -> new direction stays old direction
switch(dir)
{
case DOWN:
if(game.snake.direction == UP)
return;
else
break;
case UP:
if(game.snake.direction == DOWN)
return;
else
break;
case LEFT:
if(game.snake.direction == RIGHT)
return;
else
break;
case RIGHT:
if(game.snake.direction == LEFT)
return;
else
break;
}
game.snake.direction = dir;
snakeSetDirectionIsAllowed = false; // direction cannot updated until next snakeMove
return;
}
bool snakeIsAlive()
{
for(int i = 1; i < game.snake.length; i++)
{
if(game.snake.tail[i][0] == game.snake.headX && game.snake.tail[i][1] == game.snake.headY)
return false;
}
return true;
}
void snakeSetHeadPos(int xPos, int yPos)
{
game.snake.headX = xPos;
game.snake.headY = yPos;
game.snake.tail[0][0] = xPos;
game.snake.tail[0][1] = yPos;
return;
}
void snakeUpdateHeadPos()
{
switch(game.snake.direction)
{
// DOWN
case DOWN:
game.snake.headX = game.snake.tail[0][0];
game.snake.headY = game.snake.tail[0][1] + 1;
if(game.snake.headY >= game.map.height)
game.snake.headY = 0;
break;
// UP
case UP:
game.snake.headX = game.snake.tail[0][0];
game.snake.headY = game.snake.tail[0][1] - 1;
if(game.snake.headY < 0)
game.snake.headY = game.map.height - 1;
break;
// LEFT
case LEFT:
game.snake.headX = game.snake.tail[0][0] - 1;
game.snake.headY = game.snake.tail[0][1];
if(game.snake.headX < 0)
game.snake.headX = game.map.width - 1;
break;
// RIGHT
case RIGHT:
game.snake.headX = game.snake.tail[0][0] + 1;
game.snake.headY = game.snake.tail[0][1];
if(game.snake.headX >= game.map.width)
game.snake.headX = 0;
break;
}
return;
}