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 și 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 interfeței jocului și 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 stări joc/snake și setare grafică a interfeței / RAM-ului jocului
byte block[3] = {B01110, B11111, B01110,} → corp snake
byte apple[3] = {B00100, B01110, B00100,} → corp apple
volatile bool Interrupt → verifică dacă a avut loc o întrerupere
bool pressed → verifică dacă un buton a fost apăsat
const int max_dimension = GRAPHIC_HEIGHT*GRAPHIC_WIDTH → dimensiunea maximă posibilă
size_t snakeLength = 0 → inițializare variabilă care o să salveze dimensiunea snake-ului
String Name1thPlace,Name2thPlace,Name3thPlace,Name4thPlace → salvăm în ordine numele care au obținut 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'} → salvăm literele pentru setarea numelui în caz de highscore
char setName[3] → o variabilă temporară în care salvam valorile anterioare ale numelor
struct Pos {uint8_t x=0, y=0;};
struct Pos applePos;
struct Pos snakePosHistory[max_dimension] → poziții initiale snake/apple
unsigned long lastGameUpdateTick = 0 → salvează 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
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