Introducere
Jocul Tetris este unul dintre cele mai populare si mai iubite jocuri de tip puzzle din copilarie. Jocul foloseste 7 piese numite tetromino-uri, fiecare format din 4 blocuri. Acestea trebuie asezate pe masura ce coboara astfel incat sa existe cat mai putine goluri intre ele. Scopul jocului este acela de amuzament si de recreere activa.
Descrierea generala
Mai jos este prezentata schema bloc cu modulele proiectului:
Jocul va fi afisat pe un display LCD de Nokia 3310. Controlul jocului se va realiza cu 5 butoane: UP, DOWN, LEFT, RIGHT, CENTER. Pentru deschiderea jocului sia ctivarea meniului se va apasa butonul CENTER. Pentru selectarea nivelui jocului se va apasa una din tastele LEFT (nivel 1), DOWN (nivel 2) sau RIGHT (nivel 3). Pentru controlul pieselor in joc, se vor folosi butoanele LEFT pentru mutare la stanga a piesei, RIGHT pentru mutarea la dreapta a piesei, DOWN pentru cresterea vitezei piesei si UP pentru rotirea piesei. Cand se doreste iesirea din joc, se va apasa butonul CENTER.
Hardware Design
LCD-ul Nokia 3310 va fi conectat la microcontroller-ul Atmega16. Intrucat LCD-ul trebuie alimentat, confirm datasheet, la o tensiune de maxim 3.3 V, se va folosi un divizor de tensiune. Astfel, placuta extensie va contine (pe langa cele 5 butoane), sase rezistente de 3.3 K, sase rezistente de 1.8 K, un condensator de 10 uF si un condensator de 100 uF. LCD Nokia 3310 foloseste protocolul SPI, astfel ca pinii acestuia au fost legati la portul PORTB al Atmega16.
Mai jos sunt prezentate schemele electrice ale modulelor proiectului:
Urmatoarea imagine reprezinta jocul rulat in simulatorul Proteus 7 Professional:
Software Design
Jocul a fost implementat in C si compilat cu avr-gcc. Pentru interfatarea cu LCD Nokia 3310, am folosit un driver deja implementat (la care am adaugat mici modificari in functie de cerintele hardware), gasit pe internet (vezi resurse). Desi se gasesc numeroase API-uri, acesta mi s-a parul cel mai adecvat jocului realizat.
Exemple de functii pentru interfatarea LCD:
/* Function prototypes */ void LcdInit ( void ); void LcdClear ( void ); void LcdUpdate ( void ); void LcdImage ( const byte *imageData ); void LcdContrast ( byte contrast); byte LcdGotoXYFont ( byte x, byte y ); byte LcdChr ( LcdFontSize size, byte ch ); byte LcdStr ( LcdFontSize size, byte dataArray[] ); byte LcdFStr ( LcdFontSize size, const byte *dataPtr ); byte LcdPixel ( byte x, byte y, LcdPixelMode mode ); byte LcdLine ( byte x1, byte x2, byte y1, byte y2, LcdPixelMode mode ); byte LcdRect ( byte x1, byte x2, byte y1, byte y2, LcdPixelMode mode ); byte LcdSingleBar ( byte baseX, byte baseY, byte height, byte width, LcdPixelMode mode ); byte LcdBars ( byte data[], byte numbBars, byte width, byte multiplier );
Implemetarea jocului Tetris:
Display-ul LCD are o rezolutie de 84 x 48 pixeli. Pentru a fi vizibil si pentru a se distinge de celelalte blocuri, un bloc al unei piese va fi de dimensiunea 3 x 3 pixeli, cum marginile pixeli aprinsi si centrul pixeli stinsi. Deci o prima faza a programului este impelmentarea unei functii de afisare a unui bloc.
Pentru realizarea logicii jocului au fost definite structuri pentru retinerea pozitiilor relative a blocurilor intr-o piesa, pozitiile relative dupa rotirea unei piese, retinerea pozitiilor blocurilor din “zidul” care se creeaza la baza ecranului.
Alte functii implementate importante sunt cele pentru crearea unei piese, mutarea unei piese, rotirea unei piese, adaugarea unei piese la “zid”, eliminarea unui rand de blocuri atunci cand se umple etc.
Rezultate obtinute
Concluzii
Desi realizarea proiectului nu prezinta un nivel ridicat de complexitate, atat implementarea software a jocului cat si realizarea partii hardware au reprezentat un pas important in dezvoltarea ca viitor inginer.
Download
Arhiva cu sursele: tetris.zip
Bibliografie/Resurse
Nokia 3310 LCD model for Proteus downloads217.html
Nokia 3310 LCD driver lcd_pcd8544_v026rev1.zip
Nokia 3310 LCD Datasheet pcd8544.pdf