#include "GameBoy.h"
// /*хак для справжньої ардуінки потрібно розкоментувати*/class GBmode : public GameBoy { public:void memClear(){for(int x=0;x<8;x++){for(int y=0;y<16;y++){display[x][y]=0;}}}void memSet(short int x, short int y, bool s){if(x>=0&&x<8&&y>=0&&y<16){display[x][y]=s;}}};
// #define GameBoy GBmode
GameBoy gb;
/////////// 0 1 2
enum LEVEL {L0,L1,L_END}; int level = L0;
bool blocksLen[L_END] = {0};//кількість блоків на кожному рівні
bool blocks[L_END][8][8]={ // масив півнів гри
{ {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,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 рівень
{0,0,0,0,0,0,0,0} }, // 0 рівень
{ {0,0,0,0,0,0,0,0}, // 1 рівень
{1,0,0,0,0,0,0,0}, // 1 рівень
{0,0,0,0,0,0,0,0}, // 1 рівень
{0,0,0,0,0,0,0,0}, // 1 рівень
{0,0,0,0,0,0,0,0}, // 1 рівень
{0,0,0,0,0,0,0,0}, // 1 рівень
{0,0,0,0,0,0,0,0}, // 1 рівень
{0,0,0,0,0,0,0,0} } // 1 рівень
};
bool gameOver[16][8]={
{0,0,0,0,0,0,0,0},
{0,0,1,1,1,1,0,0},
{0,1,1,1,1,1,1,0},
{1,1,1,1,1,1,1,1},
{1,1,0,1,1,0,1,1},
{1,1,0,1,1,0,1,1},
{1,1,1,1,1,1,1,1},
{0,1,1,0,0,1,1,0},
{0,0,1,1,1,1,0,0},
{0,0,1,0,0,1,0,0},
{0,0,1,1,1,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,0,0,0,0},
{0,0,0,0,0,0,0,0}
};
bool gameWin[16][8]={
{0,0,0,0,0,0,0,0},
{0,0,1,1,1,1,0,0},
{0,1,1,1,1,1,1,0},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{0,1,1,1,1,1,1,0},
{0,0,1,1,1,1,0,0},
{0,0,0,1,1,0,0,0},
{0,0,0,1,1,0,0,0},
{0,0,1,1,1,1,0,0},
{0,1,1,1,1,1,1,0},
{1,1,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}
};
int xP = 2, lenP = 4;
int xB=0, yB=8, xM=1, yM=-1;
void restart(int t){
// gb.testMatrix(1);
for(int x=0; x<8; x++)for(int y=0; y<16; y++)
gb.setLed(x,y,gameOver[y][x]);
// tone(13, 800, 150); delay(200);
// tone(BUZZER, 400, 200); delay(250);
// tone(BUZZER, 200, 400); delay(450);
delay(1000);
asm volatile("jmp 0"); // Рестарт
}
void setup() {
gb.begin(0);
//цикли для кожного рядочку кожного стовпчика кожного рівня
for(int x=0; x<8; x++)for(int y=0; y<8; y++)
for(int l=0; l<L_END; l++) blocksLen[l]+= blocks[l][y][x];
}
void loop() {
gb.memClear();
// --- ЛОГІКА ПРОГРАШУ ---
if(yB >= 15) {
restart(10);
}
// Рух м'яча
xB+=xM; yB+=yM;
if(xB<=0 || xB>=7) xM*=-1;
if(yB<=0) yM*=-1;
// Відбиття від ракетки
if((yB==13 or yB==14) and xB>=xP and xB<xP+lenP) { yM*=-1; yB=13; }
gb.memSet(xB, yB, 1); // Малюємо м'яч
// Відображення блоків та зіткнення
for(int x=0; x<8; x++)for(int y=0; y<8; y++)if(blocks[level][y][x])
{
gb.memSet(x, y, 1); // Малю ємо блок, якщо він живий
if(x == xB and y == yB) {
blocks[level][y][x] = 0;
blocksLen[level]-=1;
yM *= -1;
if(blocksLen[level]<=0){
level++;
if(level>=L_END){
for(int x=0; x<8; x++)for(int y=0; y<16; y++)
gb.setLed(x,y,gameWin[y][x]);
while(true);
}
gb.testMatrix(10);
return;
}
}
}
// Керування ракеткою
if(gb.getKey() == 4 and xP > 0) xP--;
if(gb.getKey() == 5 and lenP+xP < 8) xP++;
// Малюємо ракетку
for(int x=0; x<lenP; x++) gb.memSet(xP+x, 14, 1);
gb.drawDisplay();
delay(50);
}