This is an old revision of the document!
Scopul proiectului este realizarea unui joc destul de cunoscut, mai exact jocul Snake, dar modul in care m-am gandit sa realizez implementarea acestuia este una putin mai diferita, m-am gandit la ceva mai interesant, mai exact controlul sarpelui prin miscarea placutei, unde se afla un accelerometrul cu 3 axe, componenta care se ocupa cu monitorizarea majoritatii actiunilor jucatorului cu rolul de a ghida Snake-ul pe unde sa se miste pe display(matrice 8×8).
Jocul se porneste prin intermediul unui buton de START care porneste display-ul, implementat prin intermediul unei matrici 8×8 bi-colora, incepand prin afisarea unui countdown ( 3 - 2 - 1 ), apoi se incepe efectiv jocul si trebuie miscata placuta.
In implementarea sa, Jocul folosește o matrice LED bicoloră simplă 8×8, ca afișaj pentru jocul în sine, și pentru scorul după terminarea jocului. Utilizează un accelerometru cu trei axe, care este atașat la placa de breadboard chiar lângă matricea LED. Accelerometrul este folosit pentru a detecta mișcarea întregii table de joc. Practic, direcția în care se inclina dispozitivul va mișca șarpele în aceeași direcție în care este înclinat. De exemplu, dacă îl înclinați înainte, șarpele se va ridica și așa mai departe.
Jocul se porneste prin apasarea butonului de start, se afiseaza un countdown de la 3 la 1 si apoi se controleaza sarpele prin simpla miscare a placutei, acesta trebuind sa ajunga la hrana pentru a evolua in marime. Atunci cand se ajunge in situatia in care s-a lovit de perete sau a apucat sa se incurce in dimensiune, jocul se va restarta prin butonul de RESTART.
In general, comentariile din cod explică cum funcționează cea mai mare parte a jocului, dar, pentru a explica mai mult in detaliu, board-ul isi seteaza valorile și apoi, dacă va citi o apăsare a butonului de pornire, va trece și va atrage atât ținta, cât și șarpele din informațiile primite în funcția de configurare. Apoi va monitoriza pentru a se asigura că șarpele se află în zona de joc și că nu s-a lovit singur, dacă ambele afirmații sunt adevărate, va apela o funcție pentru a detecta poziția accelerometrului și va muta șarpele în pozitia respectiva, dacă unul este fals, se va numi GAME OVER.
Functia principala care se ocupa cu miscarea sarpelui/snake-ului pe matricea 8×8 bi-colora, începe prin a stabili valorile pe care ar trebui să fie x și y în timp ce accelerometrul și placa sunt ținute plate. În continuare, definim un prag pentru detectarea înclinării și, prin urmare, a mișcării. De exemplu, dacă vrem să ne mișcăm la stânga, avem nevoie de valoarea noastră y, care acționează ca o axă orizontală, minus valoarea noastră de repaus, să fie mai mare decât orice am stabilit pragul.
De asemenea, deoarece dorim să evităm eroarea diagonală în mișcare pe care am întâlnit-o în a doua încercare de a codifica mișcarea, trebuie să ne asigurăm că valoarea absolută a citirii curente x minus x în repaus este mai mică decât pragul nostru. Cu alte cuvinte, trebuie să ne asigurăm că valoarea noastră x este între prag și pragul negativ, ceea ce înseamnă că nu putem citi două direcții simultan. În acest caz, deoarece ne-am setat valorile de repaus la zero, probabil că am putea folosi doar valorile accel.cx și accel.cy în loc să scădem valoarea de repaus din ele, totuși acest lucru va face astfel încât, dacă vrem vreodată să schimbăm poziția neutră putem face asta cu ușurință. Celelalte trei direcții funcționează în moduri similare.
Pentru fiecare direcție vom salva, de asemenea, direcția în care mergea într-o variabilă care, pentru a ne asigura că jocul are suficientă provocare, va fi activată atunci când accelerometrul revine la o stare plată și astfel șarpele va continua să se miște în orice direcție. ultima direcție în care se mișcase până când este din nou înclinată.
De asemenea, în timp ce șarpele se află pe terenul de joc, se mișcă și nu s-a lovit singur, jocul va monitoriza poziția șarpelui și a țintei pentru a vedea dacă jucătorul înscrie.
Alta functie destul de important de mentionat in acest proiect este cea care realizeaza cresterea sarpelui, mai exact aceasta verifică dacă capul șarpelui, reprezentat de snakeX[0] și snakeY[0], este același cu coordonatele țintei. Dacă acest lucru este fals, ținta rămâne acolo unde a fost și șarpele rămâne la aceeași lungime. Dacă este adevărat, atunci șarpele va crește cu un pixel și scorul va crește cu un punct. Codul va verifica cât de lung este șarpele atunci, dacă este mai mică decât lungimea maximă a șarpelui, atunci va apela o funcție și va face o altă țintă după care șarpele va urma. Dacă nu este mai mică decât lungimea maximă, nu va mai face ținte.
În codul meu am setat lungimea maximă a șarpelui la 64, care este întreaga matrice LED. Am făcut asta pentru că am vrut ca jocul să se termine doar dacă șarpele a murit și nu dacă a ajuns la o anumită lungime.
asd
TBA
TBA
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.
Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului.
Mici probleme tehnice si de logica asupra proiectului
M-am confruntat și cu alte câteva probleme. Inițial am plănuit ca butonul de PORNIRE să acționeze atât ca butonul de pornire, cât și ca butonul de resetare, totuși, după ce am întâmpinat unele probleme în încercarea de a codifica asta și am văzut că aveam loc pentru un alt buton, am decis să conectez pur și simplu un alt buton, care ar face resetarea in sine pentru mine.
În cele din urmă, o problemă cu care am întâlnit a fost că uneori jocul parea să se blocheze când foloseam o baterie de 9 volți. Jocul s-ar fi jucat bine, dar se bloca între timp. L-am testat din nou în timp ce scriam acest lucru și mi s-a părut că funcționează bine, totuși, pentru a evita această posibilă eroare, prefer să-l conectez la computer pentru alimentare. Aceasta poate fi o problemă cu bateria slabă sau pur și simplu nu are suficientă putere pentru a rula toate funcțiile jocului.
De asemenea, am mai constatat că atunci când folosesc bateria, din cauza greutății sale, poate fi dificil să joci. Având bateria atârnată pe lateral pare să fie astfel încât să trebuie să înclinați cu mai multă forță pentru a face ca accelerometrul și șarpele să recunoască mișcarea. Acest lucru ar putea fi corectat probabil prin ajustarea pragurilor din cod.
Resurse Software
Resurse Hardware