Connect4

Introducere

Proiectul constă în implementarea popularului joc Connect4, în care 2 jucători încearcă să formeze o linie de 4 jetoane consecutive pe o tablă de joc.

Descriere generală

Afișarea jocului se face pe un ecran LCD, iar interacțiunea cu jocul se realizează cu ajutorul a 3 butoane, unul pentru a pune un jeton pe coloana curentă si două pentru a muta coloana selectată la stânga sau la dreapta. Există și un buton ce resetează întregul joc. La început trebuie selectate numărul de jocuri necesare pentru victorie: unul singur, 2/3 sau 3/5, iar câștigătorul are la final un ecran care îl felicită. După un anumit timp, jucătorului curent îi este pus automat un jeton pe coloana curentă și este rândul celuilalt jucător. Scorul se ține în format binar cu ajutorul unor LED-uri.

Schema bloc:

Hardware Design

Proiectul va folosi următoarele componente:

  • 2 Arduino UNO
  • Modul LCD TFT(ST7735S)
  • 4 LED-uri
  • 4 butoane pushdown
  • 4 Rezistențe 10k
  • Fire tată-tată
  • Breadboard

Schema electrica:

  • Butoanele folosesc rezistețele interne de pullup ale plăcuței
  • Ecranul LCD comunică cu Arduino Master folosind protocolul SPI
  • Arduino Master comunică cu Arduino Slave folosind protocolul I2C

Software Design

Pentru comunicarea cu ecranul am folosit bibliotecile TFT.h si SPI.h, iar pentru comunicarea între Arduino am folosit Wire.h.

Jocul se poate afla în una din 3 stări:

  • Ecranul de început - se selectează cu ajutorul butoanelor stânga-dreapta câte runde se vor juca și se apasă butonul de OK pentru a începe. Butonul de reset face ca jocul să revină la ecranul de început și resetarea scorului.
  • Jocul propriu zis - o matrice 6×7 de celule în care jucătorii dau drumul la jetoane, iar coloana curentă este colorată specific jucătorului care este la rând. Un jucător are la dispoziție 10 secunde pentru a pune un jeton, timp după care jetonul va fi pus pe coloana la care se află în momentul respectiv, sau următoarea coloană liberă în cazul în care coloana selectată este deja plină. Punerea jetonului în coloană are și o animație de cădere.
  • Ecranul de final - Apare textul “Congrats Player X, Press any button to start”, ale cărui culori se schimbă o dată pe secundă.


Arduino Slave se ocupă de ținutul scorului și al timer-ului de 10 secunde pentru timeout. El anunță master-ul atunci când a trecut timpul sau dacă jucătorul care a câștigat ultima rundă a câștigat și meciul. Scorul este ținut cu ajutorul a 2 LED-uri în format binar, iar atunci când un jucător câștigă meciul, LED-urile sale pâlpâie.

Biblioteca TFT.h expune un obiect TFT ce conține metodele necesare folosirii ecranului: scriere text, desenare dreptunghiuri si cercuri. Aceste funcții se apelează doar atunci când se produc schimbări în starea jocului, codul neefectuând astfel instrucțiuni inutile.

Demo Joc

Rezultate Obținute

Concluzii

  • Este primul proiect la care a trebuit să folosesc piese hardware și totodată unul dintre cele mai “fulfilling”, întrucât am avut libertatea să creez singur toate elementele acestuia, de la interfața jocului și pana la așezarea butoanelor, LED-urilor si a ecranului.
  • Am înteles mai bine cum funcționează timer-ele și am aprofundat comunicarea I2C
  • Am aflat modalități de a face anumite acțiuni să aștepte fără a folosi delay() și am întâmpinat și bug-uri din cauza folosirii acestuia, care sunt destul de anevoios de depistat având în vedere limitarea folosirii unei singure seriale o dată de către Arduino IDE
  • Lucrul cu plăcuța Arduino este foarte ușor și biblioteca pentru folosirea ecranului dispune de destul de multe facilități, motiv pentru care se pot implementa o mulțime de alte jocuri, de exemplu X si 0, Snake, șah, sau chiar ceva asemanător chrome dino game.

Download

Pagina în format PDF
Arhiva: connect4.zip


Bibliografie/Resurse

pm/prj2021/abasoc/connect4.txt · Last modified: 2021/06/02 19:38 by stefan.popa99
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