Ioana VOICA (78340) - Ssssnake

Autorul poate fi contactat la adresa: Login pentru adresa

Introducere

“A fost odata ca niciodata…” o vreme cand telefoanele mobile erau folosite pentru a primi si efectua apeluri si cam atat. Straniu scenariu, acum - cand vietile noastre se invart mai mult sau mai putin in jurul smartphone-ului care tine loc de telefon, agenda, aparat de fotografiat, are jocuri, internet etc etc etc.

Dar cine nu isi aminteste de batranul Nokia 1100 si unicul sau joc, Snake? Am ales acest proiect dupa ce am rasfoit paginile de proiecte din 2017, 16, 15… sfarsind prin a alege ideea de la care plecasem: conceptul jocului Snake clasic, dar implementat pe un ecran LCD cu diferite nivele de dificultate (incluzand viteze diferite, diferite harti cu obstacole, feedback sonor la anumite evenimente, alerte transmise pe LED-uri).

Scopul principal al jocului este de a trezi aceeasi nostalgie (in sensul bun al cuvantului) in colegii mei care probabil ma vor suporta plangandu-ma de-a lungul intregului proces si, desigur, de a aprofunda cunostintele acumulate la laboratoarele de PM.

Descriere generală

Hardware Design

Lista de componente hardware:

  • kit-ul de componente de baza;
  • 5 butoane (4 directii + OK);
  • LCD;
  • LED;
  • difuzor;
  • translator bidirectional 3.3V - 5V;
  • sursa de tensiune 3.3V;
  • fire mama-mama;
  • cablu pentru alimentare.

Schema electrica

Software Design

Am ales ca mediu de dezvoltare Programmers Notepad [WinAVR]. Am pornit implementarea software de la exemple mici, bucati de cod din laborator pentru testarea componentelor si exemple de folosire a ecranului LCD.

Jocul are 3 nivele de dificultate, dintre care utilizatorul isi poate alege la inceput. Cele 3 nivele difera prin faptul ca hartile contin din ce in ce mai multe obstacole.

Algoritmul jocului este unul simplu:

  • la coliziunea sarpelui cu un perete sau cu el insusi, jocul se termina;
  • in cazul in care nu exista nicio coliziune, se verifica daca se modifia directia (caz in care se schimba coordonatele de inceput ale sarpelui) si se deplaseaza cu o unitate;
  • la coliziunea cu “mancarea”, creste lungimea sarpelui si se adauga o unitate in structura lui.

In plus, am introdus pe harta un tip de item special - otrava, care odata administrata scade scorul total. Acesta isi schimba pozitia la un interval de timp dat.

Generarea mancarii si a otravii se face la coordonate random, verificand totusi ca aceste coordonate sa nu se suprapuna zidurilor.

Am retinut sarpele in doi vectori de coordonate (x, y), pe care ii parcurg numai in primele <lungimea sarpelui> pozitii. Harta nivelului este retinuta intr-o matrice de aparitii in care marchez zonele cu obstacole.

Am implementat urmatoarele functii (apelate in aceasta ordine pentru fiecare sesiune de joc):

  • init_menu() → meniul de alegere a nivelului;
  • init_frame() → generarea hartii in functie de nivelul ales;
  • food();
  • snake() → initializeaza sarpele, verifica schimbarea directiei, apeleaza move() si verifica conditiile de terminare a jocului;
  • move() → verifica o posibila schimbare de directie, coliziunea cu mancare sau otrava si deplaseaza cu un pas sarpele;
  • end() → ecranul de tip “game over” → prin apasarea oricarui buton se revine in meniul initial;
  • reset() → reseteaza parametrii globali.

Interactiunea cu componentele hardware

Evenimentele jocului sunt notificate prin LED-ul de pe PCB si difuzor:

  • la coliziunea cu un item mancare, difuzorul va reproduce doua sunete scurte (si mai vesele);
  • la coliziunea cu otrava, difuzorul va reproduce un singur sunet - mai lung.

Ambele evenimente vor fi insotite si de aprinderea LED-ului.

In ceea ce priveste afisajul LCD, jocul este foarte colorat, aceasta posibilitate fiind si motivul pentru care am ales un LCD grafic, intrucat jocul snake clasic era destul de tristut si anost pe un ecran de tip Nokia.

Rezultate Obţinute

Concluzii

Pot spune fara sa exagerez ca am urat cu pasiune acest proiect si m-a ingrozit timp de multe saptamani ideea realizarii lui. Cu toate acestea, odata ce am inceput lucrul propriu-zis la el, luat pe bucati, cu pasi mici, am realizat ca nu este nimic atat de SF precum credeam: de la lipirea placii de baza, la conectarea altor componente hardware si pana la manipularea acestora din soft - toate au fost realizabile.

Tragand linie mi s-a parut un proiect super interesant si simpatic, mai ales ca am avut ocazia sa plec de la un concept simplu pe care am putut sa il complic si sa il personalizez cum am vrut, ajungand sa imi depasesc asteptarile de la inceputul semestrului.

Download

Jurnal

  • 23 mai: am facut o poza cu placuta pe care o voi pastra in portofel pentru posteritate.
  • 23 mai: am scris documentatia si am filmat un mic demo
  • 22 mai: am implementat nivelele MEDIUM si HARD, obstacolele de tip otrava si am modificat formatul afisajului (pentru a tine si scorul in permanenta pe ecran)
  • 21 mai: am reflashuit bootloader-ul pe placa si am continuat cu implementarea miscarii sarpelui, a generarii si consumarii mancarii
  • 21 mai: in mijlocul testarii meniului de inceput, HIDBootFlash decide sa nu imi mai recunoasca placuta
  • 21 mai: am inceput implementarea logicii de joc
  • 20 mai: am reusit sa instalez Programmers Notepad si HIDBootFlash
  • 20 mai: am reconectat si retestat difuzorul si am inceput sa testez diverse functii din biblioteca display-ului
  • 19 mai: am lipit si testat cele 5 butoane, proces in timpul caruia mi s-au rupt firele cu care era legat difuzorul
  • 18 mai: am conectat la laborator ecranul LCD si difuzorul la pinii placii de baza
  • 16 mai: am trecut placa la 3,3V
  • 4 mai: schema electrica in Eagle
  • 3 mai: am terminat de lipit placa de baza SI MERGE!!
  • 19 aprilie: crearea paginii de wiki cu descrierea proiectului
  • 12 aprilie: alegerea proiectului

Bibliografie/Resurse

pm/prj2018/rbarbascu/ioanavoica.txt · Last modified: 2021/04/14 17:07 (external edit)
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