Gra polegająca na odkrywaniu losowego kodu poprzez wykonywanie trafionych "strzałów" w odpowiednim momencie, podczas gdy ruchomy kursor porusza się po ekranie LCD. Gracz wybiera poziom trudności i ma 3 żyća.
Gracz musi odkryć losowo wygenerowany kod liczbowy poprzez wykonywanie "strzałów" w odpowiednim momencie, gdy poruszający się kursor znajduje się w aktywnym polu na ekranie LCD.
- Każde poprawne trafienie odkrywa kolejną cyfrę kodu
- Każde chybienie odbiera jedno życie (max 3 życia, wyświetlane jako serduszka)
- Brak żyć = GAME OVER (PRZEGANA)
- Wszystkie cyfry odkryte = GAME OVER (WYGRANA)
- LCD 1602A (HD44780, tryb równoległy 4-bitowy)
- 2 linie × 16 znaków
- BUTTON_GAME_PIN = GPIO 4 - PRZYCISK STRZAŁU
- SETUP: nieaktywny
- READY: short press = START GRY
- GAME: press = STRZAŁ (sprawdzenie trafienia)
- SETUP:
- short press = zmiana poziomu trudności (EASY → MEDIUM → HARD → EXTRA → EASY)
- long press = przejście do READY
- READY:
- short press = powrót do SETUP
- long press = powrót do SETUP
- GAME/GAME_OVER:
- long press = powrót do SETUP i reset gry
LCD RS: GPIO 2 | LCD E: GPIO 12
LCD D4: GPIO 13 | D5: GPIO 14
LCD D6: GPIO 15 | D7: GPIO 16
BUTTON_GAME_PIN: GPIO 4 (INPUT_PULLUP)
BUTTON_SETUP_PIN: GPIO 5 (INPUT_PULLUP)
- Linia 1:
KOD: XXXXX(wygenerowany kod - dla ustawiającego) - Linia 2:
EASY / MEDIUM / HARD / EXTRA(wybrany poziom trudności) - Krótkie wciśnięcie GPIO5: Zmiana poziomu trudności (cyklicznie)
- EASY (4 cyfry) → MEDIUM (6 cyfr) → HARD (8 cyfr) → EXTRA (10 cyfr) → EASY
- Długie wciśnięcie GPIO5: Przejście do READY
- Linia 1:
EASY - 4 CYFRY(lub odpowiadający poziom z liczbą cyfr) - Linia 2:
Wcisnij przycisk - Krótkie wciśnięcie GPIO4: START GRY (przejście do START_SEQUENCE)
- Krótkie/Długie wciśnięcie GPIO5: Powrót do SETUP
- Ekran: Odliczanie
3 → 2 → 1 → 0(po 1 sekundzie każda) - Linia 1: Wyśrodkowana liczba
- Linia 2:
Start... - Po odliczeniu (4 sekundy) automatyczne przejście do GAME
- Linia 1:
- Ruchomy kursor:
_(na polu aktywnym) lub█(na polu pełnym - specjalny znak) - Pole aktywne (TARGET):
(pusta spacja) - Pola nieaktywne:
█(pełne)
- Ruchomy kursor:
- Linia 2:
- Lewo (kolumny 0-11): Odkryte cyfry kodu i
*dla nieznanych (maks 12 znaków, ale większość 4-10 cyfr) - Prawo (kolumny 13-15): Serduszka żyć
❤(1-3 serduszka) lubXzamiast brakujących
- Lewo (kolumny 0-11): Odkryte cyfry kodu i
- Linia 1:
KOD: XXXXX(odkryte i nieznane:1234*) - Linia 2:
WYGRANA!(zwycięstwo) lubPRZEGANA!(przegrana) - Long press GPIO5: Powrót do SETUP i reset gry
- Porusza się ping-pong po całej szerokości ekranu (kolumny 0-15)
- Kierunek: prawo → lewo → prawo (kontinuacja)
- Zmienia kierunek na końcach (0 i 15)
- Losowa pozycja na każdym starcie i po każdym trafieniu
- Dynamiczna szerokość:
- Dla EASY (4 cyfry): Zmniejsza się o 1 z każdym odkrytym znakiem (minimum 1 pole)
- Dla MEDIUM+ (6, 8, 10 cyfr): Zmniejsza się o 1 co DWA odkryte znaki (minimum 1 pole)
- Początkowa szerokość zależy od trudności (6, 6, 5 lub 5 pól)
- Gwarantowane: Pole zawsze mieści się na ekranie (0-15)
- Wizualizacja: Pusta przestrzeń (bez znaku) - wyraźnie różni się od pełnych pól (
█)
Zależy od poziomu trudności:
| Poziom | Cyfry | ms/ruch | Zmniejszanie TARGET |
|---|---|---|---|
| EASY | 4 | 250 | co 1 trafienie |
| MEDIUM | 6 | 150 | co 2 trafienia |
| HARD | 8 | 100 | co 2 trafienia |
| EXTRA | 10 | 80 | co 2 trafienia |
-
HIT (TRAFIENIE): Kursor na polu aktywnym w momencie naciśnięcia GPIO4
- Odkrycie następnej cyfry kodu
- Regeneracja nowego pola TARGET
- Kontynuacja gry
-
MISS (CHYBIENIE): Kursor poza polem aktywnym
- Utrata jednego życia
- Jeśli żyća > 0: Regeneracja pola TARGET, kontynuacja gry
- Jeśli żyća = 0: GAME_OVER (przegrana)
-
VICTORY (ZWYCIĘSTWO): Wszystkie cyfry odkryte
- Przejście do GAME_OVER (wyświetlenie pełnego kodu)
- Wygenerowanie: Losowe na etapie SETUP (widoczny dla ustawiającego)
- Cyfry: 0-9
- Długość: Wybierana w SETUP (3-10 cyfr)
- Wyświetlanie: W drugiej linii jako odkryte cyfry i
*dla nieznanych
- Początkowa liczba: 3 życia
- Utrata: 1 życie na każde chybienie
- Wyświetlanie: Serduszka (
❤) na prawej stronie linii 2 (pozycje 13-15), znikają od lewego serduszka- 3 żyća:
❤❤❤ - 2 żyća:
❤❤X - 1 życie:
❤XX - 0 żyć:
XXX→ GAME_OVER (PRZEGANA)
- 3 żyća:
- Koniec: Po utracie wszystkich żyć → GAME_OVER (przegrana)
Gracz wybiera poziom trudności w SETUP. Każdy poziom ma stałą liczbę cyfr:
- Kod: 4 cyfry
- Prędkość kursora: 250 ms (wolno)
- Pole TARGET: Początkowa szerokość 6 pól, zmniejsza się co 1 trafienie
Idealny dla początkujących - dużo czasu na zareagowanie, szybkie zmniejszanie pola.
- Kod: 6 cyfr
- Prędkość kursora: 150 ms (średnio)
- Pole TARGET: Początkowa szerokość 6 pól, zmniejsza się co 2 trafienia
Średni poziom - wymaga szybszych reakcji, powolniejsze zmniejszanie pola.
- Kod: 8 cyfr
- Prędkość kursora: 100 ms (szybko)
- Pole TARGET: Początkowa szerokość 5 pól, zmniejsza się co 2 trafienia
Trudny - wymaga doskonałych refleksów.
- Kod: 10 cyfr
- Prędkość kursora: 80 ms (bardzo szybko)
- Pole TARGET: Początkowa szerokość 4 pola, zmniejsza się co 2 trafienia
Ekstremalna trudność - challenge dla graczy zaawansowanych.
┌─────────────────────────────────────────────────┐
│ SETUP │
│ Wyświetl kod, wybierz poziom (EASY/MED/...) │
│ Short: zmiana poziomu | Long: dalej │
└─────────────────────────────────────────────────┘
↓
(Long press GPIO5)
↓
┌─────────────────────────────────────────────────┐
│ READY │
│ Pokaż wybrany poziom i liczbę cyfr │
│ Short GPIO4: start | Short/Long GPIO5: wróć │
└─────────────────────────────────────────────────┘
↓
(Short press GPIO4)
↓
┌─────────────────────────────────────────────────┐
│ START_SEQUENCE │
│ Odliczanie: 3 → 2 → 1 → 0 (co 1s) │
└─────────────────────────────────────────────────┘
↓
(Auto po 4 sekundach)
↓
┌──────────────GAME──────────────┐
│ Kursor porusza się (ping-pong) │
│ Gracz strzela (GPIO4) │
│ │
├────────────────────────────────┤
│ TRAFIENIE → odkrycie cyfry │
│ nowe pole TARGET, kontynuacja │
└────────────────────────────────┘
│ │
│ CHYBIENIE → utrata życia │
│ Żyća > 0: kontynuacja │
│ Żyća = 0: GAME_OVER (PRZEGANA) │
└────────────────────────────────┘
│ │
│ WYGRANA → wszystkie cyfry │
│ GAME_OVER (WYGRANA) │
└───────────────────┬──────────────┘
↓
┌─────────────────────────────────────┐
│ GAME_OVER │
│ Wyświetl kod, wynik │
│ Long press GPIO5: powrót do SETUP │
└─────────────────────────────────────┘
↓
(Powrót do SETUP)
Gra używa custom znaków (znaki programowalne LCD 1602A) do wizualizacji:
| Element | Wyświetlanie | Zastosowanie |
|---|---|---|
| Pełne pole | █ |
Nieaktywne pola (poza TARGET) |
| Kursor | _ |
Nawskładajcie na polu TARGET |
█* |
Kursor na polu pełnym | |
| Pole TARGET | (spacja) |
Aktywne pole do kliknięcia |
| Serduszko | ❤ |
Żywa (1-3 sztuki, prawy koniec) |
| Brakujące życie | X |
Zamiast brakujących serduszek |
Custom Character Definicje (8-bitowe bitmappy):
CHAR_FULL: B11111111 (pełne pole)
CHAR_FULL_CURSOR: B11011011 (pełne z przerwą na kursór)
CHAR_HEART: B00101111 (serduszko)
---
## 8. PRZYKŁAD ROZGRYWKI STEP-BY-STEP
### Ekran SETUP:
┌────────────────┐ │KOD: 24681 │ ← Kod dla ustawiającego (6 cyfr) │MEDIUM │ ← Wybrany poziom trudności └────────────────┘
### Ekran READY:
┌────────────────┐ │MEDIUM - 6 CYFR │ │Wcisnij przycisk│ └────────────────┘
### Ekran START_SEQUENCE:
┌────────────────┐ │ 3 │ │Start... │ └────────────────┘
### Ekran GAME (początek):
┌────────────────┐ │██████[ ]█████ │ ← TARGET szerokie (6 pól), kursor poza │***** ❤❤❤│ ← Wszystkie nieznane, 3 żyća └────────────────┘
### Po pierwszym trafieniu:
┌────────────────┐ │███ _ ███████ │ ← TARGET (6 pól), kursor na polu │2**** ❤❤❤│ ← Odkryta: 2, pozostałe nieznane └────────────────┘
### Po 4 trafieniach (MEDIUM zmniejsza się co 2):
┌────────────────┐ │███_ █████████ │ ← TARGET węższe (4 pola: zmniejszył się o 2) │246*1 ❤❤ │ ← Odkryte: 2,4,6,1 Odkryte: 2 │ │ (czwarte trafienie, TARGET zmniejszył się) └────────────────┘
### Ekran GAME_OVER (wygrana):
┌────────────────┐ │KOD: 246816 │ ← Pełny kod │WYGRANA! │ └────────────────┘
### Ekran GAME_OVER (przegrana):
┌────────────────┐ │KOD: 24681* │ ← Odkryte + nieznane │PRZEGANA! │ └────────────────┘
### Ekran GAME_OVER (WYGRANA):
┌────────────────┐ │CODE: 123456789*│ │WIN! Press SET │ └────────────────┘
### Ekran GAME_OVER (PRZEGRANA):
┌────────────────┐ │CODE: 12457* │ │LOSE! Press SET │ └────────────────┘
---
## 9. PODSUMOWANIE FUNKCJONALNOŚCI
✅ **Dynamiczna długość kodu** - 3-10 cyfr
✅ **Trzystopniowy system trudności** - EASY, MEDIUM, HARD
✅ **Ruchomy kursor** - ping-pong po całej szerokości
✅ **Dynamiczna szerokość pola TARGET** - zmniejsza się z postępem
✅ **System 3 żyć** - wizualny wskaźnik serduszkami
✅ **Losowa pozycja pola TARGET** - regeneracja po każdym trafieniu
✅ **Kod widoczny w SETUP** - dla osoby ustawiającej grę
✅ **Płynny interfejs LCD** - brak migotania, optymalizacja CPU
✅ **Obsługa dwóch przycisków** - rozróżnienie short/long press
✅ **Pełny system stanów** - FSM z 5 stanami (SETUP, READY, START_SEQUENCE, GAME, GAME_OVER)
✅ **Serial monitoring** - debug logi wszystkich zdarzeń
✅ **Custom znaki LCD** - serduszka, pola, kursor
---
## 10. TECHNICAL DETAILS
### Debouncing
- **Czas debounce:** 50 ms
- Zapewnia stabilność czytania przycisków
### Pomiar czasu przytrzymania
- **Long press threshold:** > 500 ms
- **Short press:** ≤ 500 ms
### Optymalizacja wyświetlacza
- Ekran odświeża się **tylko gdy zmieni się pozycja kursora**
- Zmniejsza obciążenie CPU
- Eliminuje migotanie
### Zalecana konfiguracja Arduino IDE
Board: ESP32 Dev Module Upload Speed: 115200 Flash Frequency: 80 MHz
---
## Autor
**Push Decoder Game** - Gra zręcznościowa na ESP32 z LCD 1602A