This is an old revision of the document!
Proiectul constă în realizarea unui joc de tetris clasic, folosind două display-uri LCD monocromatice Nokia 5510, cu rezoluția de 48×84 pixeli. Pe unul se va afișa derularea jocului și pe celălalt scorul, piesa urmatoare și piesa salvată.
Scopul jocului este obținerea unor rânduri fără spații prin aranjarea unor piese ce pot fi mutate stânga-dreapta sau rotite. Linia orizontală dispare de pe ecran când se completează toate spațiile goale, mărindu-se spațiul de joc, astfel încât jucătorul să poată acumula mai multe puncte. Ca și îmbunătățire a jocului s-a adaugat funcționalitatea salvării piesei curente, ce poate fi folosită prin schimbarea sa cu o altă piesă din joc.
Schema bloc:
Cele 2 display-uri se conectează la placuța Arduino prin SPI. Joystick-ul funcționează prin întreruperi analogice, în timp ce butoanele sunt implementate prin întreruperi digitale.
Componentele folosite pentru proiect sunt:
Configurația componentelor la Arduino
LCD 1 / 2 | Pin |
---|---|
RST | 10 / 5 |
CE | 9 / 6 |
DC | 8 |
DIN | 11 |
CLK | 13 |
JOYSTICK | Pin |
---|---|
VRX | A1 |
VRY | A0 |
BUTOANE | Pin |
---|---|
1 | 4 |
2 | 3 |
3 | 2 |
Pentru dezvoltarea aplicatiei am folosit Arduino IDE impreuna cu bibliotecile:
Codul implementeaza jocul Tetris pe o placă Arduino, utilizând un display grafic LCD de tip Nokia 5110, un joystick și butoane. Pentru inceput am definit cateva constante si variabile globale pentru configurarea si starea jocului. Tabla de joc este construita dintr-o matrice de dimensiunile 9 pe 15. Pentru ca jocul sa functioneze corect, am avut nevoie sa implementez metode de configurarea și gestionarea butoanelor, desenarea blocurilor pe display, verificarea și eliminarea liniilor complete, și afișarea scorului și a blocurilor următoare. In functia setup se configureaza butoanele cu intrerupere digitala, display-urile LCD afisandu-se pe unul dintre ele titlul jocului.
Functia loop controleaza miscarea si rotatia pieselor, prin starea butoanelor si a joystick-ului. În interiorul functiei, se desfășoară logica jocului. Mai întâi, se verifică dacă trebuie să se schimbe blocul curent sau să se blocheze blocul curent pe tablă. Aceasta se realizează prin intermediul variabilelor switchBlock și lock. Dacă trebuie să se schimbe blocul curent, se efectuează schimbul între blocul curent și blocul următor sau blocul curent și blocul ținut (holdBlock). Se verifică, de asemenea, dacă s-a ajuns la sfârșitul listei de blocuri și se resetează blocul următor la primul bloc. Dacă trebuie să se blocheze blocul curent pe tablă, se efectuează verificări pentru eliminarea liniilor complete de pe tablă și se actualizează scorul. Blocul curent se desenează pe tablă, iar jucătorul poate controla blocul curent prin intermediul butoanelor sau prin intermediul valorilor citite de la senzorii analozi.
În cadrul buclei interne, se verifică starea butoanelor (buttonState1, buttonState2, buttonState3) și valorile senzorilor analozi (xValue și yValue). În funcție de acestea, se efectuează mișcări ale blocului curent pe tablă, cum ar fi mișcări în stânga, mișcări în dreapta, mișcări în jos sau rotații. Dacă butonul 3 (buttonState3) este apăsat și blocul curent nu este blocat, se efectuează schimbul între blocul curent și blocul ținut (holdBlock), iar bucla internă se încheie pentru a permite alegerea unui nou bloc curent. La sfârșitul buclei interne, se realizează o pauză de 500 de milisecunde (delay(500)) pentru a controla viteza de cădere a blocurilor și pentru a permite actualizarea ecranului. Dacă poziția blocului curent ajunge prea sus pe tablă (poziția posY mai mică decât 1), variabila gameOver este setată pe true, iar jocul se încheie. În afara buclei while, se afișează scorul și se afișează un mesaj de game over pe display-ul LCD.
In urma realizarii proiectului, atat din punct de vedere hardware si software am reusit sa implementez o consola portabila si functionala a jocului clasic Tetris.
Arhiva cu proiectul: tetris.zip