Autorul poate fi contactat la adresa: Login pentru adresa
Proiectul are ca scop implementarea celebrului joc Tetris folosind ca display mai multe matrice de LED-uri inlantuite.
Tetris este un joc puzzle care consta in asezarea unor forme geometrice compuse din 4 patratele care se deplaseaza in jos pe o matrice astfel incat sa se umple un rand intreg. Atunci cand un rand este umplut, acesta dispare. Formele geometrice pot fi mutate stanga/dreapta sau rotite cu 90 de grade pentru a se potrivi mai bine. Jocul se termina atunci cand nu mai este loc pentru formele geometrice care se deplaseaza.
Pe langa display-ul de LED-uri va exista si un buzzer care va emite un sunet atunci cand se aseaza o piesa, cand se termina jocul etc.
Proiectul este util pentru divertisment, jocul fiind destul de interesant (mai ales cand nu ai ce face ).
Ideea de la care am pornit a fost sa fac ceva ce voi putea folosi si dupa terminarea proiectului si, de asemenea, mi-am dorit sa fac un proiect in care partea de hardware si cea de software sa fie destul de echilibrate.
Miscarile pieselor vor fi controlate prin cele 4 butoane: start/reset, mutare stanga, mutare dreapta, rotire 90 de grade. Starea curenta a jocului va fi afisata pe display, iar la fiecare eveniment important (asezare piesa, sfarsit de joc si altele) buzzerul va emite un sunet corespunzator.
Piesa | Cod | Producator | Cantitate | Distribuitor |
---|---|---|---|---|
Matrice de leduri 8×8 catod comun | LMD23088AUE-101A | WENRUN | 2 | TME |
Fire mama-mama | MIKROE-511 | MIKROELEKTRONIKA | 33 | TME |
Buzzer | BMT-1203UX | BESTAR | 1 | TME |
Placa prototip | PC-01LAM | SCI | 1 | TME |
Buton | TACT-24R-F | NINIGI | 4 | TME |
Sir pini | 4-103321-8 | TE Connectivity | 2 | TME |
Rezistente 220 ohm | 1/4W220R | ROYAL OHM | 16 | TME |
Rezistente 470 ohm | - | - | 4 | Optimus Digital |
Driver tranzistori | ULN2804APG | Toshiba | 1 | Conex Electonic |
Am folosit editorul Programer's Notepad 2 si am compilat sursele folosind WinAVR.
Deoarece pinii matricii de leduri controleaza cate o linie si o coloana, a trebuit sa sting si sa aprind ledurile foarte repede pentru a putea sa aprind ce leduri vreau si a crea senzatia ca sunt aprinse continuu. Am pastrat starea curenta a jocului intr-o matrice de 16 x 8 pentru a usura desenarea jocului pe matricea de leduri.
void init(); /* functie de initializare a porturilor pentru citire/scriere */ void draw_matrix(int[16][8]); /* functie care aprinde ledurile, in functie de valoarile din matricea data ca parametru (1 -led aprins, 0 - led stins) */ void make_sound(int); /* genereaza un sunet pe buzzer, in functie de frecventa data ca parametru */ void play(); /* functie in care sunt implementate etapele de succesiune a jocului */ void draw_animation(); /* functie care deseneaza o animatie la inceperea jocului */ void new_piece(); /* functie care genereaza o piesa noua */ void move_down(); /* functie care muta piesa o pozitie in jos */ void move_right(); /* functie care muta piesa o pozitie la dreapta */ void move_left(); /* functie care muta piesa o pozitie la stanga */ int detect_colision(); /* functie care detecteaza coliziunile dintre piesa si celelalte piese din joc */ int detect_colision_at_top(); /* functie care detecteaza coliziunile in partea de sus a matricii */ void remove_row(); /* functie care sterge un rand daca e plin */ void detect_row(); /* functie care detecteaza daca un rand trebuie sters */ int check_rotate(); /* functie care determina daca rotatia e valida */ void rotate(); /* functie care roteste matricea 90 de grade spre stanga */ void clear_matrix(); /* functie care sterge continutul matricii jocului la reinitializarea acestuia */
Proiectul a fost unul interesant si din fericire am reusit sa ma documentez destul de bine inainte sa lipesc piesele, astfel incat sa nu ard nimic si sa pot sa aprind matricile de leduri. Singura dificultate majora a constat in faptul ca au fost foarte multe fire de lipit si a fost si destul de complicat sa le lipesc, deoarece pinii matricii de leduri nu erau intr-o parte linii si intr-o parte coloane, asa cum ma asteptam. La partea de software nu am intampinat nici o dificultate.
Pe viitor as putea sa mai dezvolt proiectul adaugand si alte jocuri.
Codul este gandit in intregime de mine.