This shows you the differences between two versions of the page.
pm:prj2023:alucaci:andreighiocel [2023/05/21 20:29] andrei.ghiocel |
pm:prj2023:alucaci:andreighiocel [2023/05/29 23:11] (current) andrei.ghiocel [Bibliografie/Resurse] |
||
---|---|---|---|
Line 2: | Line 2: | ||
===== Introducere ===== | ===== Introducere ===== | ||
- | <note tip> | ||
Proiectul isi propune implementarea jocului 2048. | Proiectul isi propune implementarea jocului 2048. | ||
Initial pornim cu un grid 4×4 cu 2 valoari intre 2 si 4 in casute aleatoare. | Initial pornim cu un grid 4×4 cu 2 valoari intre 2 si 4 in casute aleatoare. | ||
Exista 4 tipuri de mutari: sus, jos, stanga, dreapta. | Exista 4 tipuri de mutari: sus, jos, stanga, dreapta. | ||
Scopul jocului este sa atingi valoarea 2048 | Scopul jocului este sa atingi valoarea 2048 | ||
- | </note> | + | |
===== Descriere generală ===== | ===== Descriere generală ===== | ||
- | <note tip> | ||
În jocul 2048, există patru tipuri de mutări disponibile: sus, jos, stânga și dreapta, iar fiecare mutare implică deplasarea tuturor pieselor în direcția aleasă. Piesele cu aceeași valoare se combină și se eliberează unul dintre câmpuri. De asemenea, la fiecare mișcare, o valoare de 2 sau 4 este adăugată aleatoriu într-un câmp gol din grilă. Mutarile se vor realiza cu ajutorul unui joystick. | În jocul 2048, există patru tipuri de mutări disponibile: sus, jos, stânga și dreapta, iar fiecare mutare implică deplasarea tuturor pieselor în direcția aleasă. Piesele cu aceeași valoare se combină și se eliberează unul dintre câmpuri. De asemenea, la fiecare mișcare, o valoare de 2 sau 4 este adăugată aleatoriu într-un câmp gol din grilă. Mutarile se vor realiza cu ajutorul unui joystick. | ||
Jocul se încheie atunci când nu mai sunt mutări disponibile (când grila este plină) sau atunci când se obține piesa cu valoarea 2048. | Jocul se încheie atunci când nu mai sunt mutări disponibile (când grila este plină) sau atunci când se obține piesa cu valoarea 2048. | ||
- | </note> | ||
**Schema bloc** | **Schema bloc** | ||
Line 21: | Line 18: | ||
===== Hardware Design ===== | ===== Hardware Design ===== | ||
- | <note tip> | ||
⦁ Arduino UNO | ⦁ Arduino UNO | ||
Line 29: | Line 25: | ||
⦁ Breadboard | ⦁ Breadboard | ||
- | </note> | ||
{{pm:prj2023:alucaci:2048_circuit_ghio.png?}} | {{pm:prj2023:alucaci:2048_circuit_ghio.png?}} | ||
- | <note tip> | + | ===== Software Design ===== |
- | Display OLED | Arduino | + | |
- | __________________________ | + | |
- | D0 | D13 | + | |
- | D1 | D12 | + | |
- | RES | D1 | + | |
- | DC | D2 | + | |
- | CS | D3 | + | |
- | </note> | + | |
- | <note tip> | ||
- | Joystick | Arduino | ||
- | __________________________ | ||
- | VRx | D10 | ||
- | VRy | D9 | ||
- | SW | D8 | ||
- | </note> | ||
+ | Codul a fost scris folosind Arduino IDE. Pentru comunicarea cu display-ul OLED am folosit biblioteca u8glib. | ||
+ | Jocul poate primi 4 inputuri din partea joystick-ului : sus, jos, stanga, dreapta. Am implementat un delay astfel incat atunci cand maneta revine la pozitia initiala sa nu se inregistreze niciun fel de input. | ||
- | ===== Software Design ===== | + | Codul este impartit in 3 parti: |
+ | **Secțiunea 1 - Implementarea jocului 2048:** | ||
- | <note tip> | + | Matricea mat reprezintă tabla de joc 4x4, inițializată cu zero. |
- | Descrierea codului aplicaţiei (firmware): | + | Funcția add_new_2() adaugă o valoare 2 într-o poziție liberă aleatoare pe tabla de joc. |
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | Funcția get_current_state() verifică starea curentă a jocului și returnează: |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | 2 dacă unul dintre elementele matricei are valoarea 2048 (adică jucătorul a câștigat). |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | 1 dacă există cel puțin o poziție liberă pe tabla de joc. |
- | * (etapa 3) surse şi funcţii implementate | + | 0 dacă jocul poate continua. |
- | </note> | + | -1 dacă jucătorul a pierdut. |
+ | Funcțiile compress(), merge(), reverse(), transpose() și move_left(), move_right(), move_up(), move_down() sunt utilizate pentru a efectua mișcările jucătorului în joc. Acestea rearanjează valorile matricei în funcție de mișcarea specificată și combină valorile identice. | ||
+ | Funcția reset_matrix() resetează tabla de joc la starea inițială. | ||
+ | Funcția print_matrix() afișează tabla de joc în Serial Monitor (acestă funcție nu este utilizată în codul principal al jocului). | ||
+ | |||
+ | **Secțiunea 2 - Implementarea afișării pe ecran:** | ||
+ | |||
+ | Biblioteca U8glib este utilizată pentru a controla ecranul SSD1306 de tip OLED, cu rezoluție 128x64 de pixeli. | ||
+ | Funcția draw() este apelată pentru a desena starea curentă a jocului pe ecran. Dacă jucătorul a câștigat sau a pierdut, se va afișa un mesaj corespunzător. | ||
+ | Funcția setup_display() este utilizată pentru a configura ecranul la pornire. | ||
+ | Funcțiile draw_win() și draw_lose() desenează mesajele corespunzătoare pe ecran atunci când jucătorul a câștigat sau a pierdut. | ||
+ | Funcția draw_grid() desenează tabla de joc și valorile matricei pe ecran. | ||
+ | |||
+ | **Secțiunea 3 - Implementarea citirii de la joystick**: | ||
+ | |||
+ | Variabilele și constantele din această secțiune sunt utilizate pentru citirea valorilor de la joystick. | ||
+ | În funcția setup(), se configurează pinii joystick-ului și se inițializează matricea de joc cu o valoare 2 intr-o casuta random. În funcția game_loop(), se citesc valorile de pe joystick și se realizează mișcările în funcție de direcția deplasării indicate de joystick. | ||
+ | După fiecare mișcare, se verifică starea jocului utilizând funcția get_current_state(). Dacă jocul continuă, se adaugă o valoare 2 într-o poziție liberă și se afișează starea jocului pe ecran. Dacă jucătorul a câștigat sau a pierdut, se afișează mesajul corespunzător pe ecran. | ||
+ | Funcția loop() este responsabilă pentru apelarea în buclă a funcțiilor game_loop() și draw(), pentru a actualiza starea jocului și afișarea pe ecran. | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
- | <note tip> | + | Am realizat implementarea jocului 2048. Proiectul permite jucătorului să controleze mișcările utilizând un joystick, iar starea jocului este afișată pe un ecran OLED. Am realizat exact tot ceea ce am dorit să fac pentru acest proiect. |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
- | </note> | + | |
===== Concluzii ===== | ===== Concluzii ===== | ||
+ | În urma implementării acestui proiect, am învățat mai multe lucruri importante atât pe partea de software, cât și pe partea de hardware. Pe partea de software, am creat funcții și module clare și corespunzătoare pentru diversele sarcini ale proiectului, ceea ce a facilitat gestionarea și dezvoltarea ulterioară a codului. Am dobândit, de asemenea, cunoștințe despre manipularea matricelor și algoritmii de joc. | ||
+ | Pe partea de hardware, am învățat cum să conectez și să configurez corect componentele necesare. Am realizat conexiunile adecvate între joystick și placa Arduino, precum și între ecranul OLED și placa Arduino. Am înțeles cum să configurez pinii și să asigur o alimentare corespunzătoare pentru componentele hardware. | ||
+ | Am utilizat biblioteca U8glib pentru afișajul pe ecranul OLED. Prin studierea documentației acestei biblioteci, am învățat cum să controlez și să utilizez funcțiile și metodele oferite pentru a desena grafice, text și alte elemente pe ecranul OLED. Astfel, am creat o interfață utilizator grafică, care a permis interacțiunea intuitivă cu jocul. | ||
+ | |||
+ | În concluzie, prin implementarea acestui proiect, am dobândit abilități practice în dezvoltarea de software și interacțiunea cu componente hardware. Am învățat cum să integrez componente hardware într-un proiect, să lucrez cu matrici și algoritmi de joc, precum și să realizez o interfață utilizator grafică. | ||
===== Download ===== | ===== Download ===== | ||
- | <note warning> | + | {{ghiocel_andrei_332cc.zip}} |
- | 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*. | + | |
- | </note> | + | |
===== Jurnal ===== | ===== Jurnal ===== | ||
Line 87: | Line 87: | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
- | <note> | + | Biblioteca u8glib - folosita pentru afisarea pe display : https://github.com/olikraus/u8glib |
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe *Resurse Software* şi *Resurse Hardware*. | + | |
- | </note> | + | Display OLED : https://ardushop.ro/ro/home/2647-display-oled-128x64.html?gclid=Cj0KCQjw3a2iBhCFARIsAD4jQB1HnTrGmXnY36S_vgQN8TI2yhgnnf_pi1Fxd6pW38BFPcnTYAkXm2YaAtCOEALw_wcB |
+ | |||
+ | Datasheet joystick : http://www.energiazero.org/arduino_sensori/joystick_module.pdf | ||
<html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> |