Skip to content

Latest commit

 

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 

Repository files navigation

ESP32 – Gra zręcznościowa: "DEKODER"

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.


1. CEL GRY

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)

2. SPRZĘT

Wyświetlacz

  • LCD 1602A (HD44780, tryb równoległy 4-bitowy)
  • 2 linie × 16 znaków

Przyciski

  • BUTTON_GAME_PIN = GPIO 4 - PRZYCISK STRZAŁU
    • SETUP: nieaktywny
    • READY: short press = START GRY
    • GAME: press = STRZAŁ (sprawdzenie trafienia)

BUTTON_SETUP_PIN = GPIO 5 - PRZYCISK SETUP/RESET

  • 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

Pinowanie ESP32 WROOM 32D

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)

3. STANY GRY (FSM)

SETUP

  • 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

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

START_SEQUENCE

  • 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

GAME

  • Linia 1:
    • Ruchomy kursor: _ (na polu aktywnym) lub (na polu pełnym - specjalny znak)
    • Pole aktywne (TARGET): (pusta spacja)
    • Pola nieaktywne: (pełne)
  • 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) lub X zamiast brakujących

GAME_OVER

  • Linia 1: KOD: XXXXX (odkryte i nieznane: 1234*)
  • Linia 2: WYGRANA! (zwycięstwo) lub PRZEGANA! (przegrana)
  • Long press GPIO5: Powrót do SETUP i reset gry

4. MECHANIKA

KURSOR

  • 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)

POLE AKTYWNE (TARGET)

  • 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 ()

PRĘDKOŚĆ KURSORA

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

STRZAŁ

  • 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)

KOD

  • 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

SYSTEM ŻYĆ

  • 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)
  • Koniec: Po utracie wszystkich żyć → GAME_OVER (przegrana)

5. PRESETY (POZIOMY TRUDNOŚCI)

Gracz wybiera poziom trudności w SETUP. Każdy poziom ma stałą liczbę cyfr:

⭐ EASY (4 cyfry)

  • 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.

⭐⭐ MEDIUM (6 cyfr)

  • 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.

⭐⭐⭐ HARD (8 cyfr)

  • 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.

⭐⭐⭐⭐ EXTRA (10 cyfr)

  • 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.


6. PRZEPŁYW STANÓW (FSM)

┌─────────────────────────────────────────────────┐
│                    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)

7. INTERFEJS I CUSTOM ZNAKI

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

About

STALKER, gra decoder

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages