#include "GameBoy.h"
GameBoy gb;
int xSnake[128] = {0}; // масив х кординат змії
int ySnake[128] = {0}; // масив y кординат змії
int lenSnake = 5;
void setup() {
gb.begin(15); // gb.begin(0-15) яскравість
xSnake[0]= 4;
ySnake[0]= 8;
}
int gameNumber = 0;
void loop() {
if (gb.getKey() == 1) gameNumber =0;
switch (gameNumber){
case 0: menu(); break;
case 1: drawCarGame(); break;
case 2: drawSnakeGame(); break;
}
}
int gameChoose = 1;
void menu(){
if (gb.getKey() == 4) gameChoose = 1; // кнопка вліво
if (gb.getKey() == 5) gameChoose = 2; // кнопка вправо
if(gameChoose == 1) drawSprite2();
if(gameChoose == 2) drawSprite3();
drawSprite();
if (gb.getKey() == 3){// кнопка вверх
gameNumber= gameChoose;
gb.clearDisplay();
}
}
bool ARROWS[8][8] = {
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 1, 0, 0, 1, 0, 0},
{0, 1, 1, 0, 0, 1, 1, 0},
{1, 1, 1, 0, 0, 1, 1, 1},
{0, 1, 1, 0, 0, 1, 1, 0},
{0, 0, 1, 0, 0, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0}
};
bool CARS[8][8] = {
{1, 0, 1, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 0, 0, 0},
{1, 1, 1, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0}
};
bool SNAKE[8][8] = {
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 1, 1,1, 0, 0, 0},
{0, 0, 1, 0, 1, 0, 0, 0},
{0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0}
};
// функція щоб намалювати спрайт 8*8
void drawSprite(){
// x - рядок нашого спрайту
for(int x=0; x<8; x++)
for(int y=0; y<8; y++)
gb.setLed(y, x, ARROWS[x][y]);
}
void drawSprite2(){
// x - рядок нашого спрайту
for(int x=0; x<8; x++)
for(int y=0; y<8; y++)
gb.setLed(y, x+8, CARS[x][y]);
}
void drawSprite3(){
// x - рядок нашого спрайту
for(int x=0; x<8; x++)
for(int y=0; y<8; y++)
gb.setLed(y, x+8, SNAKE[x][y]);
}
void drawSnakeGame(){ // малює гру змійка
delay(100);
gb.clearDisplay();
makeMove();
move();
food();
drawSnake();
collision();
}
int xFood = 4; // х їжі
int yFood = 8; // у їжі
void food(){ // спавн та з'їдання яблука
// ЯКЩО кординати змійки та їжі рівні, то з'їли
if(xSnake[0] == xFood and ySnake[0] == yFood){
// нескінченно, поки foodCreate брехня
while(!foodCreate()); //foodCreate() == false
lenSnake++;
tone(4, 1000, 100);
}
gb.drawPoint(xFood, yFood);
}
bool foodCreate(){
xFood = random(8);
yFood = random(16);
// перевірити чи кординати їжі збігаються з змійкою
// i - індекс кожного елементу змійки
for(int i = 0; i<lenSnake; i++){
if(xSnake[i] == xFood and ySnake[i] == yFood){
// якщо їжа на змійці повертаємо брехню
return false;
}
}
return true;
}
int up = 1;
int down = 2;
int left = 3;
int right = 4;
int direction = right; // НАПРЯМОК
void makeMove(){ // керуємо нашим рухом
// забороняємо повернутсь у протилежну сторону
// забороняємо перетвортити хвіст на голову
if (gb.getKey() == 5 and direction != left) direction = right; // кнопка вправо
if (gb.getKey() == 4 and direction != right) direction = left; // кнопка вліво
if (gb.getKey() == 3 and direction != down) direction = up; // кнопка вверх
if (gb.getKey() == 6 and direction != up) direction = down; // кнопка вниз
}
void move(){
// Підсунути кожен елемент хвостика
// на місце його попереднього елемента
for(int i = lenSnake-1; i>0; i--){
xSnake[i] = xSnake[i - 1];
ySnake[i] = ySnake[i - 1];
}
if( direction == up){
if (ySnake[0] == 0) ySnake[0] = 15;
else ySnake[0] --;
}
else if(direction == down){
if (ySnake[0] == 15) ySnake[0] = 0;
else ySnake[0]++;
}
else if(direction == left){
if (xSnake[0] == 0) xSnake[0] = 7;
else xSnake[0]--;
}
else if(direction == right){
if (xSnake[0] == 7) xSnake[0] = 0;
else xSnake[0]++;
}
}
void drawSnake(){
for(int i = 0; i<lenSnake; i++){
gb.drawPoint(xSnake[i], ySnake[i]);
}
}
void collision(){
// i - індекс кожного елементу хвоста (все 0)
for(int i = 1; i<lenSnake; i++){
// кожний елемент хвоста чи накладаються на голову
if(xSnake[i] == xSnake[0] and
ySnake[i] == ySnake[0]){
gb.sound(2); // номер мелодії
// нові кординати спавну голови змії
ySnake[0] = 5; //від 0 до 7
xSnake[0] = 5; //від 0 до 15
lenSnake = 2;
gb.testMatrix(10);
}
}
}
/* Початок коду машинок */
int xPlayer = 1;
int xCar = 1;
int speed = 90;
void drawCarGame(){
xCar = random(2) * 3 + 2; // видає число 2 або 5
for (int y = 0; y < 18; y++) {
delay(speed);
gb.clearDisplay();
enemyCar(xCar, y);
if (gb.getKey() == 4) xPlayer = 1; // кнопка вліво
if (gb.getKey() == 5) xPlayer = 4; // кнопка вправо
playerCar(xPlayer, 12);
line(y);
if ((y+4 == 17) && (xPlayer == xCar-1)){
gb.testMatrix(10); // замалбовує екран
break;
}
}
if (speed > 50) speed-=1;
}
void line(int y) {
for (int yLine = y%2; yLine<18; yLine+=3){
gb.drawPoint(0, yLine);
gb.drawPoint(7, yLine);
gb.drawPoint(0, yLine+1);
gb.drawPoint(7, yLine+1);
}
}
void enemyCar(int x, int y) {
gb.drawPoint(x + 0, y + 0);
gb.drawPoint(x + 0, y - 1);
gb.drawPoint(x - 1, y - 1);
gb.drawPoint(x + 1, y - 1);
gb.drawPoint(x + 0, y - 2);
gb.drawPoint(x - 1, y - 3);
gb.drawPoint(x + 1, y - 3);
}
void playerCar(int x, int y) {
gb.drawPoint(x + 1, y + 0); // ніс
gb.drawPoint(x + 0, y + 1); // верхнє ліве колесо
gb.drawPoint(x + 1, y + 1);
gb.drawPoint(x + 2, y + 1); // верхнє праве колесо
gb.drawPoint(x + 1, y + 2);
gb.drawPoint(x + 0, y + 3); // нижнє ліве колесо
gb.drawPoint(x + 2, y + 3); // нижнє праве колесо
}
/* Кінець коду машинок */