Snake

Introducere

  • Proiectul consta in implementarea jocului Snake pe un ecran LCD, controlat dintr-un telefon conectat prin Bluetooth.
  • In joc, exista un personaj, sarpele, care poate merge intr-una din cele 4 directii (sus, jos, stanga, dreapta). Directia sa de miscare este controlata prin Bluetooth (se trimite caracterul 'w', 's', 'd' sau 'a'). Pe ecran, va exista mereu un obiect colectabil (mancare) la o pozitie oarecare. Scopul sarpelui este sa ajunga la cat mai mult astfel de obiecte. La fiecare obiect colectat, lungimea sarpelui creste cu o unitate. Jocul se termina atunci cand varful sarpelui atinge corpul sau (are loc o coliziune).
  • La deschiderea programului, va aparea un mesaj de inceput. Apasarea oricarui buton declanseaza inceputul jocului.
  • Scorul va aparea in coltul din stanga sus, in timpul jocului.
  • In caz de gameover va aparea un mesaj. Apasarea oricarui buton declanseaza inceperea unui joc nou.

Descriere generala

Schema bloc

Componente

Nume Numar Link
Arduino Uno 1 click
Breadboard 1 click
Modul LCD SPI 128×160 1 click
Modul bluetooth HC-05 1 click
Fire 14

Hardware Design

Conectare modul Bluetooth

Pentru conectarea acestui nodul, este nevoie sa conectam pinii GND si VCC la pinii GND si 5V de pe Arduino, precum si conectarea pinilor RX si TX la pinii TX(1), respectiv RX(0) ai Arduino.

Astfel, avem o comunicare seriala.

Din perspectiva telefonului, este nevoie de un telefon Android cu o aplicatie de tipul Bluetooth Terminal. Eu am ales aplicatia BlueDuino care permite conectarea prin Bluetooth la un device, ofera o interfata grafica cu 4 butoane (sus, jos, stanga, dreapta) care pot fi configurate a.i. la apasare sa fie trimis un String (“w”, “s”, “a”, “d”). In Arduino, tot ce trebuie facut este: myblue.read() si verificarea caracterului citit.

Conectare ecran LCD

Modulul LCD SPI 128×160 vine cu 8 pini, dintre care GND si VCC trebuie sa fie conectati la GND si 5V de pe Arduino, iar pinul LED la 3.3V.

Pentru ceilalti 5 pini, exista mai multe optiuni de conectare ce trebuie apoi specificate cand este creat obiectul LCDWIKI_SPI in cod. Eu am ales conectarea (ST7735S, 10, 9, 8, _):

  • SCK → pinul 13;
  • SDA → pinul 11;
  • CS → pinul 10;
  • A0 → pinul 9;
  • RESET → pinul 8.

Software Design

Mediul de dezvoltare

Arduino IDE

Biblioteci folosite

  • LCDWIKI_GUI: folosit pentru afisarea pe ecran LCD.
  • LCDWIKI_SPI: o subclasa a LCDWIKI_GUI, speciliaza in comunicarea SPI cu un ecran LCD.
  • SoftwareSerial: util in debugging, permite comunicare seriala pe alti pini (in afara de 0 si 1).

Stari program

Programul se afla mereu in una din urmatoarele stari: setup, READY, START, PLAY, GAMEOVER. Secventa de stari e circulara si programul poate sa treaca dintr-o stare in urmatoarea ca urmare a unui eveniment.

O descriere pe scurt a fiecarei stari:

  • setup:
    • setup LCD:
      • initializare ecran;
      • umplere ecran cu culoarea de background;
      • afisare mesaj de inceput.
    • setup snake:
      • setare limite zona de joc (zona in care personajul se plimba);
      • initializare personaj ca o lista de blocuri patratice a cate 4 pixeli latime; primul bloc din care este compus se afla in mijlocul ecranului;
      • initializare pozitia initiala mancare.
    • initializare interfata seriala pentru comunicare prin Bluetooth;
    • initializare scor;
    • trecerea in starea READY.
  • READY:
    • programul este gata sa inceapa si asteapta ca utilizatorul sa ii trimita input (directia initiala de mers a personajului);
    • in aceasta perioada, pe ecran apare un mesaj de inceput: “To start game: Connect to Bluetooth. Next, press any button to begin. Good luck! :)”.
  • START:
    • utilizatorul este conectat si a trimis un prim caracter de input (directia initiala);
    • in aceasta etapa, se pregateste ecranul pentru modul de joc: in stanga sus va fi afisat scorul, sub acesta va fi o linie orizontala ce delimiteaza zona de joc (zona in care se plimba personajul), iar in zona de joc va aparea sub forma unui sir de blocuri a cate 4 pixeli latime sarpele si sub forma unui singur bloc patratic mancarea.
    • se trece instant in starea urmatoare (starea START este doar de setup);
  • PLAY:
    • este desenat personajul si mancarea;
    • se verifica primire de input (o noua directie);
    • personajul este mutat cu un pas; se verifica de asemenea daca avem coliziune cap sarpe-corp sarpe (caz in care am trece in GAMEOVER) sau coliziuni sarpe-mancare (caz in care actualizam scorul si gasim noi coordonate pentru mancare).
  • GAMEOVER:
    • pe ecran apare un mesaj: “Gameover! Press any button to restart.”
    • se asteapta input (directia initiala pentru noul joc); la primire se trece in READY.

Detalii implementare

Implementare personaj

Sarpele este implementat folosind o lista simplu inlantuita (vezi fisierele list.c/.h). Inceputul listei corespunde coordonatelor capului personajului, iar finalul corespunde coordonatelor cozii.

Pentru a face un pas, lista este parcursa si fiecare element preia coordonatele vechi ale elementelului anterior (adica blocul i din corp se va afla pe pozitia pe care anterior se afla blocul i-1), iar primul bloc (capul personajului) preia valoarea dictata de directia de mers (ex.: (x,y)→(x+1,y) daca directia este DIR_D). In timp ce lista este parcursa, se verifica si coloziunile dintre corp si cap (caz in care starea devine GAMEOVER).

Afisare

Pentru afisarea pe ecran sunt folosita functiile din bibliotecile LCDWIKI_GUI si LCDWIKI_SPI:

  • Fill_Screen: umple ecranul in culoarea data;
  • Print_String: printare mesaje (mesaj inceput, mesaj sfarsit joc, scor);
  • Draw_Fast_HLine: desenare linie orizontala care sa delimiteze suprafata de joc;
  • Fill_Rect: umplere bloc intr-o culoare data (folosit pentru desenul sarpelui si a mancarii).

Pentru a nu exista un delay din cauza scrierii pe ecran, la fiecare loop prin starea PLAY este desenat doar blocul nou aparut pentru sarpe si este desenat peste blocul din sarpe ce a disparut cu culoarea fundalului.

Rezultate obtinute

In final, am obtinut un joc simpatic, functional, la care se pierde greu (zona de joc e mare si dureaza pana ajungi la o lungime destul de mare incat sa poata exista coliziuni).

Prezentare:

Ecran inceput:

Ecran joc:

Gameover:

Demo

Concluzii

  • Proiectul este realizat in intregime si functioneaza conform asteptarilor.
  • Decizia de a adauga un modul Bluetooth ii ofera mai multa scalabilitate:
    • se pot adauga si alte functionalitati comandate prin Bluetooth, precum setarea culorilor (fundal, personaj, mancare, text), setarea vitezei, alte setari de personalizare a jocului.
  • Un feature nou posibil ar fi pastrarea scorurilor maxime intr-o varianta persistenta (ex. in EEPROM) si afisarea acestora la finalul jocului.

Download

Jurnal

  • 22/4: alegere tema proiect.
  • 25/4: creare pagina Wiki si completarea unei descrieri a proiectului, precum si schema bloc initiala.
  • 26/4: schimbarea ideii: controlul personajului nu se va mai realiza prin butoane, ci de pe telefon, conectat printr-un modul Bluetooth la Arduino.
  • 26/4-9/5: achizitionare componente (modul Bluetooth si ecran LCD) si testarea functionarii corecte a acestora, precum si a librariilor folosite.
  • 10/5-16/5: asamblare hardware si testare printr-un program simplu (un cub care se misca continuu, iar directia sa poate fi schimbata prin comenzile “wasd” trimise prin Bluetooth).
  • 17/5-20/5: pregatirea componentei software (ecran start, joc si stop).
  • 21/5-23/5: finalizare proiect (finalizare pagina Wiki + aranjarea componentelor hardware a.i. doar ecranul este vizibil, iar celelalte componente sunt ascunse intr-o cutie).

Bibliografie/Resurse

pm/prj2021/agrigore/snake_lcd.txt · Last modified: 2021/05/24 10:04 by roxana_elena.stiuca
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