This shows you the differences between two versions of the page.
pm:prj2021:apredescu:tetris [2021/05/28 13:33] andrei.traistaru99 [Download] |
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 O 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 O ș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ța 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 117: | Line 117: | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
- | [[https://ocw.cs.pub.ro/courses/pm/prj2021/apredescu/tetris?do=export_pdf|Download pdf]] | + | Resurse software: |
+ | |||
+ | * 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]] |