Table of Contents

TimeStrike

Autor: Catarama Dmitrii

Grupa: 332CD

Introducere

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.

Descriere generală

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:

Hardware Design

Software Design

Descrierea codului aplicaţiei (firmware):

  • mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR)
  • librării şi surse 3rd-party (e.g. Procyon AVRlib)
  • algoritmi şi structuri pe care plănuiţi să le implementaţi
  • (etapa 3) surse şi funcţii implementate

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

Surse si functii implementate

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.

Rezultate Obţinute

De asemenea, puteti accesa si contribui la proiect aici: https://github.com/dmitrii-catarama/TimeStrike

Concluzii

Download

Proiectul: sketch_pm.zip

Bibliografie/Resurse

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/