#include <LedControl.h>
LedControl mat=LedControl(13,12,11,1);
#define VRx A0
#define VRy A1
int x,y,i=0,snakeHeadX=3,snakeHeadY=3,tailX[64],tailY[64],snakeSize=2;
int foodX,foodY,score=0;
void setup()
{
mat.shutdown(0,false);
mat.setIntensity(0,8);
mat.clearDisplay(0);
pinMode(VRx, INPUT);
pinMode(VRy, INPUT);
tailX[0]=3;
tailY[0]=3;
tailX[1]=4;
tailY[1]=3;
foodPosn();
Serial.begin(9600);
}
void readInput()
{
x=analogRead(VRx);
y=analogRead(VRy);
if (tailX[1]==tailX[0]-1||tailX[1]==tailX[0]+1||tailX[1]==tailX[0]+7||tailX[1]==tailX[0]-7)
{
if(y>900)
snakeHeadY--;
else if(y<150)
snakeHeadY++;
else
{
if(tailX[1]==tailX[0]-1||tailX[1]==tailX[0]+7)
snakeHeadX++;
else if (tailX[1]==tailX[0]+1||tailX[1]==tailX[0]-7)
snakeHeadX--;
}
}
else if (tailY[1]==tailY[0]-1||tailY[1]==tailY[0]+1||tailY[1]==tailY[0]+7||tailY[1]==tailY[0]-7)
{
if(x>900)
snakeHeadX++;
else if(x<150)
snakeHeadX--;
else
{
if(tailY[1]==tailY[0]-1||tailY[1]==tailY[0]+7)
snakeHeadY++;
else if (tailY[1]==tailY[0]+1||tailY[1]==tailY[0]-7)
snakeHeadY--;
}
}
}
void display()
{
mat.clearDisplay(0);
mat.setLed(0,foodY,foodX,1);
for(i=0;i<snakeSize;i++)
mat.setLed(0,tailY[i],tailX[i],1);
delay(200);
}
void manageCoord()
{
for(i=snakeSize-1;i>0;i--)
{
tailX[i]=tailX[i-1];
tailY[i]=tailY[i-1];
}
tailX[0]=snakeHeadX;
tailY[0]=snakeHeadY;
}
void manageSnakeOutOfBounds()
{
if(snakeHeadX > 7)
snakeHeadX = 0;
else if(snakeHeadX < 0)
snakeHeadX = 7;
if(snakeHeadY > 7)
snakeHeadY = 0;
else if(snakeHeadY < 0)
snakeHeadY = 7;
}
void foodPosn()
{
foodX=rand()%8;
foodY=rand()%8;
}
void manageEatenFood()
{
if (snakeHeadX==foodX && snakeHeadY==foodY)
{
score++;
snakeSize++;
Serial.print("Score=");
Serial.println(score);
foodPosn();
}
}
void loop()
{
readInput();
manageSnakeOutOfBounds();
manageEatenFood();
manageCoord();
display();
}