Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2021:apredescu:tetris [2021/05/28 13:48]
andrei.traistaru99 [Bibliografie/Resurse]
pm:prj2021:apredescu:tetris [2021/05/28 18:44] (current)
andrei.traistaru99 [Bibliografie/Resurse]
Line 1: Line 1:
-====== Consolă de jocuri clasice: Tetris, X și O, 2048 ======+====== Consolă de jocuri clasice ======
 ===== Introducere ===== ===== Introducere =====
  
-Proiectul constă în realizarea unei console de jocuri clasice printre care un joc de Tetris, X si si 2048 folosind o plăcuță Arduino. Jocurile vor fi afișate pe un LCD, iar input-ul jucătorului se va face printr-un joystick și 2 butoane. De asemenea, se vor folosi led-uri și un buzzer pentru pentru a îmbunătăți experiența utilizatorului.+Proiectul constă în realizarea unei console de jocuri clasice printre care Tetris, X și și 2048 folosind o plăcuță Arduino. Jocurile vor fi afișate pe un LCD, iar input-ul jucătorului se va face printr-un joystick și 2 butoane. De asemenea, se vor folosi led-uri și un buzzer pentru pentru a îmbunătăți experiența utilizatorului.
  
-Scopul proiectului este de a implementa o consolă de jocuri ​clasic ​care simulează experiența de joc oferită de o consolă din anii 2000.+Scopul proiectului este de a implementa o consolă de jocuri ​clasice ​care simulează experiența de joc oferită de o consolă din anii 2000.
  
 Consider că acest proiect este util pentru a experimenta funcționalitățile oferite de un Arduino, modalitatea de a conecta un modul LCD și diverse alte componente (joystick, butoane, led-uri, buzzer) la plăcuța Arduino pentru a implementa jocuri clasice apărute încă din anii 80'. Consider că acest proiect este util pentru a experimenta funcționalitățile oferite de un Arduino, modalitatea de a conecta un modul LCD și diverse alte componente (joystick, butoane, led-uri, buzzer) la plăcuța Arduino pentru a implementa jocuri clasice apărute încă din anii 80'.
Line 43: Line 43:
   * Testarea fiecărei componente pentru a valida funcționalitatea / deprindere cu API-ul disponibil; dificultăți am întâmpinat la conectarea LCD-ului la Arduino (conexiuni slabe din cauza breadboard-ului,​ lipsa experienței în utilizarea bibliotecii Ucglib)   * Testarea fiecărei componente pentru a valida funcționalitatea / deprindere cu API-ul disponibil; dificultăți am întâmpinat la conectarea LCD-ului la Arduino (conexiuni slabe din cauza breadboard-ului,​ lipsa experienței în utilizarea bibliotecii Ucglib)
   * Testarea joystick-ului   * Testarea joystick-ului
-  * Testarea butoanelor ​si a led-urilor rgb+  * Testarea butoanelor ​și a led-urilor rgb
   * Testarea buzzer-ului   * Testarea buzzer-ului
   * Montarea tuturor pieselor pe un cablaj de test; lipirea firelor pentru conexiuni stabile; construcția cutiei și asamblarea tuturor componentelor   * Montarea tuturor pieselor pe un cablaj de test; lipirea firelor pentru conexiuni stabile; construcția cutiei și asamblarea tuturor componentelor
-  * Programarea propriu-zisa a jocurilor+  * Programarea propriu-zisă a jocurilor
  
 Din punct de vedere software, implementarea proiectului a presupus: Din punct de vedere software, implementarea proiectului a presupus:
Line 57: Line 57:
 Pentru fiecare joc în parte, există o anumită structură care memorează statusul jocului și permite implementarea logicii jocului: Pentru fiecare joc în parte, există o anumită structură care memorează statusul jocului și permite implementarea logicii jocului:
   * Tetris   * Tetris
-Într-o buclă infinită, se generează următoarea poziție pentru piesa în mișcare pe baza inputului de la joystick. În momentul în care jucătorul apasă pe joystick, se execută o rutină de tratare a întreruperii de pe pinul corespunzator în care se marchează faptul că piesa curentă trebuie rotită. Se verifică dacă prin rotire / deplasare stânga - dreapta / coborâre cu o poziție nu apare vreo coliziune. Dacă noua poziție este validă, se redesenează piesa prin suprascriere cu negru și redesenarce ​în noua poziție. Altfel piesa rămâne pe loc și la următoarea iterație se va genera o nouă piesă. La fiecare iterație se verifică existența rândurilor complete care vor fi eliminate din tabla de joc, aducând o bonificație la scor.+Într-o buclă infinită, se generează următoarea poziție pentru piesa în mișcare pe baza inputului de la joystick. În momentul în care jucătorul apasă pe joystick, se execută o rutină de tratare a întreruperii de pe pinul corespunzator în care se marchează faptul că piesa curentă trebuie rotită. Se verifică dacă prin rotire / deplasare stânga - dreapta / coborâre cu o poziție nu apare vreo coliziune. Dacă noua poziție este validă, se redesenează piesa prin suprascriere cu negru și redesenare ​în noua poziție. Altfel piesa rămâne pe loc și la următoarea iterație se va genera o nouă piesă. La fiecare iterație se verifică existența rândurilor complete care vor fi eliminate din tabla de joc, aducând o bonificație la scor.
   * X și O   * X și O
 Într-o buclă infinită, se așteaptă input-ul jucătorului. În momentul în care acesta se deplasează cu joystick-ul stânga - dreapta, sus - jos, se redesenează pătratul care permite selecția următoarei mutări. În momentul în care se apasă pe joystick, prin rutina de tratare a întreruperii,​ se marchează un flag în memorie. La următoarea iterație, dacă acest flag este setat, se verifică dacă poziția selectată este validă, caz în care se desenează un X în celula corespunzătoare. În continuare se generează o poziție pentru jucătorul O după o logică trivială: se verifică dacă se poate câștiga dintr-o mutare cu un O; altfel se verifică dacă se poate câștiga cu o mutare cu un X (pentru apărare); altfel se alege aleator o poziție liberă. Se verifică în permanență dacă jocul s-a încheiat și care jucător a câștigat. Într-o buclă infinită, se așteaptă input-ul jucătorului. În momentul în care acesta se deplasează cu joystick-ul stânga - dreapta, sus - jos, se redesenează pătratul care permite selecția următoarei mutări. În momentul în care se apasă pe joystick, prin rutina de tratare a întreruperii,​ se marchează un flag în memorie. La următoarea iterație, dacă acest flag este setat, se verifică dacă poziția selectată este validă, caz în care se desenează un X în celula corespunzătoare. În continuare se generează o poziție pentru jucătorul O după o logică trivială: se verifică dacă se poate câștiga dintr-o mutare cu un O; altfel se verifică dacă se poate câștiga cu o mutare cu un X (pentru apărare); altfel se alege aleator o poziție liberă. Se verifică în permanență dacă jocul s-a încheiat și care jucător a câștigat.
Line 70: Line 70:
 Pentru monitorizarea progresului am realizat câteva imagini din timpul implementării:​ Pentru monitorizarea progresului am realizat câteva imagini din timpul implementării:​
  
-  * Testarea componentelor pe breadboard (o parte din legături ​le-am lipid pe un cablaj de test pentru conexiuni ferme):+  * Testarea componentelor pe breadboard (o parte din legături ​sunt deja lipite ​pe un cablaj de test pentru ​a obține ​conexiuni ferme):
 {{:​pm:​prj2021:​apredescu:​tetris:​componente_pe_breadboard_1.jpeg?​500|}} {{:​pm:​prj2021:​apredescu:​tetris:​componente_pe_breadboard_1.jpeg?​500|}}
  
Line 92: Line 92:
 ===== Concluzii ===== ===== Concluzii =====
  
-Proiectul a fost o oportunitate de a experimenta implementarea unor jocuri clasice, simple, atât din perspectivă software de nivel înalt (logica jocului), cât și dintr-o perspectivă software de nivel jos (desenarea pieselor de Tetris din figuri geometrice simple / updatarea imaginii de pe ecran încât întârzierea produsă de această acțiune să nu reducă semnificativ experiențde joc - ștergerea și redesenarea întregului ecran la fiecare nou cadru nu a reprezentat o soluție întrucât tranziția nu avea loc la o frecvență suficient de mare încât să devină insesizabilă pentru ochiul uman, caz în care am adoptat o tehnică de a actualiza doar părțile din imagine care s-au modificat de la ultimul cadru). De asemenea, necesitatea de a lipi fire pe un cablaj de test și a monta toate componentele într-o cutie de dimensiuni cât mai mici (reducerea spațiului ocupat pe cât posibil printr-o organizare atentă a firelor / aranjarea componentelor pentru a realiza un dispozitiv "​ergonomic"​) au reprezentat aspecte plăcute ale implementării proiectului.+Proiectul a fost o oportunitate de a experimenta implementarea unor jocuri clasice, simple, atât din perspectivă software de nivel înalt (logica jocului), cât și dintr-o perspectivă software de nivel jos (desenarea pieselor de Tetris din figuri geometrice simple / updatarea imaginii de pe ecran încât întârzierea produsă de această acțiune să nu reducă semnificativ ​calitatea ​experienței de joc - ștergerea și redesenarea întregului ecran la fiecare nou cadru nu a reprezentat o soluție întrucât tranziția nu avea loc la o frecvență suficient de mare încât să devină insesizabilă pentru ochiul uman, caz în care am adoptat o tehnică de a actualiza doar părțile din imagine care s-au modificat de la ultimul cadru). De asemenea, necesitatea de a lipi fire pe un cablaj de test și a monta toate componentele într-o cutie de dimensiuni cât mai mici (reducerea spațiului ocupat pe cât posibil printr-o organizare atentă a firelor / aranjarea componentelor pentru a realiza un dispozitiv "​ergonomic"​) au reprezentat aspecte plăcute ale implementării proiectului.
 ===== Download ===== ===== Download =====
  
 Arhiva cuprinde: Arhiva cuprinde:
   * Componenta software implementată   * Componenta software implementată
-  * Pozele ​din timpul implementării proiectului+  * Poze din timpul implementării proiectului
   * Schema bloc   * Schema bloc
   * Schema electrică   * Schema electrică
Line 109: Line 109:
   - Stabilirea temei proiectului ✔   - Stabilirea temei proiectului ✔
   - Stabilirea componentelor necesare / Studierea compatibilității pieselor ✔   - Stabilirea componentelor necesare / Studierea compatibilității pieselor ✔
-  - Testarea ​componentelor ​individual ✔+  - Testarea individuală a componentelor ​
   - Montarea tuturor componentelor pe breadboard ✔   - Montarea tuturor componentelor pe breadboard ✔
   - Montarea tuturor componentelor pe cablajul de test ✔   - Montarea tuturor componentelor pe cablajul de test ✔
Line 116: Line 116:
  
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
 +
 +Resurse software:
  
   * Codul este disponibil la: https://​github.com/​andreitraistaru/​Game-console   * Codul este disponibil la: https://​github.com/​andreitraistaru/​Game-console
-  * +  * Biblioteca Ucglib (pentru LCD): https://​github.com/​olikraus/​ucglib/​wiki/​reference 
 +  * https://​www.w3schools.com/​colors/​colors_picker.asp 
 + 
 +Resurse hardware: 
 +  * Demonstrație cu proiectul în forma finală: https://​drive.google.com/​file/​d/​1S-WoGj8A0A0UtUowCiCEAjtv1QPca7kY/​view 
 +  * Scheme pentru conectarea pinilor componentelor:​ https://​www.optimusdigital.ro/​ro/​ 
 +  * https://​www.analog.com/​en/​analog-dialogue/​articles/​introduction-to-spi-interface.html#​
  
 [[https://​ocw.cs.pub.ro/​courses/​pm/​prj2021/​apredescu/​tetris?​do=export_pdf|Export to pdf]] [[https://​ocw.cs.pub.ro/​courses/​pm/​prj2021/​apredescu/​tetris?​do=export_pdf|Export to pdf]]
pm/prj2021/apredescu/tetris.1622198894.txt.gz · Last modified: 2021/05/28 13:48 by andrei.traistaru99
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