This is an old revision of the document!


Snake

Autor

Nistor Andreea Iuliana 333CB

Introducere

Proiectul constă în implementarea jocului Snake pe un LCD. Am vrut sa fie cât mai aproape de jocul original, astfel că am ales să păstrez controlul șarpelui din 4 butoane pentru stânga, dreapta, sus si jos. Scopul jocului este ca șarpele să crească cât mai mare fără să atingă marginile sau pe el, consumând hrana care apare random pe ecran.

De asemenea, atunci când player-ul pierde, i se da posibilitatea să își scrie numele pentru a-l trece intr-o listă de highscores. Un al cincelea buton este folosit pentru a schimba state-urile curente ale jocului (main page → game play → game over → check highscore & set name → highscores → main page).

Scopul proiectului este implementarea unui joc clasic lansat în 1976 pentru însușirea cunoștințelor dobândite la cursul de Proiectarea cu Microprocesoare.

Descriere generală

Modul de funcționare este simplu: jucătorul va controla din cele 4 butoane și va putea urmări pe LCD mișcările șarpelui și apariția random a hranei.

Hardware Design

Listă de piese:

  • Arduino Uno
  • breadboard
  • LCD 16×2
  • 4 butoane
  • potențiometru
  • led RGB

Schema electrică

Software Design

Descrierea codului aplicaţiei (firmware):

  • mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR)
  • librării şi surse 3rd-party (e.g. Procyon AVRlib)
  • algoritmi şi structuri pe care plănuiţi să le implementaţi
  • (etapa 3) surse şi funcţii implementate

Mediul de dezvoltare folosit este Arduino IDE, schema bloc a fost realizata in Lucidchart, iar schema electrica in EAGLE. De asemenea am folosit librăriile LiquidCrystal.h pentru LCD si EEPROM.h pentru memoria EEPROM.

Variabile si utilizare

Definire pini si macro-uri:

  • const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 10, d7 = 2 → pentru LCD LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
  • #define redPin A3, greenPin A4, bluePin A5 → pini pentru Led-ul RGB
  • #define BUTTON_GameState 3, BUTTON_UP 9, BUTTON_DOWN 8, BUTTON_RIGHT 7, BUTTON_LEFT 6 → pini pentru butoane
  • #define GRAPHIC_WIDTH 16, GRAPHIC_HEIGHT 4, DEBOUNCE_DURATION 25 →variable pentru dimensiunea interfetei jocului si a duratei de debounce

Variabile globale:

  • enum DisplayItem {GRAPHIC_ITEM_NONE, GRAPHIC_ITEM_A, GRAPHIC_ITEM_B, GRAPHIC_ITEM_NUM};
  • enum {GAME_MENU, GAME_PLAY, GAME_LOSE, GAME_WIN, GAME_SCORES,GAME_NAMESCORE} gameState;
  • enum {SNAKE_LEFT,SNAKE_UP,SNAKE_RIGHT,SNAKE_DOWN} snakeDirection; → definire stari joc/snake si setare graphica a interfetei / RAM-ului jocului ;
  • byte block[3] = {B01110, B11111, B01110,} → corp snake
  • byte apple[3] = {B00100, B01110, B00100,} → corp apple
  • volatile bool Interrupt → ajuta la verificarea daca a avut loc o intrerupere
  • bool pressed → ajuta la verificarea ca un buton a fost apasat
  • const int max_dimension = GRAPHIC_HEIGHT*GRAPHIC_WIDTH → dimensiunea maxima posibila
  • size_t snakeLength = 0 → intializare varibila care o sa salveze dimensiunea snake-ului
  • int a[4] → folosit in a salva highscore-urile in EEPROM
  • hue → folosita in a seta culoare led-ului RGB
  • String Name1thPlace,Name2thPlace,Name3thPlace,Name4thPlace →salvam in oridine numele care au obtinut highscore
  • const char chars[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'} → salvam literele pentru setarea numelui in caz de highscore
  • char setName[3] → o varibaila temporara prin care salvam valorile anterioare ale numelor
  • struct Pos {uint8_t x=0, y=0;};
  • struct Pos applePos;
  • struct Pos snakePosHistory[max_dimension] → intializare pozitii initiale snake/apple
  • unsigned long lastGameUpdateTick = 0 → o sa salveze progresiv timpul ultimului frame al jocului
  • unsigned long gameUpdateInterval = 850 → rata de refesh a jocului
  • uint8_t graphicRam[GRAPHIC_WIDTH*2/8][GRAPHIC_HEIGHT] → definire dimensiune RAM
Funcții

setup()

loop()

Rezultate Obţinute

Concluzii

Simpla idee că aș putea realiza un joc singură m-a motivat să duc până la capăt acest proiect. Consider că a fost un mod captivant prin care am aplicat cunoștințe dobândite în cadrul cursului de PM.

Download

Jurnal

  • 13.04.2022 : Alegere proiect
  • 20.04.2022 : Realizare pagină
  • 04.05.2022 : Implementare proiect
  • 18.05.2022 : Adăugare funcționalitate nouă
  • 20.05.2022 : Realizare schemă electrică EAGLE
  • 23.05.2022 : Finalizare pagină wiki

Bibliografie/Resurse

pm/prj2022/imacovei/andreea.nistor2208.1653251097.txt.gz · Last modified: 2022/05/22 23:24 by andreea.nistor2208
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