Snake Game

Introducere

Cred ca toata lumea este pasionata de gaming si din cand in cand mai simtim nevoia sa ne distram in fata monitoarelor, asa ca am ales sa implementez un joc ce ne aduce aminte de copilaria noastra cand ne jucam pe micile ecrane verzi de la telefoanele Nokia, si anume SNAKE. As dori sa implementez jocul folosind un controller, ecran LCD si buzzer. De asemenea, doresc sa adaug jocului si functionalitati precum multiplayer, fiind insotite de diferite sunete distincte.

Descriere generală

Proiectelul simuleaza jocul SNAKE.io, disponibil online. Cei doi jucatori pot controla serpii de culoare verde respectiv roz prin intermediul celor doua stickere analogice. Pentru fiecare serpisor exista un buzzer asignat care va scoate sunete de fiecare data cand serpii vor lua contact cu hrana disponibila random pe harta jocului. Scorul pentru fiecare jucator poate fi vizibil in partea de sus a ecranului, in stanga respectiv dreapta. Scopul jocului este ca jucatorii sa-l forteze pe adversar sa ii ciocneasca. Sarpele care ciocneste celalat sarpe, pierde, iar la finalul jocului pe ecran va fi afisat un mesaj informativ ce anunta castigatorul jocului. Daca cei doi serpi se ciocnesc frontal, atunci jocul se termina la egalitate.

Schema bloc

Design Hardware

Pentru realizarea proiectului am folosit urmatoarele componente:

  • 2.8' TFT_LCD 240 x 320 RBG TOUCH
  • 5 rezistente de 1kOhm
  • cabluri tata-tata
  • cabluri mama-tata
  • 2 analog sticks
  • 2 buzzere
  • o placuta Arduino UNO

Schema electrica

Schema PCB

Design Software

Programul incepe prin generarea celor 2 serpisor. Dimensiunea serpilor este masurata in pixeli. La inceput fiecare sarpe are dimensiunea de 11 pixeli, urmand ca aceasta sa se mareasca de fiecare data cand serpii “mananca” ceva. Pentru implementarea software am folosit bibliotecile:

  • SPI.h
  • Ucglib.h (folosita pentru LCD)
  • Arduino.h

Pentru implementarea miscarii serpilor si maririi acestora am definit o structura de tip list, respectiv coada pentru miscarea lor. Fiecare miscare noua, schimbare de directie este introdusa in coada. Celulele au obligatia ca la fiecare schimbare de pozitie, sa verifice daca cumva trebuie sa modifice directia de miscare, parcurgand coada. Avand in vedere ca miscarea celulelor se face in ordine, de la cap spre coada sarpelui, fiecare element din coada va retine ultima celula care a efectuat mutarea. Pentru partea de rewards, de asemenea am implementat o lista. Sunt maxim de 10 reward-uri ce se pot genera odata la 3 secunde. In momentul in care s-au obtinut 10 reward-uri pe tabla de joc, generarea se opreste pana cand cel putin un reward este capturat de unul din serpi. Jocul se incheie cand are loc o coliziune dintre doi serpi, pierzator fiind sarpele ce ciocneste cu capul celalat sarpe. In caz ca cei doi se ciocnesc cap in cap, rezulta egalitate. Implementarea este non-blocanta, iar miscarea serpilor se face treptat, in functie de timpul petrecut in joc.

Cod sursa pentru implementare + schema realizata in Fritzing

Jurnal

  • 3/05/2022 - Prima comanda pentru piese(LCD, Placuta Arduino, Breadboard, fire, rezistente, led-uri)
  • 10/05/2022 - A doua comanda pentru piese(tranzistor de nivel logic, un nou LCD, 2 analog sticks)
  • 15/05/2022 - Incepere implementare hardware
  • 20/05/2022 - Incepere implementare software
  • 23/05/2022 - Finalizare implementare hardware
  • 24/05/2022 - Finalizare implementare software
  • 27/05/2022 - Finalizare pagina proiect

Lucratul la acest proiect a fost o adevarata provocare. Nu am crezut ca este atat de dificil sa te sincronizezi atat pe partea de hardware cat si pe partea de software. Cred totusi ca am reusit sa trec peste impedimente cu brio, pregatindu-ma pentru orice. Cel mai provocator mi s-a parut de implementat LCD-ul. A fost cu adevarat o tortura si o adevarata aventura. Initial am comandat piesa si am crezut ca tot ce trebuie sa fac este sa conectez pinii, sa folosesc biblioteca si cam atat. Insa s-a dovedit a fi cu totul si cu totul altceva. La 2 zile dupa ce am primit piesa, am observat pe site ca am nevoie de fapt de un tranzistor de nivel logic. Am luat 2, sa fie, si mare mi-a fost mirarea cand a ajuns, ca merge, dar nu prea. LCD-ul cam scartaia, mergea bine cateodata si cateodata primeam mare WHITE SCREEN. Totul a pus capac in seara de 23 mai cand am primit WHITE SCREEN si a ramas asa, forever si atunci am vrut cu adevarat sa renunt la LCD si sa folosesc o matrice de LED-uri 8 x 8. Dar intr-un final dupa lungi cautari si debugging, am reusit sa-l implementez folosind rezistente(thumbs up catre Hoisan Stefan-Alexandru, de la 333CA, de la care m-am inspirat pentru implementarea LCD-ului din proiectul lui din 2021). Partea de software a fost destul de lejera, nu mi-a pus deloc probleme si a mers totul ca la carte.

Concluzii

Proiectul a fost o adevarata provocare. Acum 1 luna aveam ceva in cap si pot spune ca dupa lungi sesiuni de munca am obtinut ceea ce mi-am dorit. Jocul arata si se comporta exact cum imi doream, si ma bucur ca am reusit sa aduc si un plus de competitivitate, avand in vedere ca sunt necesari doi jucatori. Ma bucur ca am lucrat cu Arduino, desi o mai facusem si eram familiar cu el, dar realizarea hardware in mod fizic a proiectului a fost ceva nou si a reprezentat o experienta pe care mi-ar placea sa o mai repet.

Demo

Bibliografie/Resurse

pm/prj2022/arosca/020600.txt · Last modified: 2022/05/27 03:51 by cosmin_viorel.lovin
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