This is an old revision of the document!
Proiectul isi propune implementarea jocului 2048. 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. Scopul jocului este sa atingi valoarea 2048
Î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.
Schema bloc
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.
Codul este impartit in 3 parti:
Secțiunea 1 - Implementarea jocului 2048:
Matricea mat reprezintă tabla de joc 4×4, inițializată cu zero. Funcția add_new_2() adaugă o valoare 2 într-o poziție liberă aleatoare pe tabla de joc. Funcția get_current_state() verifică starea curentă a jocului și returnează: 2 dacă unul dintre elementele matricei are valoarea 2048 (adică jucătorul a câștigat). 1 dacă există cel puțin o poziție liberă pe tabla de joc. 0 dacă jocul poate continua. -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 128×64 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.
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*.