Live or Die

Inspirație: Scenele cu caracterul Jigsaw din filmul “Saw 3”

Jocul implică doi participanți: master și slave comandant și prizonier.

Regulile jocului

Comandantul trebuie să-și mențină pulsul la un anumit nivel, monitorizat printr-un senzor. Dacă pulsul său scade sub acest prag, este considerat “mort”. Prizonierul încearcă să-și găsească drumul spre libertate prin introducerea unei parole corecte pe un keypad prin apasarea in ordinea corecta a trei butoane. Prizonierul are la dispoziție un alt buton , care poate fi apăsat pentru a “ucide” comandantul, reducând gradual pulsul său timp de 60 de secunde. În acest timp, comandantul nu mai poate oferi niciun indiciu. Dacă prizonierul introduce parola greșită, atunci la sfârșitul celor 60 de secunde, atât comandantul cât și prizonierul sunt considerați “morți”. Prizonierul trebuie să rămână mereu într-un anumit cerc, fiind monitorizat de un senzor de distanță. Daca il paraseste inaintea introducerii parolei corecte, va fi considerat “mort”.

Starea jocului

Starea jocului este indicată printr-un led RGB:

  • 🟢 Verde: jocul în desfășurare
  • 🔴 Roșu: comandantul este “mort”
  • 🔵 Albastru: prizonierul câștigă jocul prin introducerea corectă a parolei

Componente necesare

  • Arduino Uno: placa de dezvoltare pentru controlul jocului
  • Senzor de puls: pentru a monitoriza pulsul maestrului
  • Buzzer: pentru semnalizarea activării butonului “KILL THE COMMANDER”
  • Senzor de distanță: pentru a monitoriza dacă prizonierul părăsește cercul
  • Led RGB: pentru a indica starea jocului (verde, roșu sau albastru)
  • Buton de “KILL THE COMMANDER”: pentru a fi apăsat de către prizonier si a porni numaratoarea inversa
  • Keypad 3 butoane: pentru introducerea parolei de către prizonier
  • Rezistențe: pentru a proteja componentele și a stabili valori de tensiune corespunzătoare
  • Breadboard: pentru conectarea componentelor în circuit

Schema bloc

Hardware Design

Software design

Iată principalele aspecte ale designului software și alegerile făcute:

Biblioteci: Scriptul utilizează biblioteca LiquidCrystal_I2C pentru gestionarea display-ului LCD, care este conectat folosind protocolul de comunicare I2C. Această bibliotecă oferă o interfață simplă pentru controlul display-ului LCD, făcând mai ușor afișarea mesajelor text pe ecran. Această alegere este avantajoasă, deoarece simplifică procesul de gestionare a display-ului și reduce numărul de pini GPIO necesari.

Structuri de date: Am definit o structură, Level, pentru a reprezenta un nivel în joc, care încapsulează notele, ordinea butoanelor și numărul lor. Această structură imi permite să reprezinț în mod convenabil diferite niveluri folosind aceeași structură de cod, crescând modularitatea și ușurând întreținerea codului.

Tablouri și bucle: Am folosit tablouri pentru a stoca informații precum ordinea butoanelor, notele, textul nivelului și sugestiile pentru fiecare nivel. Această alegere de design facilitează iterarea prin aceste tablouri în timpul funcționării jocului. Acest lucru face ca codul să fie flexibil și ușor de extins pentru niveluri suplimentare.

Funcții: Am împărțit codul în diverse funcții, fiecare cu un scop specific, îmbunătățind citibilitatea și întreținerea codului. De exemplu, funcția handleButtonActions gestionează apăsările butoanelor, iar playNote este folosită pentru a reda tonuri pe buzzer.

Temporizare: Am utilizat în mod extensiv funcția millis() pentru gestionarea sincronizării diferitelor evenimente, cum ar fi afișarea mesajelor de timeout, controlul progresiei nivelului de joc, gestionarea sunetelor buzzer-ului și menținerea timpului de apăsare. Această abordare non-blocking permite Arduino-ului să efectueze alte sarcini în paralel, îmbunătățind astfel eficiența.

Integrare a senzorilor: În cod, am integrat un senzor ultrasunete pentru unul dintre nivele. Această alegere arată flexibilitatea designului de a incorpora diferite tipuri de intrări. Am utilizat datele de la senzor pentru a ajusta intervalul de bipuri al buzzer-ului, creând o reacție audio dinamică în funcție de interacțiunea jucătorului.

Gestionarea apăsării butoanelor: Codul gestionează inteligent evenimentele de apăsare și eliberare a butoanelor. Am inclus o logică de eliminare a zgomotelor și am utilizat modul INPUT_PULLUP pentru a asigura citiri precise ale apăsărilor butoanelor. Mai mult, codul poate gestiona apăsări simultane ale butoanelor, oferind un mecanism de interacțiune pentru utilizatorii confuzi.

Mecanisme de feedback: Jocul oferă feedback prin intermediul display-ului LCD și al buzzer-ului. Această abordare multimodală îmbunătățește interacțiunea utilizatorului cu jocul. Utilizarea buzzer-ului pentru a furniza semnale audio și a display-ului pentru indicii vizuale contribuie la o experiență mai captivantă.

Randomness: Pentru nivelul 3, este generată o frecvență aleatoare pentru a fi redată pe buzzer, demonstrând integrarea aleatorului în designul jocului.

Concluzii

Daca stiam ca in Arduino nu suporta lucrul cu un numar mare de String-uri, probabil faceam alt proiect. In final, a fost o experienta distractiva, dar putin scumpa.

Bibliografie

https://chat.openai.com/?model=gpt-4 si laboratoarele de la PM, bineinteles.

pm/prj2023/avaduva/live_or_die.txt · Last modified: 2023/05/31 16:03 by alexandru.mazur
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0