This shows you the differences between two versions of the page.
pm:prj2022:avaduva:snakegame [2022/05/24 18:02] laurentiu.nita |
pm:prj2022:avaduva:snakegame [2022/06/01 18:04] (current) laurentiu.nita [Bibliografie/Resurse] |
||
---|---|---|---|
Line 4: | Line 4: | ||
===== Introducere ===== | ===== Introducere ===== | ||
- | Scopul proiectului este de a reinterpreta jocul snake pe un LCD avand posibilitatea de a schimba nivelul de dificultate, modificand astfel viteza de deplasare a sarpelui. Ideea principala de la care am plecat este de a avea la indemana un mod prin care te poti delecta. | + | Scopul proiectului este de a reinterpreta jocul snake pe un LCD avand posibilitatea de a schimba nivelul de dificultate, modificand astfel viteza de deplasare a sarpelui si harta. Ideea principala de la care am plecat este de a avea la indemana un mod prin care te poti delecta. |
===== Descriere generală ===== | ===== Descriere generală ===== | ||
- | Jocul va fi reprezentat pe un display, sunetele vor fi redate printr-un buzzer, iar controlul caracterului va fi realizat prin folosirea unui joystick. Scorul va fi afisat dupa ce se detecteaza o coliziune. De asemenea, jucatorul va putea schimba dificultatea, care este initial setata pe modul "Easy" si reprezentata prin culoarea verde a LED-ului, folosind un buton. La apasarea acestui buton viteza de deplasare a sarpelui va creste, multiplicatorul de punctaj va creste, sunetele se vor schimba, iar culoarea LED-ului se va modifica pentru a defini dificultatea curenta. Butonul va cicla prin urmatoarele moduri: | + | Jocul va fi reprezentat pe un display, sunetele vor fi redate printr-un buzzer, iar controlul caracterului va fi realizat prin folosirea unui joystick. Scorul va fi afisat dupa ce se detecteaza o coliziune. De asemenea, jucatorul va putea schimba dificultatea, care este initial setata pe modul "Easy" si reprezentata prin culoarea verde a LED-ului, folosind un buton. La apasarea acestui buton viteza de deplasare a sarpelui va creste, harta se va schimba, iar culoarea LED-ului se va modifica pentru a defini dificultatea curenta. Butonul va cicla prin urmatoarele moduri: |
* Easy (LED verde); | * Easy (LED verde); | ||
Line 33: | Line 33: | ||
Schema electrica: | Schema electrica: | ||
- | {{pm:prj2022:avaduva:schema_electrica_snake_ln.png?700}} | + | {{pm:prj2022:avaduva:schema_electrica_ln.png?700}} \\ |
+ | |||
+ | {{pm:prj2022:avaduva:hardware_inside_ln.jpg?700}} \\ | ||
+ | |||
+ | {{pm:prj2022:avaduva:final_ln.jpg?700}} | ||
===== Software Design ===== | ===== Software Design ===== | ||
+ | |||
+ | Pentru a interactiona cu LCD-ul am folosit libraria TFT.h. Cum ecranul are o dimensiune de 128x160, am decis ca obiectele din joc sa aiba o marime de 5x5, astfel jocul este implementat ca fiind o matrice de 25 de linii si 32 de coloane. Obiectivul jocului este ca sarpele sa manance cat mai multe fructe, marindu-si dimensiunea la fiecare fruct mancat.\\ | ||
+ | |||
+ | |||
+ | Functii implementate: | ||
+ | * void pin_ISR(): Intrerupere pentru apasarea butonului care schimba dificultatea jocului; | ||
+ | * void rgbColor(int redLightValue, int greenLightValue, int blueLightValue): Schimba culoarea LED-ului RGB; | ||
+ | * void setup(): Sunt setati pinii si se initializeaza LED-ul, starea jocului, LCD-ul; | ||
+ | * void loop(): Se verifica starea jocului; | ||
+ | * void menu(): Jocul se afla in starea gameMenu si se afiseaza un meniu al jocului pe ecran; | ||
+ | * void game(): Jocul se afla in starea game si sunt realizati urmatorii pasi: | ||
+ | * Se deseneaza harta corespunzatoare dificultatii; | ||
+ | * Se alege pozitia fructului; | ||
+ | * Se verifica daca sarpetele a mancat fructut, caz in care se reda un sunet si se incrementeaza scorul; | ||
+ | * Se verifica directia joystick-ului pentru a misca sarpele; | ||
+ | * Se verifica coliziunile; | ||
+ | * Se actualizeaza sarpele pe harta; | ||
+ | * Se actualizeaza harta; | ||
+ | * Se deseneaza obiecte; | ||
+ | * Se pune un delay in functie de dificultate pentru a regla viteza. | ||
+ | * void spawnFruit(byte map3[23][30]): Se aleg coordonatele fructului, iar daca dificultatea este 3 (rosu) si verifica ca fructul sa nu fie intr-un obstacol aflat in map3; | ||
+ | * void getInput(): Se verifica directia joystick-ului; | ||
+ | * void checkColision(byte map3[23][30]): Se verifica coliziunea sarpelui cu obstacolele din map3 (pentru dificultatea 3); | ||
+ | * void movement(): Se deplaseaza sarpele, iar pentru dificultatile 2 si 3 se verifica daca exista coliziune cu marginile hartii; | ||
+ | * void updateSnake(): Se actualizeaza corpul sarpelui pe harta; | ||
+ | * void updateMap(): Se actualizeaza harta si se verifica daca sarpele s-a lovit de el insusi; | ||
+ | * void gameOver(): Jocul se afla in starea gameOver. Se afiseaza scorul obtinut pana in acel moment si se reda o melodie pentru pierderea jocului. Jucatorul poate reveni la meniu sau poate restarta nivelul; | ||
+ | * void resetGame(): Se reseteaza toate datele jocului (scor, dimensiunea sarpe, pozitie sarpe/fruct); | ||
+ | * void resetMap(): Se reseteaza harta (pozitiile sarpelui pe harta); | ||
+ | * void draw(): Se deseneaza obiectele pe harta (fruct, sarpe); | ||
+ | * void drawFruit(byte x, byte y): Se deseneaza fructul la pozitia cu coordonatele x si y; | ||
+ | * void drawSnake(byte x, byte y): Se deseneaza o parte din sarpe la pozitia cu coordonatele x si y; | ||
+ | * void drawMap(byte map3[23][30]): Se deseneaza harta in functie de dificultate. | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
+ | Meniu joc:\\ | ||
+ | |||
+ | {{pm:prj2022:avaduva:meniu_ln.jpg?300}}\\ | ||
+ | |||
+ | Dificultati joc: | ||
+ | * Easy (Verde):\\ | ||
+ | |||
+ | {{pm:prj2022:avaduva:easy_ln.jpg?300}} | ||
+ | |||
+ | * Medium (Galben):\\ | ||
+ | |||
+ | {{pm:prj2022:avaduva:medium_ln.jpg?300}} | ||
+ | |||
+ | * Hard (Rosu):\\ | ||
+ | |||
+ | {{pm:prj2022:avaduva:hard_ln.jpg?300}} | ||
+ | |||
+ | Game over: | ||
+ | |||
+ | {{pm:prj2022:avaduva:gameover_ln.jpg?300}} | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
+ | |||
+ | Acest proiect m-a ajutat sa inteleg mai bine cum functioneaza si din ce sunt formate obiectele pe care le folosesc de zi cu zi si a fost interesant sa-mi pot creea propriul meu obiect. | ||
===== Download ===== | ===== Download ===== | ||
+ | {{pm:prj2022:avaduva:snakegame_laurentiu_nita_332ca.zip}} | ||
===== Jurnal ===== | ===== Jurnal ===== | ||
21 Aprilie 2022: Alegere proiect & creare wiki. Adaugare introducere, descriere generala, lista de componente\\ | 21 Aprilie 2022: Alegere proiect & creare wiki. Adaugare introducere, descriere generala, lista de componente\\ | ||
- | 8 Mai 2022: Adaugare schema bloc | + | 8 Mai 2022: Adaugare schema bloc\\ |
+ | 23-26 Mai 2022: Implementare joc\\ | ||
+ | 27 Mai 2022: Finalizare proiect\\ | ||
+ | 1 Iunie 2022: Actualizare wiki | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
+ | |||
+ | * Laboratoare PM | ||
+ | * Documentatie pentru LCD: https://www.arduino.cc/reference/en/libraries/tft/ | ||
+ | * Cod RGB: https://rgbcolorcode.com/color/B366FF | ||
+ | * Aplicatie pentru simulare si creare schema electrica: https://fritzing.org/ | ||
<html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||