This shows you the differences between two versions of the page.
pm:prj2021:apredescu:tetris [2021/05/28 14:11] andrei.traistaru99 [Software Design] |
pm:prj2021:apredescu:tetris [2021/05/28 18:44] (current) andrei.traistaru99 [Bibliografie/Resurse] |
||
---|---|---|---|
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 124: | Line 124: | ||
Resurse hardware: | Resurse hardware: | ||
- | * Demonstrație cu proiectul în forma finală: https://drive.google.com/file/d/1S-WoGj8A0A0UtUowCiCEAjtv1QPca7kY/view?usp=sharing | + | * 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/ | * Scheme pentru conectarea pinilor componentelor: https://www.optimusdigital.ro/ro/ | ||
* https://www.analog.com/en/analog-dialogue/articles/introduction-to-spi-interface.html# | * 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]] |