Acesta este o platforma pentru a juca jocul Nim atat cu un prieten ,cat si contra un calculator. Acest joc este foarte popular in “Game-theory” si sta la baza jocurilor de tipul “impartial game”. Acest joc este util pentru a intelege bazele acestor concepte intr-un mod mai interactiv.
Cand placuta este pornita, jucatorul va fi intampinat de un meniu in care va selecta modul de joc, single-player sau two-player. Acest lucru se va face prin utilizare joystick-ului stanga dreapta, pentru a schimba modul de joc (care va aparea pe matricea de LED-uri), si intr-un final apasarea butonului pentru a selecta modul ales. Pentru modul single-player se va putea folosi joy-stick-ul sus jos pentru selectarea dificultatii. Dupa aceasta alegere, jucatorul va putea alege formatul jocului (modul in care sunt distribuite betele) folosind joy-stick-ul stanga dreapta si butonul de SELECT
Odata ales jocul, jucatorul aflat la miscare fi indicat de marginea matricii de LED-uri. Acesta va putea folosi joystick-ul pentru alegerea miscarii dorite. Betele afectate vor fi vizibile prin aprinderea si stingerea acestora. Miscarea este executata cu ajutorul butonului SELECT. Intr-un final cand se termina jocul va fi afisat castigatorul jocului, iar placuta se va intoarce in meniul de selectie al modului de joc. De asemenea jocul se mai termina dupa trecerea unui interval de timp fara ca jucatorul sa faca vre-o miscare, jocul fiind declarat castigat de celalt jucator(Fie ca acesta este alta persoana sau calculatorul).
Concepte folosite:
Schema circuit:
Schema electrica:
Lista de componente:
Modul de utilizare al componentelor:
Acesta este folosit pentru afisarea jocului si pentru testarea functionarii corecte a programului.
Matricea are 5 pini care sunt conectati astfel:
Acesta este folosit pentru citirea input-ului jucator.
Modulul are 5 pini care sunt conectati astfel:
Acesta este folosit pentru citirea input-ului jucator.
Butonul are 2 pini:
Poza cu proiectul:
Github: Nim Game
#include <LedControl.h> #define NEUTRAL 510 #define MAX 1023 #define ERR 10 #define SWITCH_PLAYER 3 #define RANDOM 3 #define NUM_MAPS 4 #define MAP_SIZE 6 #define DEBOUNCE_DELAY 300 #define CPU_MOVE 300 #define G2P 2 #define GCPU 1 #define HARD 2 #define RESET_TIME 120000
Biblioteca LedControl este utilizata pentru a controla matricea de LED-uri prin intermediul interfetei SPI.
int DIN = 11; // Pinul pentru date int CS = 10; // Pinul pentru selectarea cipului int CLK = 13; // Pinul pentru ceas LedControl lc = LedControl(DIN, CLK, CS, 0); int xPin = A0; int yPin = A1; int buttonPin = 2;
byte DIFFICULTY[3][8] = { ... }; byte WIN[2][8] = { ... }; byte EMPTY[8] = { ... }; byte P2[8] = { ... }; byte P1[8] = { ... }; byte QUESTION_MARK[8] = { ... }; byte NUM_PLAY[8][3]; byte Disp[8];
Tabele reprezentand diferite stari ale afisajului: niveluri de dificultate, ecrane de castig, indicatori de jucatori, etc.
int map_layout[3][6] = { ... }; int current_map[6];
Definirea configuratiilor stariilor initiale de joc si o variabila pentru a tine harta curenta.
void loop() { if (menu > 0) { menu_org(); } else { game_manager(); } show_display(); for (int i = 0; i < 8; i++) Disp[i] = EMPTY[i]; }
Bucla principala care comuta intre meniu și modurile de joc si actualizeaza afisajul.
Implementarea acestui proiect a dus la crearea unui joc complet funcțional pe o matrice de LED-uri, controlat printr-un joystick și un buton. Am reușit să gestionăm corect intrările analogice și digitale, să implementăm o logică de joc pentru două jucătoare și să integrăm un oponent CPU cu diferite niveluri de dificultate. Proiectul a demonstrat capacitatea de a utiliza biblioteca LedControl pentru a controla o matrice LED 8×8, de a debuga și testa eficient codul pentru a elimina erorile și de a crea o experiență interactivă de joc. Acest proiect a oferit o bază solidă pentru dezvoltarea unor proiecte mai complexe, implicând automatizarea și controlul hardware-ului prin programare.
Implementarea acestui proiect a implicat gestionarea intrărilor analogice și digitale, cum ar fi joystick-ul și butonul, pentru a controla jocul. De-a lungul procesului de dezvoltare, s-au întâlnit diverse erori și probleme, necesitând testare și depanare constantă pentru asigurarea funcționării corecte a codului. Cu toate acestea am obținut o introducere în crearea unui proiect folosind automatizările și cred că acum sunt pregătit să întâmpin proiecte și mai dificile.