Arkanoid | arduino uno

Typ_projektu
Arduino
Zdjecie główne
Początkowy ekran gry Arkanoid wyświetlany przed rozpoczęciem rozgrywki, z tytułem i inicjałami autorów
Krótki opis projektu

Projekt jest implementacją klasycznej gry Arkanoid. Jest to jedna z pierwszych gier zręcznościowych wykorzystujących grafikę na wyświetlaczach. Pojawiła się w automatach i na domowych konsolach w latach 80. XX wieku, jako rozwinięcie pomysłu z klasycznego Breakouta.

Gra rozgrywa się na dwuwymiarowej planszy do gry podzielonej na prostokątne pola - celem gracza jest odbijanie piłki za pomocą poziomej platformy i niszczenie bloczków rozmieszczonych na ekranie. Dynamika gry wynika z prostych zasad odbić i kolizji, a jej trudność rośnie z kolejnymi poziomami gry.

 

Niezbędne elementy

1. Płytka Arduino UNO

2. Shield SIC Game Console

 

Sprzęt

Gra wyświetlana jest na ekranie OLED 128x64 piksele z wykorzystaniem biblioteki Adafruit SSD1306. Obsługuje przyciski kierunkowe (lewo/prawo) oraz przycisk startu (zatwierdzania):

  • BUTTON_LEFT – przesunięcie platformy w lewo

  • BUTTON_RIGHT – przesunięcie platformy w prawo

  • BUTTON_CONTINUE – zatwierdzanie, przejścia i start gry

 

Opis projektu

Gra rozgrywa się na dwuwymiarowej planszy złożonej z 16 kolumn i 8 wierszy komórek (bloczków), które mogą być zwykłe lub specjalne (z efektem power-up). Gracz steruje platformą u dołu ekranu, której zadaniem jest odbijanie piłki w stronę bloczków.

Piłka odbija się od ścian, platformy i bloczków. Trafienie w bloczek powoduje jego zniknięcie i zmianę kierunku ruchu piłki. Jeżeli piłka dotknie dolnej krawędzi ekranu, gracz przegrywa – wyświetlana jest animacja przegranej, a gracz może uruchomić grę ponownie przyciskiem.

 
ELEMENTY GRY I ICH DZIAŁANIE
1. Ekran początkowy

Gra rozpoczyna się od ekranu tytułowego z nazwą „Arkanoid” oraz inicjałami autorów. Po chwili automatycznie uruchamiana jest gra.

początek
2. Obsługa wyświetlacza

Do wyświetlania elementów gry wykorzystywana jest biblioteka Adafruit SSD1306 – gra rysuje prostokąty (bloczków, platformy), kwadraty (piłki), tekst i animacje. Ekran odświeżany jest co 30 ms.

3. Poziomy trudności

Gra zawiera trzy poziomy, każdy o innym układzie bloczków i prędkości piłki:

  • Poziom 1: Jeden rząd bloczków – poziom łatwy, gracz uczy się zasad, porusza paletką i zbija pierwsze klocki

  • Poziom 2: Kolumny bloczków z losowymi power-upami – poziom średni, piłka może przyspieszać, a gracz musi być bardziej precyzyjny

  • Poziom 3: Ramka bloczków i losowe przeszkody – poziom trudny, duża liczba trudnych do zbicia klocków, szybka piłka i ograniczony margines błędu

            poziom 1      poziom 2      poziom 3

Po zniszczeniu wszystkich bloczków gracz przechodzi automatycznie do kolejnego poziomu. Po poziomie trzecim gra wraca do poziomu pierwszego.

4. Power-upy

Power-upy to specjalne bloczki, które są losowo rozstawiane tylko na początku poziomu 2 i 3. Gracz nie ma wpływu na ich pojawienie – są ustalane losowo przy generowaniu planszy.

Po trafieniu w bloczek z power-upem:

  • platforma gracza powiększa się z 32 do 48 pikseli,

  • efekt trwa dokładnie 5 sekund,

  • po tym czasie platforma wraca do swojej normalnej szerokości.

Power-upy nie pojawiają się ponownie – działają raz po trafieniu i nie są odświeżane w trakcie poziomu.

5. Zasady przegranej

Gdy piłka spadnie poniżej ekranu, zmienna GAMEOVER zostaje aktywowana. Gra zatrzymuje się i wyświetlana jest animacja smutnej buzi. Na ekranie pojawia się pytanie „Jeszcze raz?”, a gracz może rozpocząć nową grę naciskając przycisk LEFT.

                smutna buźka            jeszcze raz?

Niezależnie od tego, na którym poziomie gracz przegra (1, 2 lub 3), gra zawsze resetuje się do poziomu pierwszego. Nie ma możliwości kontynuacji z poziomu, na którym nastąpiła przegrana. Aby ukończyć wszystkie poziomy, trzeba przejść je w jednej sesji bez utraty piłki.

6. Obsługa wejścia

Przyciski LEFT i RIGHT przesuwają platformę w lewo i prawo w granicach ekranu. Stan przycisków odczytywany jest co iterację pętli loop().

 

DZIAŁANIE WAŻNYCH FUNKCJI
  • start() – inicjalizuje poziom gry, pozycję platformy, piłki i stan planszy

  • draw() – rysuje wszystkie elementy gry (platforma, piłka, bloczki)

  • win() – automatycznie przechodzi do kolejnego poziomu

  • reset() – resetuje grę do poziomu pierwszego

  • loadLevel(level) – ustawia układ bloczków w zależności od poziomu

  • showSadAnimation() – animacja przegranej

  • showTitleScreen() – ekran początkowy

 

NAPOTKANE TRUDNOŚCI

W trakcie testowania gry pojawiły się pewne trudności techniczne. W bardziej złożonych planszach, przy dużej liczbie klocków, zdarzało się, że część z nich nie reagowała poprawnie na kolizje - niektóre bloczki potrafiły się zawiesić i nie chciały ulec zniszczeniu. W szczególności przy trafieniu w kant bloczka, nie zawsze było wykrywane poprawne trafienie, przez co blok nie znikał. Złożoność kolizji i ograniczenia platformy (Arduino UNO + OLED) stanowiły duże wyzwanie optymalizacyjne.

 

kod programu
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <avr/pgmspace.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
//tutaj tworzymy animacje smutnej buzi po przegranej 
#define FRAME_DELAY (42)
#define FRAME_WIDTH (48)
#define FRAME_HEIGHT (48)
#define FRAME_COUNT (sizeof(frames) / sizeof(frames[0]))
const byte PROGMEM frames[][288] = {
  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,240,0,0,0,0,255,255,0,0,0,3,192,3,192,0,0,15,0,0,240,0,0,28,0,0,56,0,0,112,0,0,12,0,0,224,0,0,7,0,0,192,0,0,3,0,1,128,0,0,1,128,3,0,0,0,0,192,6,0,0,0,0,96,6,0,0,0,0,96,12,15,224,7,240,48,12,60,248,31,60,48,24,48,24,24,12,24,24,0,0,0,0,24,24,0,0,0,0,24,48,0,0,0,0,12,48,0,0,0,0,12,48,0,0,0,0,12,48,0,15,240,0,12,48,0,63,252,0,12,48,0,120,30,0,12,48,0,224,7,0,12,48,1,192,3,128,12,48,3,128,1,192,12,48,3,0,0,192,12,24,3,0,0,192,24,24,6,0,0,96,24,24,6,0,0,96,24,12,7,255,255,224,48,12,7,255,255,224,48,6,0,0,0,0,96,6,0,0,0,0,224,3,0,0,0,0,192,1,128,0,0,1,128,0,192,0,0,3,0,0,224,0,0,7,0,0,48,0,0,12,0,0,28,0,0,56,0,0,15,0,0,240,0,0,3,224,7,192,0,0,0,255,255,0,0,0,0,15,240,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,15,240,0,0,0,0,255,255,0,0,0,3,192,3,192,0,0,15,0,0,240,0,0,28,0,0,56,0,0,112,0,0,12,0,0,224,0,0,7,0,0,192,0,0,3,0,1,128,0,0,1,128,3,0,0,0,0,192,6,0,0,0,0,96,6,0,0,0,0,96,12,15,224,7,240,48,12,60,248,31,60,48,24,48,24,24,12,24,24,0,0,0,12,24,24,0,0,0,14,24,48,0,0,0,12,12,48,0,0,0,1,12,48,0,0,0,1,12,48,0,15,240,2,12,48,0,63,252,0,12,48,0,120,30,0,12,48,0,224,7,0,12,48,1,192,3,128,12,48,3,128,1,192,12,48,3,0,0,192,12,24,3,0,0,192,24,24,6,0,0,96,24,24,6,0,0,96,24,12,7,255,255,224,48,12,7,255,255,224,48,6,0,0,0,0,96,6,0,0,0,0,224,3,0,0,0,0,192,1,128,0,0,1,128,0,192,0,0,3,0,0,224,0,0,7,0,0,48,0,0,12,0,0,28,0,0,56,0,0,15,0,0,240,0,0,3,224,7,192,0,0,0,255,255,0,0,0,0,15,240,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,15,240,0,0,0,0,255,255,0,0,0,3,192,3,192,0,0,15,0,0,240,0,0,28,0,0,56,0,0,112,0,0,12,0,0,224,0,0,7,0,0,192,0,0,3,0,1,128,0,0,1,128,3,0,0,0,0,192,6,0,0,0,0,96,6,0,0,0,0,96,12,15,224,7,240,48,12,60,248,31,60,48,24,48,24,24,12,24,24,0,0,0,0,24,24,0,0,0,14,24,48,0,0,0,15,12,48,0,0,0,5,140,48,0,0,0,4,140,48,0,15,240,4,204,48,0,63,252,4,76,48,0,120,30,4,76,48,0,224,7,7,204,48,1,192,3,131,140,48,3,128,1,192,12,48,3,0,0,192,12,24,3,0,0,192,24,24,6,0,0,96,24,24,6,0,0,96,24,12,7,255,255,224,48,12,7,255,255,224,48,6,0,0,0,0,96,6,0,0,0,0,224,3,0,0,0,0,192,1,128,0,0,1,128,0,192,0,0,3,0,0,224,0,0,7,0,0,48,0,0,12,0,0,28,0,0,56,0,0,15,0,0,240,0,0,3,224,7,192,0,0,0,255,255,0,0,0,0,15,240,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,15,240,0,0,0,0,255,255,0,0,0,3,192,3,192,0,0,15,0,0,240,0,0,28,0,0,56,0,0,112,0,0,12,0,0,224,0,0,7,0,0,192,0,0,3,0,1,128,0,0,1,128,3,0,0,0,0,192,6,0,0,0,0,96,6,0,0,0,0,96,12,15,224,7,240,48,12,60,248,31,60,48,24,48,24,24,12,24,24,0,0,0,0,24,24,0,0,0,0,24,48,0,0,0,15,12,48,0,0,0,15,140,48,0,0,0,7,204,48,0,15,240,6,236,48,0,63,252,6,124,48,0,120,30,6,60,48,0,224,7,6,28,48,1,192,3,134,28,48,3,128,1,198,28,48,3,0,0,198,28,24,3,0,0,199,56,24,6,0,0,99,248,24,6,0,0,97,248,12,7,255,255,224,48,12,7,255,255,224,48,6,0,0,0,0,96,6,0,0,0,0,224,3,0,0,0,0,192,1,128,0,0,1,128,0,192,0,0,3,0,0,224,0,0,7,0,0,48,0,0,12,0,0,28,0,0,56,0,0,15,0,0,240,0,0,3,224,7,192,0,0,0,255,255,0,0,0,0,15,240,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,15,240,0,0,0,0,255,255,0,0,0,3,192,3,192,0,0,15,0,0,240,0,0,28,0,0,56,0,0,112,0,0,12,0,0,224,0,0,7,0,0,192,0,0,3,0,1,128,0,0,1,128,3,0,0,0,0,192,6,0,0,0,0,96,6,7,192,3,224,96,12,31,240,15,248,48,12,56,56,28,28,48,24,32,24,24,4,24,24,0,0,0,0,24,24,0,0,0,0,24,48,24,0,0,0,12,48,16,0,0,6,12,48,0,0,0,7,140,48,0,0,0,7,204,48,0,31,248,6,236,48,0,60,60,6,124,48,0,224,7,6,60,48,0,192,3,2,28,48,1,128,1,130,28,48,3,0,0,195,28,24,3,0,0,195,28,24,6,0,0,99,24,24,6,0,0,99,248,12,6,31,248,97,248,12,7,255,255,224,48,6,7,224,7,224,96,6,0,0,0,0,224,3,0,0,0,0,192,1,128,0,0,1,128,0,192,0,0,3,0,0,224,0,0,7,0,0,48,0,0,12,0,0,28,0,0,56,0,0,15,0,0,240,0,0,3,224,7,192,0,0,0,255,255,0,0,0,0,15,240,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,15,240,0,0,0,0,255,255,0,0,0,3,192,3,192,0,0,15,0,0,240,0,0,28,0,0,56,0,0,112,0,0,12,0,0,224,0,0,7,0,0,192,0,0,3,0,1,128,0,0,1,128,3,0,0,0,0,192,6,7,192,3,224,96,6,31,240,15,248,96,12,56,120,30,28,48,12,32,24,24,4,48,24,0,0,0,0,24,24,0,0,0,0,24,24,0,0,0,0,24,48,24,0,0,0,12,48,56,0,0,0,12,48,56,0,0,2,12,48,48,0,0,7,140,48,0,7,224,7,204,48,0,31,248,3,108,48,0,120,30,3,60,48,0,224,7,3,60,48,1,192,3,131,28,48,1,128,1,131,28,24,3,0,0,195,28,24,3,0,0,195,12,24,6,0,0,99,12,12,6,0,0,97,156,12,6,0,0,97,248,6,7,255,255,224,112,6,7,255,255,224,224,3,0,0,0,0,192,1,128,0,0,1,128,0,192,0,0,3,0,0,224,0,0,7,0,0,48,0,0,12,0,0,28,0,0,56,0,0,15,0,0,240,0,0,3,224,7,192,0,0,0,255,255,0,0,0,0,15,240,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,15,240,0,0,0,0,255,255,0,0,0,3,192,3,192,0,0,15,0,0,240,0,0,28,0,0,56,0,0,112,0,0,12,0,0,224,0,0,7,0,0,192,0,0,3,0,1,128,0,0,1,128,3,0,0,0,0,192,6,15,224,7,240,96,6,63,240,15,252,96,12,48,24,24,12,48,12,0,0,0,0,48,24,0,0,0,0,24,24,0,0,0,0,24,24,0,0,0,0,24,48,16,0,0,0,12,48,120,0,0,0,12,48,120,0,0,0,12,48,208,0,0,0,12,48,144,0,0,3,140,49,144,31,248,3,204,48,240,63,252,3,236,48,224,240,15,3,60,48,0,192,3,3,60,48,1,128,1,131,28,24,3,128,1,195,12,24,3,0,0,193,12,24,6,0,0,97,12,12,6,0,0,97,140,12,6,0,0,97,140,6,7,255,255,225,252,6,7,255,255,224,248,3,0,0,0,0,192,1,128,0,0,1,128,0,192,0,0,3,0,0,224,0,0,7,0,0,48,0,0,12,0,0,28,0,0,56,0,0,15,0,0,240,0,0,3,224,7,192,0,0,0,255,255,0,0,0,0,15,240,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,15,240,0,0,0,0,255,255,0,0,0,3,192,3,192,0,0,15,0,0,240,0,0,28,0,0,56,0,0,112,0,0,12,0,0,224,0,0,7,0,0,192,0,0,3,0,1,128,0,0,1,128,3,0,0,0,0,192,6,7,192,3,224,96,6,31,240,15,248,96,12,56,120,30,28,48,12,32,24,24,4,48,24,0,0,0,0,24,24,0,0,0,0,24,24,0,0,0,0,24,48,0,0,0,0,12,48,48,0,0,0,12,48,248,0,0,0,12,49,240,0,0,0,12,51,176,7,224,0,12,55,48,31,248,3,12,54,48,120,30,3,204,54,112,224,7,3,252,54,113,192,3,129,60,62,113,128,1,129,156,31,227,0,0,193,156,31,227,0,0,193,140,27,134,0,0,97,140,12,6,0,0,97,142,12,6,0,0,97,134,6,7,255,255,225,142,6,7,255,255,224,252,3,0,0,0,0,252,1,128,0,0,1,128,0,192,0,0,3,0,0,224,0,0,7,0,0,48,0,0,12,0,0,28,0,0,56,0,0,15,0,0,240,0,0,3,224,7,192,0,0,0,255,255,0,0,0,0,15,240,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,15,240,0,0,0,0,255,255,0,0,0,3,192,3,192,0,0,15,0,0,240,0,0,28,0,0,56,0,0,112,0,0,12,0,0,224,0,0,7,0,0,192,0,0,3,0,1,128,0,0,1,128,3,0,0,0,0,192,6,0,0,0,0,96,6,7,192,3,224,96,12,31,240,15,248,48,12,56,56,28,28,48,24,32,24,24,4,24,24,0,0,0,0,24,24,0,0,0,0,24,48,0,0,0,0,12,48,0,0,0,0,12,48,112,0,0,0,12,49,240,0,0,0,12,51,240,31,248,0,12,55,240,60,60,0,12,55,96,224,7,3,140,62,96,192,3,3,236,62,97,128,1,129,252,60,99,0,0,193,188,28,99,0,0,193,156,31,230,0,0,97,140,31,198,0,0,97,140,15,134,31,248,97,134,12,7,255,255,225,134,6,7,224,7,225,134,6,0,0,0,0,198,3,0,0,0,0,252,1,128,0,0,1,248,0,192,0,0,3,0,0,224,0,0,7,0,0,48,0,0,12,0,0,28,0,0,56,0,0,15,0,0,240,0,0,3,224,7,192,0,0,0,255,255,0,0,0,0,15,240,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,15,240,0,0,0,0,255,255,0,0,0,3,192,3,192,0,0,15,0,0,240,0,0,28,0,0,56,0,0,112,0,0,12,0,0,224,0,0,7,0,0,192,0,0,3,0,1,128,0,0,1,128,3,0,0,0,0,192,6,0,0,0,0,96,6,0,0,0,0,96,12,15,224,7,240,48,12,60,248,31,60,48,24,48,24,24,12,24,24,0,0,0,0,24,24,0,0,0,0,24,48,0,0,0,0,12,48,0,0,0,0,12,48,0,0,0,0,12,48,96,15,240,0,12,49,224,63,252,0,12,51,224,120,30,0,12,55,224,224,7,1,140,62,225,192,3,131,236,60,227,128,1,193,252,60,227,0,0,193,188,28,195,0,0,193,156,28,198,0,0,97,140,31,198,0,0,97,142,15,199,255,255,225,134,15,7,255,255,225,134,6,0,0,0,1,134,6,0,0,0,0,198,3,0,0,0,0,254,1,128,0,0,1,252,0,192,0,0,3,0,0,224,0,0,7,0,0,48,0,0,12,0,0,28,0,0,56,0,0,15,0,0,240,0,0,3,224,7,192,0,0,0,255,255,0,0,0,0,15,240,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,15,240,0,0,0,0,255,255,0,0,0,3,192,3,192,0,0,15,0,0,240,0,0,28,0,0,56,0,0,112,0,0,12,0,0,224,0,0,7,0,0,192,0,0,3,0,1,128,0,0,1,128,3,0,0,0,0,192,6,0,0,0,0,96,6,15,224,7,240,96,12,31,240,15,248,48,12,56,56,28,28,48,24,32,16,0,4,24,24,0,0,0,0,24,24,0,0,0,0,24,48,0,0,0,0,12,48,0,0,0,0,12,48,0,0,0,0,12,48,0,15,240,0,12,48,192,63,252,0,12,49,224,120,30,0,12,55,224,224,7,0,12,62,193,192,3,128,12,60,195,128,1,192,12,60,195,0,0,192,12,24,195,0,0,192,24,24,198,0,0,96,24,25,198,0,0,96,24,29,198,255,255,96,48,31,135,255,255,224,48,15,0,0,0,0,96,6,0,0,0,0,224,3,0,0,0,0,192,1,128,0,0,1,128,0,192,0,0,3,0,0,224,0,0,7,0,0,48,0,0,12,0,0,28,0,0,56,0,0,15,0,0,240,0,0,3,224,7,192,0,0,0,255,255,0,0,0,0,15,240,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,15,240,0,0,0,0,255,255,0,0,0,3,192,3,192,0,0,15,0,0,240,0,0,28,0,0,56,0,0,112,0,0,12,0,0,224,0,0,7,0,0,192,0,0,3,0,1,128,0,0,1,128,3,0,0,0,0,192,6,3,128,1,192,96,6,31,240,15,248,96,12,56,120,30,28,48,12,48,24,24,12,48,24,0,0,0,0,24,24,0,0,0,0,24,24,0,0,0,0,24,48,0,0,0,0,12,48,0,0,0,0,12,48,0,0,0,0,12,48,0,15,240,0,12,48,0,63,252,0,12,48,192,120,30,0,12,51,192,224,7,0,12,55,193,192,3,128,12,63,195,128,1,192,12,61,195,0,0,192,12,25,131,0,0,192,24,57,134,0,0,96,24,57,134,0,0,96,24,57,134,31,248,96,48,63,135,255,255,224,48,31,0,0,0,32,96,15,0,0,0,0,224,3,0,0,0,0,192,1,128,0,0,1,128,0,192,0,0,3,0,0,224,0,0,7,0,0,48,0,0,12,0,0,28,0,0,56,0,0,15,0,0,240,0,0,3,224,7,192,0,0,0,255,255,0,0,0,0,15,240,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,15,240,0,0,0,0,255,255,0,0,0,3,192,3,192,0,0,15,0,0,240,0,0,28,0,0,56,0,0,112,0,0,12,0,0,224,0,0,7,0,0,192,0,0,3,0,1,128,0,0,1,128,3,0,0,0,0,192,6,15,224,7,240,96,6,63,240,15,252,96,12,48,24,24,12,48,12,0,0,0,0,48,24,0,0,0,0,24,24,0,0,0,8,24,24,0,0,0,0,24,48,0,0,0,0,12,48,0,0,0,0,12,48,0,0,0,0,12,48,0,15,240,0,12,48,0,63,252,0,12,48,0,120,30,0,12,49,192,224,7,0,12,55,193,192,3,128,12,63,195,128,1,192,12,61,131,0,0,192,12,57,131,0,0,192,24,57,134,0,0,96,24,49,134,0,0,96,24,49,134,0,0,96,48,51,135,255,255,224,48,63,131,255,255,192,96,31,0,0,0,0,224,3,0,0,0,0,192,1,128,0,0,1,128,0,192,0,0,3,0,0,224,0,0,7,0,0,48,0,0,12,0,0,28,0,0,56,0,0,15,0,0,240,0,0,3,224,7,192,0,0,0,255,255,0,0,0,0,15,240,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,15,240,0,0,0,0,255,255,0,0,0,3,192,3,192,0,0,15,0,0,240,0,0,28,0,0,56,0,0,112,0,0,12,0,0,224,0,0,7,0,0,192,0,0,3,0,1,128,0,0,1,128,3,0,0,0,0,192,6,7,192,3,224,96,6,31,240,15,248,96,12,56,120,30,28,48,12,32,24,24,4,48,24,0,0,0,0,24,24,0,0,0,12,24,24,0,0,0,14,24,48,0,0,0,12,12,48,0,0,0,1,12,48,0,0,0,1,12,48,0,0,0,2,12,48,0,31,248,0,12,48,0,60,60,0,12,49,192,224,7,0,12,55,192,192,3,0,12,63,129,128,1,128,12,61,131,0,0,192,12,57,131,0,0,192,24,57,134,0,0,96,24,49,134,0,0,96,24,49,134,0,0,96,48,51,135,255,255,224,48,63,7,255,255,224,96,31,0,0,0,0,224,15,0,0,0,0,192,1,128,0,0,1,128,0,192,0,0,3,0,0,224,0,0,7,0,0,48,0,0,12,0,0,28,0,0,56,0,0,15,0,0,240,0,0,3,224,7,192,0,0,0,255,255,0,0,0,0,15,240,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,15,240,0,0,0,0,255,255,0,0,0,3,192,3,192,0,0,15,0,0,240,0,0,28,0,0,56,0,0,112,0,0,12,0,0,224,0,0,7,0,0,192,0,0,3,0,1,128,0,0,1,128,3,0,0,0,0,192,6,0,0,0,0,96,6,7,192,3,224,96,12,31,240,15,248,48,12,56,56,28,28,48,24,32,24,24,4,24,24,0,0,0,0,24,24,0,0,0,14,24,48,0,0,0,15,12,48,0,0,0,5,140,48,0,0,0,4,140,48,0,0,0,4,204,48,0,7,224,4,76,48,0,31,248,4,76,48,0,120,30,7,204,48,0,224,7,3,140,48,1,192,3,128,12,48,1,128,1,128,12,24,3,0,0,192,24,24,3,0,0,192,24,24,6,0,0,96,24,12,6,0,0,96,48,12,6,255,255,96,48,6,7,255,255,224,96,6,4,0,0,32,224,3,0,0,0,0,192,1,128,0,0,1,128,0,192,0,0,3,0,0,224,0,0,7,0,0,48,0,0,12,0,0,28,0,0,56,0,0,15,0,0,240,0,0,3,224,7,192,0,0,0,255,255,0,0,0,0,15,240,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,15,240,0,0,0,0,255,255,0,0,0,3,192,3,192,0,0,15,0,0,240,0,0,28,0,0,56,0,0,112,0,0,12,0,0,224,0,0,7,0,0,192,0,0,3,0,1,128,0,0,1,128,3,0,0,0,0,192,6,0,0,0,0,96,6,0,0,0,0,96,12,15,224,7,240,48,12,60,248,31,60,48,24,48,24,24,12,24,24,0,0,0,0,24,24,0,0,0,0,24,48,0,0,0,15,12,48,0,0,0,15,140,48,0,0,0,7,204,48,0,0,0,6,236,48,0,0,0,6,124,48,0,31,248,6,60,48,0,63,252,6,28,48,0,240,15,6,28,48,0,192,3,6,28,48,1,128,1,134,28,24,3,128,1,199,56,24,3,0,0,195,248,24,6,0,0,97,248,12,6,0,0,96,48,12,6,127,254,96,48,6,7,255,255,224,96,6,7,128,1,224,224,3,0,0,0,0,192,1,128,0,0,1,128,0,192,0,0,3,0,0,224,0,0,7,0,0,48,0,0,12,0,0,28,0,0,56,0,0,15,0,0,240,0,0,3,224,7,192,0,0,0,255,255,0,0,0,0,15,240,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,15,240,0,0,0,0,255,255,0,0,0,3,192,3,192,0,0,15,0,0,240,0,0,28,0,0,56,0,0,112,0,0,12,0,0,224,0,0,7,0,0,192,0,0,3,0,1,128,0,0,1,128,3,0,0,0,0,192,6,0,0,0,0,96,6,7,192,3,224,96,12,31,240,15,248,48,12,56,56,28,28,48,24,32,24,24,4,24,24,0,0,0,0,24,24,0,0,0,0,24,48,0,0,0,0,12,48,0,0,0,6,12,48,0,0,0,7,140,48,0,0,0,7,204,48,0,7,224,6,236,48,0,31,248,6,124,48,0,120,30,6,60,48,0,224,7,2,28,48,1,192,3,130,28,48,1,128,1,131,28,24,3,0,0,195,28,24,3,0,0,195,24,24,6,0,0,99,248,12,6,0,0,97,248,12,6,255,255,96,48,6,7,255,255,224,96,6,4,0,0,32,224,3,0,0,0,0,192,1,128,0,0,1,128,0,192,0,0,3,0,0,224,0,0,7,0,0,48,0,0,12,0,0,28,0,0,56,0,0,15,0,0,240,0,0,3,224,7,192,0,0,0,255,255,0,0,0,0,15,240,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,15,240,0,0,0,0,255,255,0,0,0,3,192,3,192,0,0,15,0,0,240,0,0,28,0,0,56,0,0,112,0,0,12,0,0,224,0,0,7,0,0,192,0,0,3,0,1,128,0,0,1,128,3,0,0,0,0,192,6,7,192,3,224,96,6,31,240,15,248,96,12,56,120,30,28,48,12,32,24,24,4,48,24,0,0,0,0,24,24,0,0,0,0,24,24,0,0,0,0,24,48,24,0,0,0,12,48,16,0,0,0,12,48,0,0,0,2,12,48,0,0,0,7,140,48,0,31,248,7,204,48,0,60,60,3,108,48,0,224,7,3,60,48,0,192,3,3,60,48,1,128,1,131,28,48,3,0,0,195,28,24,3,0,0,195,28,24,6,0,0,99,12,24,6,0,0,99,12,12,6,0,0,97,156,12,7,255,255,225,248,6,7,255,255,224,112,6,0,0,0,0,224,3,0,0,0,0,192,1,128,0,0,1,128,0,192,0,0,3,0,0,224,0,0,7,0,0,48,0,0,12,0,0,28,0,0,56,0,0,15,0,0,240,0,0,3,224,7,192,0,0,0,255,255,0,0,0,0,15,240,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,15,240,0,0,0,0,255,255,0,0,0,3,192,3,192,0,0,15,0,0,240,0,0,28,0,0,56,0,0,112,0,0,12,0,0,224,0,0,7,0,0,192,0,0,3,0,1,128,0,0,1,128,3,0,0,0,0,192,6,15,224,7,240,96,6,63,240,15,252,96,12,48,24,24,12,48,12,0,0,0,0,48,24,0,0,0,0,24,24,0,0,0,0,24,24,0,0,0,0,24,48,24,0,0,0,12,48,56,0,0,0,12,48,56,0,0,0,12,48,48,15,240,0,12,48,0,63,252,3,140,48,0,120,30,3,204,48,0,224,7,3,236,48,1,192,3,131,60,48,3,128,1,195,60,48,3,0,0,195,28,24,3,0,0,195,12,24,6,0,0,97,12,24,6,0,0,97,12,12,6,0,0,97,140,12,7,255,255,225,140,6,3,255,255,193,252,6,0,0,0,0,248,3,0,0,0,0,192,1,128,0,0,1,128,0,192,0,0,3,0,0,224,0,0,7,0,0,48,0,0,12,0,0,28,0,0,56,0,0,15,0,0,240,0,0,3,224,7,192,0,0,0,255,255,0,0,0,0,15,240,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,15,240,0,0,0,0,255,255,0,0,0,3,192,3,192,0,0,15,0,0,240,0,0,28,0,0,56,0,0,112,0,0,12,0,0,224,0,0,7,0,0,192,0,0,3,0,1,128,0,0,1,128,3,0,0,0,0,192,6,3,128,1,192,96,6,31,240,15,248,96,12,56,120,30,28,48,12,48,24,24,12,48,24,0,0,0,0,24,24,0,0,0,0,24,24,0,0,0,0,24,48,16,0,0,0,12,48,120,0,0,0,12,48,120,0,0,0,12,48,208,15,240,0,12,48,144,63,252,0,12,49,144,120,30,3,12,48,240,224,7,3,204,48,225,192,3,131,252,48,3,128,1,193,60,48,3,0,0,193,156,24,3,0,0,193,156,24,6,0,0,97,140,24,6,0,0,97,140,12,6,31,248,97,142,12,7,255,255,225,134,6,0,0,0,33,142,6,0,0,0,0,252,3,0,0,0,0,252,1,128,0,0,1,128,0,192,0,0,3,0,0,224,0,0,7,0,0,48,0,0,12,0,0,28,0,0,56,0,0,15,0,0,240,0,0,3,224,7,192,0,0,0,255,255,0,0,0,0,15,240,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,15,240,0,0,0,0,255,255,0,0,0,3,192,3,192,0,0,15,0,0,240,0,0,28,0,0,56,0,0,112,0,0,12,0,0,224,0,0,7,0,0,192,0,0,3,0,1,128,0,0,1,128,3,0,0,0,0,192,6,0,0,0,0,96,6,15,224,7,240,96,12,31,240,15,248,48,12,56,56,28,28,48,24,32,16,0,4,24,24,0,0,0,0,24,24,0,0,0,0,24,48,0,0,0,0,12,48,48,0,0,0,12,48,248,0,0,0,12,49,240,15,240,0,12,51,176,63,252,0,12,55,48,120,30,0,12,54,48,224,7,3,140,54,113,192,3,131,236,54,115,128,1,193,252,62,115,0,0,193,188,31,227,0,0,193,156,31,230,0,0,97,140,27,134,0,0,97,140,12,6,255,255,97,134,12,7,255,255,225,134,6,0,0,0,1,134,6,0,0,0,0,198,3,0,0,0,0,252,1,128,0,0,1,248,0,192,0,0,3,0,0,224,0,0,7,0,0,48,0,0,12,0,0,28,0,0,56,0,0,15,0,0,240,0,0,3,224,7,192,0,0,0,255,255,0,0,0,0,15,240,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,15,240,0,0,0,0,255,255,0,0,0,3,192,3,192,0,0,15,0,0,240,0,0,28,0,0,56,0,0,112,0,0,12,0,0,224,0,0,7,0,0,192,0,0,3,0,1,128,0,0,1,128,3,0,0,0,0,192,6,0,0,0,0,96,6,0,0,0,0,96,12,15,224,7,240,48,12,60,248,31,60,48,24,48,24,24,12,24,24,0,0,0,0,24,24,0,0,0,0,24,48,0,0,0,0,12,48,0,0,0,0,12,48,112,0,0,0,12,49,240,15,240,0,12,51,240,63,252,0,12,55,240,120,30,0,12,55,96,224,7,1,140,62,97,192,3,131,236,62,99,128,1,193,252,60,99,0,0,193,188,28,99,0,0,193,156,31,230,0,0,97,140,31,198,0,0,97,142,15,135,255,255,225,134,12,7,255,255,225,134,6,0,0,0,1,134,6,0,0,0,0,198,3,0,0,0,0,254,1,128,0,0,1,252,0,192,0,0,3,0,0,224,0,0,7,0,0,48,0,0,12,0,0,28,0,0,56,0,0,15,0,0,240,0,0,3,224,7,192,0,0,0,255,255,0,0,0,0,15,240,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,15,240,0,0,0,0,255,255,0,0,0,3,192,3,192,0,0,15,0,0,240,0,0,28,0,0,56,0,0,112,0,0,12,0,0,224,0,0,7,0,0,192,0,0,3,0,1,128,0,0,1,128,3,0,0,0,0,192,6,0,0,0,0,96,6,7,192,3,224,96,12,31,240,15,248,48,12,56,56,28,28,48,24,32,24,24,4,24,24,0,0,0,0,24,24,0,0,0,0,24,48,0,0,0,0,12,48,0,0,0,0,12,48,0,0,0,0,12,48,96,0,0,0,12,49,224,31,248,0,12,51,224,60,60,0,12,55,224,224,7,0,12,62,224,192,3,0,12,60,225,128,1,128,12,60,227,0,0,192,12,28,195,0,0,192,24,28,198,0,0,96,24,31,198,0,0,96,24,15,198,31,248,96,48,15,7,255,255,224,48,6,7,224,7,224,96,6,0,0,0,0,224,3,0,0,0,0,192,1,128,0,0,1,128,0,192,0,0,3,0,0,224,0,0,7,0,0,48,0,0,12,0,0,28,0,0,56,0,0,15,0,0,240,0,0,3,224,7,192,0,0,0,255,255,0,0,0,0,15,240,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,15,240,0,0,0,0,255,255,0,0,0,3,192,3,192,0,0,15,0,0,240,0,0,28,0,0,56,0,0,112,0,0,12,0,0,224,0,0,7,0,0,192,0,0,3,0,1,128,0,0,1,128,3,0,0,0,0,192,6,7,192,3,224,96,6,31,240,15,248,96,12,56,120,30,28,48,12,32,24,24,4,48,24,0,0,0,0,24,24,0,0,0,0,24,24,0,0,0,0,24,48,0,0,0,0,12,48,0,0,0,0,12,48,0,0,0,0,12,48,0,0,0,0,12,48,192,7,224,0,12,49,224,31,248,0,12,55,224,120,30,0,12,62,192,224,7,0,12,60,193,192,3,128,12,60,193,128,1,128,12,24,195,0,0,192,24,24,195,0,0,192,24,25,198,0,0,96,24,29,198,0,0,96,48,31,134,0,0,96,48,15,7,255,255,224,96,6,7,255,255,224,224,3,0,0,0,0,192,1,128,0,0,1,128,0,192,0,0,3,0,0,224,0,0,7,0,0,48,0,0,12,0,0,28,0,0,56,0,0,15,0,0,240,0,0,3,224,7,192,0,0,0,255,255,0,0,0,0,15,240,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,15,240,0,0,0,0,255,255,0,0,0,3,192,3,192,0,0,15,0,0,240,0,0,28,0,0,56,0,0,112,0,0,12,0,0,224,0,0,7,0,0,192,0,0,3,0,1,128,0,0,1,128,3,0,0,0,0,192,6,15,224,7,240,96,6,63,240,15,252,96,12,48,24,24,12,48,12,0,0,0,0,48,24,0,0,0,0,24,24,0,0,0,0,24,24,0,0,0,0,24,48,0,0,0,0,12,48,0,0,0,0,12,48,0,0,0,0,12,48,0,0,0,0,12,48,0,0,0,0,12,48,192,31,248,0,12,51,192,63,252,0,12,55,192,240,15,0,12,63,192,192,3,0,12,61,193,128,1,128,12,25,131,128,1,192,24,57,131,0,0,192,24,57,134,0,0,96,24,57,134,0,0,96,48,63,134,0,0,96,48,31,7,255,255,224,96,15,7,255,255,224,224,3,0,0,0,0,192,1,128,0,0,1,128,0,192,0,0,3,0,0,224,0,0,7,0,0,48,0,0,12,0,0,28,0,0,56,0,0,15,0,0,240,0,0,3,224,7,192,0,0,0,255,255,0,0,0,0,15,240,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,15,240,0,0,0,0,255,255,0,0,0,3,192,3,192,0,0,15,0,0,240,0,0,28,0,0,56,0,0,112,0,0,12,0,0,224,0,0,7,0,0,192,0,0,3,0,1,128,0,0,1,128,3,0,0,0,0,192,6,7,192,3,224,96,6,31,240,15,248,96,12,56,120,30,28,48,12,32,24,24,4,48,24,0,0,0,0,24,24,0,0,0,0,24,24,0,0,0,0,24,48,0,0,0,0,12,48,0,0,0,0,12,48,0,0,0,0,12,48,0,0,0,0,12,48,0,7,224,0,12,48,0,31,248,0,12,49,192,120,30,0,12,55,192,224,7,0,12,63,193,192,3,128,12,61,129,128,1,128,12,57,131,0,0,192,24,57,131,0,0,192,24,49,134,0,0,96,24,49,134,0,0,96,48,51,134,0,0,96,48,63,135,255,255,224,96,31,7,255,255,224,224,3,0,0,0,0,192,1,128,0,0,1,128,0,192,0,0,3,0,0,224,0,0,7,0,0,48,0,0,12,0,0,28,0,0,56,0,0,15,0,0,240,0,0,3,224,7,192,0,0,0,255,255,0,0,0,0,15,240,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,15,240,0,0,0,0,255,255,0,0,0,3,192,3,192,0,0,15,0,0,240,0,0,28,0,0,56,0,0,112,0,0,12,0,0,224,0,0,7,0,0,192,0,0,3,0,1,128,0,0,1,128,3,0,0,0,0,192,6,0,0,0,0,96,6,7,192,3,224,96,12,31,240,15,248,48,12,56,56,28,28,48,24,32,24,24,4,24,24,0,0,0,0,24,24,0,0,0,0,24,48,0,0,0,0,12,48,0,0,0,0,12,48,0,0,0,0,12,48,0,0,0,0,12,48,0,31,248,0,12,48,0,60,60,0,12,49,192,224,7,0,12,55,192,192,3,0,12,63,129,128,1,128,12,61,131,0,0,192,12,57,131,0,0,192,24,57,134,0,0,96,24,49,134,0,0,96,24,49,134,31,248,96,48,51,135,255,255,224,48,63,7,224,7,224,96,31,0,0,0,0,224,15,0,0,0,0,192,1,128,0,0,1,128,0,192,0,0,3,0,0,224,0,0,7,0,0,48,0,0,12,0,0,28,0,0,56,0,0,15,0,0,240,0,0,3,224,7,192,0,0,0,255,255,0,0,0,0,15,240,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,15,240,0,0,0,0,255,255,0,0,0,3,192,3,192,0,0,15,0,0,240,0,0,28,0,0,56,0,0,112,0,0,12,0,0,224,0,0,7,0,0,192,0,0,3,0,1,128,0,0,1,128,3,0,0,0,0,192,6,0,0,0,0,96,6,0,0,0,0,96,12,15,224,7,240,48,12,60,248,31,60,48,24,48,24,24,12,24,24,0,0,0,0,24,24,0,0,0,0,24,48,0,0,0,0,12,48,0,0,0,0,12,48,0,0,0,0,12,48,0,15,240,0,12,48,0,63,252,0,12,48,0,120,30,0,12,48,0,224,7,0,12,48,1,192,3,128,12,48,3,128,1,192,12,48,3,0,0,192,12,24,3,0,0,192,24,24,6,0,0,96,24,24,6,0,0,96,24,12,7,255,255,224,48,12,7,255,255,224,48,6,0,0,0,0,96,6,0,0,0,0,224,3,0,0,0,0,192,1,128,0,0,1,128,0,192,0,0,3,0,0,224,0,0,7,0,0,48,0,0,12,0,0,28,0,0,56,0,0,15,0,0,240,0,0,3,224,7,192,0,0,0,255,255,0,0,0,0,15,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
};
#define OLED_RESET    -1
#define SCREEN_I2C_ADDR 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define BUTTON_LEFT   8
#define BUTTON_RIGHT  10

#define BUTTON_CONTINUE 6

//smutna animacja

int currentLevel = 1;
bool POWER_ACTIVE = false;
unsigned long POWER_START_TIME = 0;
bool MAP[16][8];
byte BLOCK_TYPE[16][8];
int WX;
byte WL = 32;
float BX, BY;
float AX = 2, AY = -2;
bool WIN = false;
bool GAMEOVER = false;

void showTitleScreen();
void start();
void showSadAnimation();
void draw();
void win();
void reset();
void loadLevel(int level);

void setup() {
  Serial.begin(9600);
  pinMode(BUTTON_LEFT, INPUT_PULLUP);
  pinMode(BUTTON_RIGHT, INPUT_PULLUP);
 
  pinMode(BUTTON_CONTINUE, INPUT_PULLUP);

  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_I2C_ADDR)) {
    Serial.println(F("OLED init failed"));
    while (1);
  }
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.setTextSize(1);
  showTitleScreen();
  start();
}

void loop() {
  if (GAMEOVER) {
    showSadAnimation();
    display.clearDisplay();
    display.setCursor(20, 30);
    display.setTextSize(1);
    display.print("Jeszcze raz?");
    display.setCursor(0, 57);
display.setTextSize(1);
display.print("<-- TAK");
    display.display();
    while (true) {
      
      if (digitalRead(BUTTON_LEFT) == LOW) {
        reset();
        return;
      }
    }
  }

  if (digitalRead(BUTTON_LEFT) == LOW)  WX -= 4;
  if (digitalRead(BUTTON_RIGHT) == LOW) WX += 4;
  

  if (WX < 0) WX = 0;
  if (WX > SCREEN_WIDTH - WL) WX = SCREEN_WIDTH - WL;

  BX += AX;
  BY += AY;

  if (BX < 0 || BX > SCREEN_WIDTH - 3) AX = -AX;
  if (BY < 0) AY = -AY;
  if (BY >= SCREEN_HEIGHT - 3) {
    GAMEOVER = true;
    return;
  }

  if (BX + 3 >= WX && BX <= WX + WL && BY + 3 >= 60) {
    AY = -AY;
  }

  int cx = int(BX / 8);
  int cy = int(BY / 4);
  if (cx >= 0 && cx < 16 && cy >= 0 && cy < 8 && MAP[cx][cy]) {
    if (BLOCK_TYPE[cx][cy] == 1) {
      WL = 48;
      POWER_ACTIVE = true;
      POWER_START_TIME = millis();
      if (WX + WL > SCREEN_WIDTH) WX = SCREEN_WIDTH - WL;
    }
    MAP[cx][cy] = false;
    AY = -AY;
  }

  display.clearDisplay();
  draw();
  display.display();

  if (POWER_ACTIVE && millis() - POWER_START_TIME > 5000) {
    POWER_ACTIVE = false;
    WL = 32;
    if (WX > SCREEN_WIDTH - WL) WX = SCREEN_WIDTH - WL;
  }

  delay(30);
}

void start() {
  WX = 64 - (WL / 2);
  for (byte x = 0; x < 16; x++) {
    for (byte y = 0; y < 8; y++) {
      MAP[x][y] = false;
      BLOCK_TYPE[x][y] = 0;
    }
  }

  

  if (WX > SCREEN_WIDTH - WL) WX = SCREEN_WIDTH - WL;
  loadLevel(currentLevel);
  if (currentLevel == 1) {
  AX = 3; AY = -3;
  WL = 32;
} else if (currentLevel == 2) {
  AX = 2.5; AY = -2.5; // Mniejsza prędkość
  WL = 25;
} else if (currentLevel == 3) {
  AX = 2.5; AY = -2.5;
  WL = 25;
}
  BX = 64; BY = 52;
  GAMEOVER = false;
}


void draw() {
  display.fillRect(WX, 60, WL, 3, SSD1306_WHITE);
  display.fillRect(BX, BY, 3, 3, SSD1306_WHITE);
  WIN = true;
  for (byte x = 0; x < 16; x++) {
    for (byte y = 0; y < 8; y++) {
      if (MAP[x][y]) {
        WIN = false;
        if (BLOCK_TYPE[x][y] == 1) {
          display.drawRect(x * 8, y * 4, 7, 3, SSD1306_WHITE);
        } else {
          display.fillRect(x * 8, y * 4, 7, 3, SSD1306_WHITE);
        }
      }
    }
  }
  if (WIN) win();
}

void win() {
  currentLevel++;
  if (currentLevel > 3) currentLevel = 1;
  start();
}

void reset() {
  currentLevel = 1;
  start();
}

void loadLevel(int level) {
  if (level == 1) {
    // jeden wiersz bloczków na górze
    for (byte x = 0; x < 16; x++) {
      MAP[x][0] = true;
    }
  } else if (level == 2) {
    // naprzemienne bloczki z power-upami
    for (byte x = 0; x < 16; x++) {
      if (x % 4 == 0) {  // tylko co 4 kolumna
        for (byte y = 0; y < 4; y++) {  // tylko 4 klocki w kolumnie
          MAP[x][y] = true;
          BLOCK_TYPE[x][y] = (random(0, 6) == 0) ? 1 : 0;  // rzadziej power-upy
        }
        }
        }
        
  } else if (level == 3) {
    // trudny poziom: ramka + losowe bloczki w środku
    for (byte x = 0; x < 16; x++) {
      for (byte y = 0; y < 8; y++) {
        if (x == 0 || x == 15 || y == 0 || y == 7 || (random(0, 10) < 2)) {
          MAP[x][y] = true;
          BLOCK_TYPE[x][y] = random(0, 5) == 0 ? 1 : 0;
        }
      }
    }
  }
}


void showSadAnimation() {
  for (int i = 0; i < FRAME_COUNT; i++) {
    display.clearDisplay();
    display.drawBitmap(40, 8, frames[i], FRAME_WIDTH, FRAME_HEIGHT, SSD1306_WHITE);
    display.display();
    delay(FRAME_DELAY);
  }
}

void showTitleScreen() {
  display.clearDisplay();
  display.setCursor(20, 20);
  display.setTextSize(2);
  display.println("Arkanoid");
  display.setTextSize(1);
  display.setCursor(20, 50);
  display.print("by AKx2 + ChatGPT");
  display.display();
  delay(2000);
}
Pliki_projektu
Youtube
Tagi
Arduino OLED SSD1306 Arkanoid RetroGame symulacja fizyczna mechanika kolizji gra 2D reguły odbicia modelowanie ruchu optymalizacja reakcji mikrokontrolery OLED display platformy dynamiczne struktury blokowe programowanie zdarzeniowe programowanie mikrokontrolerów Arduino UNO gry retro symulacja zachowania algorytmy gry kontrola pętli analiza trajektorii sterowanie przyciskami