This is an old revision of the document!
Proiectul meu consta in realizarea jocului Nim pe o placuta ATMega328P, folosind ca display un LCD ST7735S. Nim reprezinta un joc matematic in care doi jucatori iau cu randul obiecte din multimi diferite. Pentru acest proiect am ales varianta Misere a jocului, in care pierzator este cel care ia ultimul obiect din joc, indiferent de multime.
Reguli joc: pe rand, fiecare jucator poate lua orice numar de elemente dintr-o singura multime. Nu se pot lua in aceeasi tura elemente din doua sau mai multe multimi. Jocul se termina doar atunci cand nu mai exista elemente de luat, caz in care jucatorul care a facut ultima mutare pierde.
Exemplu de joc: 2 multimi A si B cu 2 elemente fiecare, 2 jucatori, Alice si Bob.
Pentru ca Alice a luat ultimul element, ea a pierdut.
Scopul proiectului este unul pur recreational, realizat pentru amuzamentul utilizatorului.
Pentru acest proiect, jocul are 4 multimi a cate 7 elemente fiecare. Voi utiliza 4 butoane, unul pentru fiecare heap, si un buton care sa marcheze confirmarea actiunii si trecerea la jucatorul urmator. Fiind doar un joc pe display, nu sunt necesare multe module pentru a asigura buna functionare a acestuia, importanta consta in inregistrarea inputului jucatorului si afisarea pe ecran a actiunii.
Pini utilizati:
| Pin | Rol | Componenta |
|---|---|---|
| PB7 | GPIO | Buton master |
| PD2 | GPIO | Buton heap 1 |
| PD3 | GPIO | Buton heap 2 |
| PD4 | GPIO | Buton heap 3 |
| PD5 | GPIO | Buton heap 4 |
| PB2 | SPI | CS |
| PD7 | GPIO | Reset |
| PD6 | GPIO | DC |
| PB3 | SPI | SDA |
| PB5 | SPI | SCK |
| GND | Ground | |
| GND | Ground | |
| 5V | Power | |
| 3V3 | Power |
Proiectul va fi dezvoltat cu ajutorul PlatformIO care este integrat in MS Visual Studio Code, folosind avr-gcc.
Modulele software ale proiectului sunt:
Functia main are rolul de initializare a modulelor si rularea unui loop infinit care sa inglobeze toate rundele care sunt jucate. Asta inseamna ca exista un loop care numara rundele castigate sau pierdute, fara a se ocupa de logica jocului. in acest loop exista game loop-ul propriu zis, care verifica constant starea jocului si determina castigatorul.
Logica jocului este urmatoarea:
Jocul este reprezentat in cod de un struct care contine numarul total obiecte si numarul de obiecte din fiecare heap.
LCD-ul este modul prin care jocul comunica informatie jucatorului. Exista trei ecrane principale: cel de start joc, jocul propriu zis, si ecranul de win/lose, alaturi de numarul de runde castigate/pierdute. Dintre acestea, cel mai complex este ecranul in timpul jocului, deoarece sunt randate multimile, numarul lor, timer-ul jucatorului si mesajul de play/wait. Pentru ca
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.
Resurse Hardware
Pentru realizarea diagramei am utilizat EasyEDA. Lista footprinturi piese:
Resurse software
Pentru realizarea diagramei bloc am utilizat PlantUML.