Autorul poate fi contactat la adresa: Login pentru adresa
Proiectul consta in implementarea jocului Connect 4 pe o matrice de LED-uri.
Acest joc este unul destul de simplu si are la baza o tabla de joc sub forma unei matrice in care doi jucatori dau drumul unor discuri, fiecare jucator avand discuri de o anumita culoare. Astfel, la fiecare runda, un jucator poate alege o coloana a matricei, care mai contine cel putin o pozitie libera, si ii da drumul discului, acesta pozitionandu-se pe prima celula libera din tabla de joc. Jocul se termina cand nu mai sunt pozitii libere disponibile sau unul din jucatori a reusit sa plaseze patru discuri (de aceeasi culoare) intr-o linie pe orizontala, verticala sau diagonala.
Scopul jocului este de relaxare si de construire a unei gandiri strategice.
Aceeasi tabla de joc va fi folosita de ambii playeri, lucru ce le va oferi posibilitatea sa interactioneze unul cu celalat.
In prima faza, toata matricea de led-uri va fi stinsa.
Pe masura ce playerii vor juca, led-urile se vor aprinde fie in verde, fie in rosu.
Un led se va gasi in una din cele 3 stari:
Vor exista 4 butoane pe placuta:
Jocul se va termina atunci cand vor exista 4 led-uri consecutive de aceeasi culoare sau nu vor mai exista mutari disponibile.
Lista piese:
Schema electrica:
Working on the project:
Mediu de dezvoltare: Notepad++, WinAVR
Pentru implementare mi-am mapat matricea de LED-uri la o matrice logica board[8][8], iar pentru culori mi-am definit 2 constante: GREEN → 1, RED → 2. LED-ul stins corespunde constantei NONE egala cu 0.
Functiile folosite / implementate sunt:
void init_board() - initializeaza tabla de joc si playerul
int get_last_free_row(int column) - returneaza ultimul rand liber de pe o coloana
void select_row(int row, int color) - aprinde led-ul de pe linia respectiva in functie de culoarea primita (RED/GREEN)
void select_column(int column) - selecteaza coloana data ca parametru
void change_move(int direction) - in functie de butonul apasat se muta ori la stanga ori la dreapta (stinge ledul curent si-l aprinde pe cel din stanga/dreapta)
void make_move(int move, int player) - seteaza o mutare
turn_off_all_leds() - stinge toate LED-urile de pe matrice
print_board() - aprinde LED-urile de pe matrice corespunzatoarea starii actuale
int check_full() - verifica daca matricea este ocupata complet
int checkDirection(int row, int col, int color, int d) - verifica daca jocul s-a terminat pe o singura directie (linie, coloana sau diagonala)
int gameWon() - functie ce se foloseste de checkDirection pentru a verifica daca jocul s-a terminat cu o victorie
Un proiect interesant si o bataie de cap in acelasi timp.
Cateva probleme intampinate:
- la un moment dat placuta nu se mai flashuia
- am lipit 3 pini invers si nu intelegeam de ce nu-mi merge placuta cum trebuie
- mi-a luat ceva sa-mi dau seama cum selectez o coloana din matrice cu ajutorul BCD-ului
- initial am cumparat o matrice gresita de LED-uri (nu era bicolora). A trebuit sa dau comanda de una noua si sa astept o saptamana sa imi ajunga
- am lipit chestii gresit pe placuta de test si mi-a fost foarte greu sa le mai scot asa ca a trebuit s-o iau de la 0 cu totul
M-am ajutat de laboratoarele 0 si 1.
Datasheet-uri:
* Datasheet matrice de LED-uri: https://www.kingbrightusa.com/images/catalog/spec/TBA23-11EGWA.pdf
* Datasheet BCD: http://www.ti.com/lit/ds/symlink/cd74hc42.pdf
* Documentația în format PDF