#include "GameBoy.h"
GameBoy gb;
int score=0;
// ===== SNAKE begin =====
// позиція голови
int snakeHeadX,snakeHeadY;
// позиція їжі
int snakeFoodX,snakeFoodY;
// напрям руху
int snakeDirX,snakeDirY;
// довжина та хвіст
int snakeLength;
int snakeTailX[128],snakeTailY[128];
void setupSnake(){
snakeLength=0; // обнуляємо хвіст
snakeFoodX=3; snakeFoodY=3; // стартова їжа
snakeHeadX=5; snakeHeadY=5; // старт голови
snakeDirX=0; snakeDirY=-1; // рух вгору
score=0;
}
bool loopSnake(){
// зсув хвоста
for(int i=snakeLength;i>0;i--)
snakeTailX[i]=snakeTailX[i-1],
snakeTailY[i]=snakeTailY[i-1];
if(snakeLength>0)
snakeTailX[0]=snakeHeadX,
snakeTailY[0]=snakeHeadY;
// рух голови
snakeHeadX+=snakeDirX;
snakeHeadY+=snakeDirY;
// телепорт через край
if(snakeHeadX<0)snakeHeadX=7;
if(snakeHeadX>7)snakeHeadX=0;
if(snakeHeadY<0)snakeHeadY=15;
if(snakeHeadY>15)snakeHeadY=0;
// перевірка програшу
for(int i=1;i<snakeLength;i++)
if(snakeHeadX==snakeTailX[i] && snakeHeadY==snakeTailY[i]){
score=snakeLength; // записуємо рахунок
gb.sound(1);
delay(1000);
return false; // вихід з гри
}
// перевірка їжі
if(snakeHeadX==snakeFoodX && snakeHeadY==snakeFoodY){
snakeLength++;
snakeFoodX=random(8);
snakeFoodY=random(16);
gb.sound(1);
}
// малювання
gb.clearDisplay();
for(int i=0;i<snakeLength;i++)
gb.setLed(snakeTailX[i],snakeTailY[i],1);
gb.setLed(snakeFoodX,snakeFoodY,1);
gb.setLed(snakeHeadX,snakeHeadY,1);
// керування
int key=gb.getKey();
if(key==5 && snakeDirX!=-1) snakeDirX=1, snakeDirY=0; // вправо
if(key==4 && snakeDirX!= 1) snakeDirX=-1, snakeDirY=0; // вліво
if(key==6 && snakeDirY!=-1) snakeDirY=1, snakeDirX=0; // вниз
if(key==3 && snakeDirY!= 1) snakeDirY=-1, snakeDirX=0; // вгору
delay(120); // швидкість гри
return true;
}
// ===== SNAKE end =====
void setup(){ gb.begin(0); setupSnake(); }
void loop(){ if(!loopSnake()) setupSnake(); }