Proiectul consta din crearea unui sistem de jocuri pe un ecran LCD, cu folosirea unui sistem de texturi tile-based, sistem de sunet, si control cu un joystick cu buton incorporat si cu salvarea scorurilor in EEPROM. Pe baza acestui sistem voi implementa un joc Snake, cu 3 dificultati.
Scopul este crearea unui framework simplu pentru jocuri tile-based pe Arduino si implementarea unui joc Snake ca exemplu.
Idea din spatele unui astfel de framework provine din jocurile clasice, ca exemplu Super Mario Bros. , Legend of Zelda sau Final Fantasy. In aceste jocuri, cea mai mare parte din partea grafica a jocului era compusa din tile textures, cu cateva elemente, de obicei inamici si caracterul jucatorului, care se puteau misca liber.
O sa incerc sa creez un framework cat mai general de creare a unui joc bazat pe tile-uri, de tipul jocurilor clasice de NES si SNES. Pentru crearea jocurilor, dezvoltatorul va completa un numar de functii, unele chemate in setup(), altele in loop(), de tipul initializare texturi sau next frame. Folosind acest framework, o sa scriu un joc de Snake, cu 3 nivele de dificultate: jocul simplu, in care snake poate trece pe partea cealalta a ecranului, o versiunea in care marginea ecranului e un obstacol, si o versiunea la care, pe langa margine, avem si obstacole pe restul hartii, generate aleator.
Programul urmareste structura standard a programelor Arduino, avand functiile setup si loop. In functia setup se initializeaza unele valori, dar cea mai mare parte a operatiilor se fac in loop, folosind o masina de stari. De asemenea, in loop ruleaza si partea de muzica.
In aceasta stare se alege dintre cele 3 nivele posibile
Aici se initializeaza nivelul si se trece direct la Level running dupa o rulare a functiei.
In nivelul 1 nu avem nici un obstacol. In nivelul 2 terenul de joc este inconjurat de obstacole. In nivelul 3, pe langa zidul exterior, avem 4 obstacole in interior.
In oricare dintre cele 3 nivele se genereaza pozitia a 2 mere. Pentru a fi siguri ca nu generam un mar unde nu se poate, numaram cate tile-uri sunt libere pe parcursul jocului si apoi parcurgem vectorul de tile-uri pana la un tile liber random si generam acolo marul.
Din EEPROM, citim high-score-ul pentru nivelul selectat
Initial, calculam pozitia noua a capului sarpelui, daca acolo este un mar, il mancam si crestem in lungime, daca acolo este un obstacol, jocul se termina. Daca este un spatiu gol, sarpele se muta mai in fata cu o pozitie.
Score-ul este calculat astfel: Avem un scor maxim, initial de 100, ce creste cu 100 pentru fiecare mar mancat. La fiecare miscare a sarpelui, scorul creste cu 10, pana la scorul maxim.
Daca avem un nou high score, il scriem doar odata in EEPROM. Afisam pe ecran GAME OVER, scorul nostru si high-score-ul.
Avem un vector ce retine ce tile corespunde unei anumite pozitii. Pentru a salva memorie, in loc sa avem o matrice de 16×16, avem un vector de 256 de pozitii. Salvam memorie deoarece putem retine un singur byte pentru pozitiile sarpelui, in loc de 2 coordonate. Cand setam un tile nou, il randam doar daca acesta este diferit de cel deja pe ecran. Astfel limitam timpul petrecut trimitand date ecranului.
Avem un vector ce retine notele si unul ce retine duratele. Folosim tone pentru durata corespunzatoare notei, iar dupa ce aceasta se termina, trecem la nota urmatoare.
Link-ul la video-ul de prezentare Jocul Snake
Rezultatul este un ansamblu pe care se poate juca o versiune simpla a jocului Snake, cu muzica de fundal, si cu salvarea high-score-urilor in memoria EEPROM a Arduino-ului.
Sunt multumit de proiectul finalizat. Am avut unele dificultati cauzate de memoria mica a Arduino Uno. De exemplu, nu am mai putut folosi texturi luate de pe cardul SD sau sa salvez un istoric al scorurilor pe card. Biblioteca de carduri SD necesita multa memorie si am avut instabilitati la rulare.
In continuare, as putea sa fac 3 modificari majore:
Documentația în format PDF