Snake Game

Nume: Nita Laurentiu-Mihai, Grupa: 332CA

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 si harta. Ideea principala de la care am plecat este de a avea la indemana un mod prin care te poti delecta.

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, 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);
  • Medium (LED galben);
  • Hard (LED rosu).

Schema Bloc:

Hardware Design

Listă de piese:

  • Arduino UNO (ATmega328P)
  • Breadboard
  • LCD
  • LED RGB
  • Buton
  • Joystick
  • Buzzer
  • Fire de legature
  • Rezistente

Schema electrica:


hardware_inside_ln.jpg

final_ln.jpg

Software Design

Pentru a interactiona cu LCD-ul am folosit libraria TFT.h. Cum ecranul are o dimensiune de 128×160, am decis ca obiectele din joc sa aiba o marime de 5×5, 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

Meniu joc:

meniu_ln.jpg

Dificultati joc:

  • Easy (Verde):

easy_ln.jpg

  • Medium (Galben):

medium_ln.jpg

  • Hard (Rosu):

hard_ln.jpg

Game over:

gameover_ln.jpg

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

Jurnal

21 Aprilie 2022: Alegere proiect & creare wiki. Adaugare introducere, descriere generala, lista de componente
8 Mai 2022: Adaugare schema bloc
23-26 Mai 2022: Implementare joc
27 Mai 2022: Finalizare proiect
1 Iunie 2022: Actualizare wiki

Bibliografie/Resurse

Export to PDF

pm/prj2022/avaduva/snakegame.txt · Last modified: 2022/06/01 18:04 by laurentiu.nita
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0