BattleShip

Introducere

Este un joc tip Battleship destinat a fi jucat de doi jucători, fiecare beneficiind de o interfață proprie compusă dintr-un joystick și o matrice LED RGB 8×8. Jucătorii își plasează bărcile și aleg pe rând coordonatele de atac, primind feedback vizual și sonor pentru fiecare acțiune: lovitură, ratare sau câștig. Jocul continuă în ture alternative până când unul dintre jucători distruge toate bărcile adversarului.

Scopul proiectului este de a crea o aplicație embedded interactivă care să îmbine elemente de divertisment cu concepte tehnice din cadrul laboratorului. Ideea a pornit de la dorința de a aduce un joc clasic într-un format fizic, în care logica și afișarea sunt controlate complet prin microcontroler și periferice simple.

Consider că proiectul este util pentru că oferă un mod atractiv de a pune în practică noțiuni precum GPIO, UART, PWM și întreruperi, dezvoltând atât gândirea logică, cât și abilitățile de integrare hardware-software. Modul „Memorie”, în care pozițiile bărcilor sunt afișate doar câteva secunde, adaugă un plus de dificultate și face jocul mai interesant.

Descriere generală

Schema bloc

Sistemul este compus din mai multe module hardware interconectate prin Arduino Uno: două joystick-uri pentru control, două matrici LED WS2812B pentru afișajul jocului, două LED-uri simple pentru indicarea turei curente și un buzzer pentru feedback sonor.

Joystick-urile trimit comenzi către Arduino, care gestionează logica jocului, actualizează afișajul LED corespunzător fiecărei acțiuni și declanșează semnale sonore prin buzzer.

Pe partea software, Arduino coordonează trecerea între ture, verifică validitatea țintelor și interpretează acțiunile. Modulul „Memorie” este implementat software și controlează afișarea temporară a pozițiilor inițiale ale navelor.

Hardware Design

Schema electrica

Componentă Link / Datasheet Descriere utilizare
Arduino Uno https://sigmanortec.ro/Placa-dezvoltare-UNO-R3-Arduino-Compatibil-ATmega328p-CH340G-cu-bara-pini-p170362384 Microcontrolerul principal care controlează logica jocului și toate componentele.
Matrice LED WS2812B 16×16 Afișează poziția navelor, atacurile și rezultatele în joc.
Joystick PS2 https://sigmanortec.ro/Modul-joystick-doua-axe-XY-p126458908 Control analog pe 2 axe (X/Y) pentru fiecare jucător.
Buzzer piezo https://sigmanortec.ro/Speaker-Buzzer-3-24V-100dB-p136261631 Oferă feedback sonor în timpul jocului.
LED simplu https://ro.mouser.com/ProductDetail/Kingbright/L-934ID Indică vizual ce jucător are tura activă.
Rezistor 220Ω Limitează curentul pentru LED-urile simple.
Breadboard + jumper https://sigmanortec.ro/Breadboard-830-puncte-MB-102-p125923983 Platformă de conectare pentru prototipare.

Interfețe și comunicare:

  • Joystick-urile sunt conectate pe pini analogici (A0–A3) și oferă semnale continue între 0V și 5V, interpretate de ADC-ul microcontrollerului.
  • Matricile WS2812B sunt controlate prin pini digitali (D2, D3), folosind un protocol serial specific WS2812B. Comunicarea este unidirecțională și temporizată precis prin biblioteci.
  • Buzzerul este comandat digital (ON/OFF) prin pinul D4, trimițând semnale PWM sau HIGH/LOW în funcție de efectul dorit.
  • LED-urile simple sunt comandate prin pinii digitali D5 și D6 și aprinse prin digitalWrite.
Componentă Pin Arduino Tip pin Justificare
Matrice LED 1 D2 Digital Intrare de semnal serial WS2812B pentru controlul pixelilor.
Matrice LED 2 D3 Digital Separare logică pentru a controla independent cele două matrici.
Joystick 1 – VRx A2 Analog Citire poziție orizontală (X) – control pe axa matricei.
Joystick 1 – VRy A3 Analog Citire poziție verticală (Y).
Joystick 1 – SW D8
Joystick 2 – VRx A0 Analog Axa X pentru jucătorul 2.
Joystick 2 – VRy A1 Analog Axa Y pentru jucătorul 2.
Joystick 2 – SW D7
Buzzer D4 Digital Activat/dezactivat prin `digitalWrite` pentru semnal sonor.
LED 1 D6 Digital Aprins când este rândul jucătorului 1.
LED 2 D5 Digital Aprins când este rândul jucătorului 2.
GND / 5V Power Alimentare comună pentru toate componentele de pe breadboard.

Am inlocuit cu matrice 16×16,dar folosesc doar 64 de LED-uri.

Hard

Software Design

Mediu de dezvoltare:

  • Arduino IDE – folosit pentru scrierea, compilarea și upload-ul codului pe placa Arduino UNO

Librării și surse 3rd-party:

  • FastLED – pentru controlul și animarea matricelor de LED-uri WS2812B

Variabile globale folosite:

  • int cursorX1, cursorY1 – coordonatele cursorului jucătorului 1
  • int cursorX0, cursorY0 – coordonatele cursorului jucătorului 2
  • int lastX1, lastY1 – poziția anterioară a cursorului J1 (pentru restaurarea culorii)
  • int lastX0, lastY0 – poziția anterioară a cursorului J2
  • int playerTurn – indică al cui este rândul (0 pentru J1, 1 pentru J2)
  • int score1, score2 – scorul actual (numărul de bărci rămase pentru fiecare jucător)
  • int n – numărul de bărci per jucător (modificabil)
  • bool boats1[8][8] – matrice logică ce reține poziția bărcilor lui J1
  • bool boats2[8][8] – matrice logică pentru J2
  • CRGB leds1[NUM_LEDS] – vector de LED-uri pentru matricea J1
  • CRGB leds2[NUM_LEDS] – vector de LED-uri pentru matricea J2
  • CRGB staticMap1[8][8] – hartă pentru culori persistente pe matricea J1 (lovituri/ratări)
  • CRGB staticMap2[8][8] – hartă similară pentru matricea J2
  • const int LED1, LED2 – LED-uri externe pentru indicarea jucătorului curent
  • const int buzzerPin – pinul pentru buzzer pasiv

Surse și funcții implementate:

  • setup() – inițializează componentele hardware, buzzerul, matricile, scorurile, desenează gardurile și plasează bărci aleatoriu
  • loop() – rulează logica principală a jocului (citirea joystickului, mutarea cursorului, verificarea loviturilor și actualizarea scorurilor)
  • getIndex(x, y) – convertește coordonatele (x, y) într-un index lineal pentru matrice (cu serpentină verticală)
  • clearAll() – stinge toate LED-urile din ambele matrici
  • drawBorderOnly(leds, xSize, ySize) – desenează marginea pătratelor de joc cu LED-uri roz (gard)
  • addBoats(leds, boats, xSize, ySize, n, label) – generează și aprinde LED-uri verzi pentru bărci, salvează pozițiile în matricile logice
  • clearBoats(leds, xSize, ySize) – șterge doar vizual bărcile (LED-urile verzi), păstrând logica intactă
  • drawLives(leds, numTotal, numRamase) – afișează un contor vizual cu viețile rămase (LED-uri verzi/roșii în afara zonei de joc)
  • updateCursor(…) – mută cursorul albastru în funcție de joystick, restaurând culoarea precedentă (roșu/galben)
  • displayCursor(leds, x, y) – afișează poziția actuală a cursorului și reface gardul dacă a fost afectat
  • isBorderLED(x, y, xSize, ySize) – verifică dacă o poziție aparține marginii pătratului de joc

Descrierea jocului

La începutul jocului, fiecărui jucător i se generează aleator un număr de bărci (LED-uri verzi) pe propria matrice WS2812B. Acestea sunt afișate timp de 5 secunde pentru previzualizare, apoi sunt ascunse.

Jucătorii se joacă pe rând, folosind un joystick pentru a controla un cursor albastru. La apăsarea joystick-ului: - dacă poziția atacată conține o barcă, LED-ul devine roșu, iar jucătorul lovește și rămâne la mutare; - dacă poziția este goală, LED-ul devine galben, iar rândul trece la celălalt jucător.

Pe o linie separată (sub zona de joc), fiecare jucător are un contor de vieți reprezentat prin LED-uri: - verzi pentru bărci rămase; - roșii pentru bărci distruse.

Jocul continuă până când unul dintre jucători lovește toate bărcile adversarului – moment în care este declarat câștigăto.

Rezultate Obţinute

Aplicația funcționează conform așteptărilor, simulând un joc Battleship între doi jucători, folosind două joystick-uri și două matrici WS2812B.

Funcționalități implementate:

  1. Afișare temporară a bărcilor fiecărui jucător la începutul jocului;
  2. Navigare cu joystick și cursor albastru activ;
  3. Detectare lovitură și ratare, cu LED-uri roșii/galbene persistente;
  4. Schimbarea rândului între jucători;
  5. Afișare vieți rămase printr-un „life bar” pe linia separată;
  6. Semnale vizuale (LED-uri) și sonore (buzzer) pentru evenimentele importante:
    1. început de joc,
    2. lovitură,
    3. ratare,
    4. câștig.

Testele realizate în practică au confirmat comportamentul corect și stabil al jocului. Timpul de răspuns al joystick-urilor este bun, afișajul este clar, iar sunetele oferă un feedback intuitiv.

Concluzii

Concluzii

Proiectul a demonstrat o bună integrare a componentelor hardware și software: joystick-uri, LED-uri WS2812B și buzzer. Am reușit să dezvolt un joc Battleship interactiv, stabil și ușor de jucat. Am învățat să gestionez logica de joc, afișajul dinamic și feedback-ul vizual/sonor. Provocările legate de păstrarea stării LED-urilor și sincronizarea afișajului au fost depășite cu succes.

Download

O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).

Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.

334cb_anda_elena_sucitu_battleship.zip

Bibliografie/Resurse

pm/prj2025/apredescu/anda_elena.sucitu.txt · Last modified: 2025/06/01 16:11 by anda_elena.sucitu
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