Autor: Grosu Gheorghe
Grupa: 334CD
Scorul poate fi vizualizat fie în timpul jocului, fie la final, oferind astfel jucătorului un feedback asupra performanței sale. Proiectul include și un buzzer care emite diferite sunete în timpul jocului.
Am fost un mare fan al acestui joc pe telefoanele vechi (Nokia :)) si mi s-a parut interesant cum as putea implementez eu acest lucru pe un microcontroler.
Utilitatea proiectului vine in primul rand din faptul ca ma va ajuta sa inteleg tot procesul de planificare, arhitectura si legare a partii de software cu cea de hardware.
Proiectul este un joc implementat pe un dispozitiv care folosește un display pentru afișarea jocului, un buzzer pentru redarea sunetelor și un joystick pentru controlul personajului. Scopul jocului este să eviți coliziunile și să obții cât mai multe puncte. Atunci când se produce o coliziune, scorul este afișat. Jucătorul poate ajusta nivelul de dificultate, inițial setat pe modul “Easy”(nivelul 1), folosind un buton(posibil tot cel din joystick). La apăsarea butonului, viteza de deplasare a personajului crește, harta se schimbă și culoarea LED-ului se modifică pentru a indica nivelul de dificultate actual sau pentru diferite efecte din timpul jocului.
Exemplu de schemă bloc: http://www.robs-projects.com/mp3proj/newplayer.html
Lista de piese:
Schema hardware
Schema electrica
Descrierea codului aplicaţiei (firmware)
1. Mediu de dezvoltare: - Platformă de dezvoltare: Arduino IDE
Arduino IDE este utilizat pentru scrierea, compilarea și încărcarea firmware-ului pe un microcontroller Arduino.
2. Librării şi surse 3rd-party:
- Această librărie este folosită pentru a controla ecranul TFT.
- SPI (Serial Peripheral Interface) este utilizat pentru comunicația cu ecranul TFT.
- Această librărie permite stocarea persistentă a datelor, cum ar fi scorurile maxime.
- Functia `tone()` este utilizată pentru a genera sunete pe pinul difuzorului.
3. Algoritmi şi structuri implementate: - Structuri de date:
`Joystick` Structura `Joystick` se ocupă de citirea pozițiilor analogice ale joystick-ului și de calcularea direcțiilor următoare pentru deplasarea șarpelui.
`GameState`
Structura `GameState` gestionează stările jocului și timpul de cadru pentru fiecare stare, facilitând tranzițiile între stări și verificarea momentului potrivit pentru actualizarea jocului.
`Snake`
Structura `Snake` gestionează pozițiile șarpelui, lungimea sa și funcțiile pentru resetare, mișcare și creștere. De asemenea, verifică dacă șarpele a colizionat cu el însuși.
Șarpele este reprezentat prin structura `Snake`, care conține: * `length`: lungimea șarpelui. * `positions`: array de tip `byte` ce stochează pozițiile fiecărui segment al șarpelui.
Motive pentru această reprezentare:
1. Eficiență Memorie: Folosirea `byte` ocupă doar 1 octet, economisind memorie RAM limitată pe Arduino.
2. Simplitate și Performanță: Acces rapid și simplu la pozițiile șarpelui pentru operațiuni de mișcare și creștere.
3. Gestionare Ușoară a Lungimii: Lungimea și pozițiile sunt ușor de manipulat pentru actualizări rapide în timpul jocului.
- Algoritmi:
Funcțiile implementate
Funcții principale:
* loop()
Funcții de stare:
* state_level_select()
* state_level_init()
* state_level_running()
* state_game_over()
Funcții utilitare:
1. level_select_init()
2. renderIfDifferent(int pos, int tile)
3. render_grass(int pos_x, int pos_y)
4. render_snake_head(int pos_x, int pos_y)
5. render_snake_body(int pos_x, int pos_y)
6. render_apple(int pos_x, int pos_y)
7. render_red_apple(int pos_x, int pos_y)
8. render_obstacle(int pos_x, int pos_y)
9. get_random_pos()
https://randomnerdtutorials.com/guide-to-1-8-tft-display-with-arduino/