This is an old revision of the document!
Nistor Andreea Iuliana 333CB
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.
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.
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.
Definire pini și macro-uri:
Variabile globale:
void debounce_deactivate(unsigned long* debounceStart) → functii care stabilesc si verifica ca valoarea logica
a unui buton este cea corespunzatoare (atat dupa apasarea lui, cat si daca ar aprea efecte mecanice/zgomot). -void graphic_flush() void graphic_generate_characters() void graphic_clear() void graphic_add_item(uint8_t x, uint8_t y, enum DisplayItem item) -> functii care genereaza RAM-ul jocului si prin care jocul, chiar daca e pe un lcd 16x2 este jucat pe 4 linii. De asemenea, sunt definite si generate modelele snake-ului si ale mar-ului
void setLedColor(int redValue, int greenValue, int blueValue) → functile date la laborator pentru
a seta culoarea rgb-ului mai usor.
un mar unde se afla snake-ul
void game_calculate_logic() -> calculeaza miscarea si directia snake-ului, verifica daca s-a produs o coloziune (perete / self) si mareste rata de refresh a jocului daca snake-ul a mancat un mar (pana la un maxim al scorului de 20) -void game_calculate_display() -> schimba Game State-ul curent a jocului daca s-a intamplat un eveniment (de exemplu: jucatorul a pierdut sau a castigat) void Game_INIT() -> starea initiala a jocului (cea initializata in setup) void Game_LOSE() -> starea atunci cand jucatorul pierde void Game_MAIN() -> starea in care este prezentat ecranul de inceput void Game_WIN() -> starea atunci cand jucatorul castiga void Game_PLAY() -> stare care genereaza snake-ul si marul la inceputul void Game_CHECKHIGHSCORES() -> verifica daca jucatorul curent a obtinut un scor mai mare decat cei salvati in memorie EEPROM void Game_HIGHSCORES() -> afiseaza cei mai buni 4 jucatori cu cele mai mari score-uri si schimba in memorie top-ul in caz ca alt jucator a obtinut un highscore mai bun -void Test_SnakeLength() -> functie care pune in 0 in fata scorului in caz ca acesta este mai mic decat 9 (pur estetic) void rgb_color() -> seteaza culoarea Led-ului RGB in functie de cat de mare e scor-ul (verde -> albastru -> turcoaz -> roz -> portocaliu) -void writeStringToEEPROM(int addrOffset, const String &strToWrite) -> permite scrierea in memoriea EEPROM -String readStringFromEEPROM(int addrOffset) -> permite citirea din memoriea EEPROM
setup()
loop()
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.
https://www.arduino.cc/en/Tutorial/BuiltInExamples/Debounce
https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt