Autor: Catarama Dmitrii
Grupa: 332CD
Proiectul este un joc interactiv cu două moduri: unul în care jucătorii trebuie să apese rapid un buton după un semnal și altul în care trebuie să apese cât mai aproape de un timp țintă (ex. 11 secunde), ambele afișând rezultatele pe un ecran LCD.
Scopul este să testeze și să antreneze viteza de reacție și simțul timpului al jucătorilor, oferind în același timp o experiență competitivă și distractivă în multiplayer.
Am pornit de la ideea unui joc simplu de reflexe, apoi am adăugat și o provocare diferită – estimarea timpului – pentru a diversifica jocul și a-l face mai captivant.
Este util pentru dezvoltarea reflexelor și a percepției temporale, fiind ușor de folosit și distractiv. În plus, ne ajută să punem în practică concepte învățate la laborator, precum lucrul cu întreruperi, afișaje LCD, butoane și module de timp.
Proiectul “TimeStrike” are doua moduri de joc:
1. Modul 1 (Reflex): jucatorii trebuie sa apese butonul intr-un interval cat mai scurt dupa un semnal (ex: sub 0.4s la nivel easy). Poate fi single-player, multi-player. 2. Modul 2 (Tinta de timp): jucatorii trebuie sa apese butonul cat mai aproape de o secunda tinta (ex: 11s).
Module hardware:
Aplicatia a fost dezvoltata si compilata folosind Arduino IDE.
Proiectul nu foloseste librarii externe 3rd-party, fiind implementat complet cu functionalitatea nativa a microcontrollerului AVR:
Aplicatia foloseste o masina de stari pentru a gestiona flow-ul jocului:
typedef enum { MENU, SELECT_REFLEX_MODE, SELECT_DIFFICULTY, WAIT_SIGNAL, SHOW_SIGNAL, RESULT, SELECT_TIMING_PLAYERS, WAIT_TARGET, TARGET_RESULT } GameState;
2. Timer Management
3. Comunicatie I2C
4. Random Number Generator - pentru a crea intr-un mod realistic procesul de asteptare a start-ului. Generator de numere pseudo-aleatoare folosind Linear Feedback Shift Register (LFSR):
uint32_t lfsr = 1; uint16_t random_range(uint16_t min, uint16_t max) { lfsr = (lfsr >> 1) ^ (-(lfsr & 1u) & 0xB400u); return min + (lfsr % (max - min)); }
5. Anti-Cheat System Sistem de detectare a apasarilor premature care marcheaza jucatorii ca “trisori”.
1. Functii de sistem:
timer_init() - initializare timer pentru millis counter; millis() - functie echivalenta cu Arduino millis(); delay_ms() - delay in milisecunde;
2. Functii I2C si LCD
i2c_init(), i2c_start(), i2c_stop(), i2c_write() - protocol I2C; lcd_init(), lcd_clear(), lcd_set_cursor(), lcd_print() - control LCD; lcd_print_int(), lcd_print_float() - afisare numere pe LCD;
3. Functii GPIO
gpio_init() - configurare pini input/output; digital_read_btn() - citire stare butoane; digital_write_led() - control LED-uri;
4. Functii audio
play_tone_start(), play_tone_stop() - control buzzer cu PWM; play_tone_blocking() - redare ton cu durata specificata;
5. Functii de joc
handle_menu() - gestionare meniu principal; select_reflex_mode(), select_difficulty() - selectie optiuni; wait_signal(), handle_signal() - logica joc reflex; wait_target() - logica joc timing; show_reflex_result(), show_timing_result() - afisare rezultate;
Laboratoare utilizate Proiectul integreaza concepte din urmatoarele laboratoare:
Aceasta arhitectura permite mentenanta usoara si extensibilitatea pentru functionalitati viitoare.
De asemenea, puteti accesa si contribui la proiect aici: https://github.com/dmitrii-catarama/TimeStrike
Proiectul: sketch_pm.zip
Suport de laborator: https://ocw.cs.pub.ro/courses/pm/lab/lab3-2023-2024
Ajutor PWM: https://wolles-elektronikkiste.de/en/timer-and-pwm-part-1-8-bit-timer0-2
Suport legare + programare buton cu pull-down: https://docs.arduino.cc/built-in-examples/digital/Button/
Info pentru buzzer: https://balau82.wordpress.com/2014/10/15/using-a-buzzer-with-arduino-in-pure-c/