Table of Contents

Snake - The Game

Introducere

Proiectul are ca scop și constă în implementarea renumitului joc Snake, pe care cu toții îl știm.
Jucătorul, cu ajutorul unui joystick, impune direcția pe care șarpele trebuie s-o urmeze pentru a ajunge la mâncare. Regulile sunt simple: cu cât colectează mai multă mâncare, cu atât dimensiunea șarpelui crește.
Jocul se termină în momentul în care șarpele își mușcă propria coadă.

Descriere generală

Schema bloc

Hardware Design

Componente necesare:

Module folosite:


VRx conectat la A2
VRy conectat la A3
GND conectat la GND
VCC conectat la 5V
SW neconectat


Are pinii conectați la modulul de control MAX7219.


CLK conectat la D8
CS conectat la D9
DIN conectat la D10



Pe lângă acestea, mai avem conectat Buzzer-ul la D11.


Schema electrică

Software Design

Codul a fost scris în Arduino IDE. Pentru dezvoltarea proiectului, m-am folosit de biblioteca LedControl.h, care are funcții implementate pentru aprinderea/stingerea ledurilor de pe matrice, setarea intensității și multe altele. Matricea vine la pachet cu un modul de control ( MAX7219) pentru a nu fi necesar a lega toți cei 16 pini ai matricei la plăcuța arduino.

Inițial, sunt definiți pinii (cei de la secțiunea de Hardware) și structurile. Am folosit structurile Point și Coordinate pentru a ține date despre un punct de pe matrice și o coordonată.

struct Point {
  int row = 0;
  int col = 0;
  
  Point(int row = 0, int col = 0): row(row), col(col) {}
};
struct Coordinate {
  int x = 0;
  int y = 0;
  
  Coordinate(int x = 0, int y = 0): x(x), y(y) {}
};


În etapa de setup, se inițializează matricea și coordonatele capului șarpelui (în mod random) și se afișează mesajul „SNAKE - THE GAME” pe matricea LED.
În etapa loop, se generează mâncarea în mod random, se citesc datele primite de la joystick, se calculează pozițiile șarpelui și se verifică dacă, între timp, s-a ajuns în starea Game Over.
În cazul în care se ajunge în starea Game Over (din pricina faptului că șarpele și-a mușcat propria coadă, se afișează pe matrice mesajul „GAME OVER” și se reinițializează jocul: mâncarea este pusă într-un loc random și capul șarpelui la fel. Inițial, șarpele are lungime 3 (trei leduri luminoase).


Funcții:

// generează mâncarea random
void generateFood();

// citește datele trimise de joystick și setează direcția
void scanJoystick();

// calculează mișcările șarpelui, verifică dacă acesta a ajuns pe poziția mâncării
// și transmite un ton prin buzzer în caz afirmativ
void calculateSnake();

// dacă șarpele iese din ecran, acesta apare în cealaltă parte
void fixEdge();

// verifică dacă jocul a ajuns în starea „Game Over”
void checkIfOver();

// reinițializează matricea și jocul
void reinit();

// clipește ecranul de 7 ori și se sting ledurile care indicau poziția șarpelui
void clearSnake();

// funcție folosită pentru afișarea mișcărilor pe serială
void debugInSerial();

// afișează mesajul „SNAKE - THE GAME” pe matrice
void showStartMessage();

// afișează mesajul „GAME OVER” pe matrice
void showGameOverMessage();

Rezultate Obținute

Fotografii






Video

Snake - The Game (Demo)

Concluzii

Dezvoltarea proiectului a fost o experiență plăcută pentru mine, am învățat mai multe despre Arduino, matrice LED, joystick și buzzer. Cu siguranță pot fi adăugate mai multe funcționalități, poate chiar mai multe matrici led pentru a face terenul mai mare.
Per total, consider că mi-a ieșit bine și sunt mulțumit de output.

Download

snake_the_game_implementation.zip

Jurnal

25/04/2021 → confirmarea proiectului; realizarea paginii wiki, a introducerii și a schemei bloc

29/05/2021 → realizare software design

29/05/2021 → realizare hardware design

30/05/2021 → actualizare proiect (hardware + software)

30/05/2021 → finalizare implementări hardware și software

31/05/2021 → actualizare pagină wiki

01/06/2021 → finalizare pagină wiki

Bibliografie/Resurse