Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2024:vstoica:gheorghe.grosu [2024/05/13 21:53]
gheorghe.grosu [Hardware Design]
pm:prj2024:vstoica:gheorghe.grosu [2024/05/26 18:13] (current)
gheorghe.grosu [Jurnal]
Line 43: Line 43:
 **Schema hardware** **Schema hardware**
  
-{{:​pm:​prj2024:​vstoica:​snake_2024_bb_v2.png?600|}}+{{:​pm:​prj2024:​vstoica:​snake_2024_bb_v4.png?600|}}
  
  
 **Schema electrica** **Schema electrica**
  
-{{:​pm:​prj2024:​vstoica:​snake_2024_schem_v2.png?600|}}+{{:​pm:​prj2024:​vstoica:​snake_2024_schem_v4.png?600|}} 
 + 
 +{{:​pm:​prj2024:​vstoica:​img_3423.jpeg?600|}}
  
  
 ===== Software Design ===== ===== Software Design =====
  
 +**Descrierea codului aplicaţiei (firmware)**
  
-<note tip> +1. Mediu de dezvoltare
-Descrierea codului aplicaţiei (firmware)+**Platformă ​de dezvoltare**: Arduino IDE 
-  mediu de dezvoltare ​(if any) (e.g. AVR StudioCodeVisionAVR) +    Arduino IDE este utilizat pentru scriereacompilarea și încărcarea firmware-ului pe un microcontroller Arduino.
-  * 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 +
-</​note>​+
  
-===== Rezultate Obţinute =====+2. Librării şi surse 3rd-party:
  
-<​note ​tip> +  * **TFT Library**: `Adafruit_ST7735` 
-Care au fost rezultatele obţinute ​în urma realizării proiectului vostru+ - Această librărie este folosită pentru a controla ecranul TFT. 
-</​note>​+  * **SPI Library**: `SPI` 
 + - SPI (Serial Peripheral Interface) este utilizat pentru comunicația cu ecranul TFT. 
 +  * **EEPROM Library**: `EEPROM` 
 + - Această librărie permite stocarea persistentă a datelor, cum ar fi scorurile maxime. 
 +  * **Tone Library**: `tone()` 
 + - 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**:​ 
 +   - Controlul direcției șarpelui pe baza intrărilor de la joystick
 +   - Verificarea coliziunilor cu pereții, obstacolele și corpul șarpelui. 
 +   - Gestionarea creșterii șarpelui și actualizarea scorului. 
 +   - Generarea aleatorie a pozițiilor merelor. 
 +   - Stocarea și citirea scorurilor maxime din EEPROM. 
 + 
 +Funcțiile implementate 
 + 
 +Funcții principale:​ 
 + 
 +  *  **setup()** 
 +   - Inițializează comunicarea serială. 
 +   - Configurează pinii pentru joystick și LED-urile RGB. 
 +   - Inițializează ecranul TFT. 
 +   - Afișează ecranul de selecție a nivelului. 
 +   - Inițializează starea și timpul de cadru pentru joc. 
 + 
 +* **loop()** 
 +   - Verifică dacă trebuie să actualizeze starea jocului pe baza timpului de cadru. 
 +   - Citește direcțiile de la joystick. 
 +   - Execută funcțiile corespunzătoare fiecărei stări (selecție nivel, inițializare nivel, rulare nivel, game over). 
 + 
 +**Funcții de stare:** 
 + 
 +* **state_level_select()** 
 +   - Permite utilizatorului să aleagă nivelul dorit folosind joystick-ul. 
 +   - Afișează săgeata de selecție pe ecran. 
 +   - Trecerea la starea de inițializare a nivelului atunci când utilizatorul apasă butonul de selecție. 
 + 
 +* **state_level_init()** 
 +   - Inițializează nivelul selectat, resetând șarpele și plasând obstacole și mere pe hartă. 
 +   - Trecerea la starea de rulare a nivelului. 
 + 
 +* **state_level_running()** 
 +   - Actualizează poziția șarpelui pe baza direcțiilor de la joystick. 
 +   - Verifică coliziunile și gestionează creșterea șarpelui. 
 +   - Actualizează scorul și generează sunete atunci când șarpele mănâncă un măr. 
 +   - Trecerea la starea de game over în caz de coliziune. 
 + 
 +* **state_game_over()** 
 +   - Afișează scorul final și scorul maxim pe ecran. 
 +   - Salvează scorul maxim în EEPROM dacă este cazul. 
 +   - Afișează un mesaj de finalizare a jocului. 
 + 
 +**Funcții utilitare:​** 
 + 
 +1. **level_select_init()** 
 +   * Afișează ecranul de selecție a nivelului. 
 + 
 +2. **renderIfDifferent(int pos, int tile)** 
 +   * Redă graficul corespunzător pentru un tile dacă este diferit de cel precedent. 
 + 
 +3. **render_grass(int pos_x, int pos_y)** 
 +   * Redă grafica pentru iarbă. 
 + 
 +4. **render_snake_head(int pos_x, int pos_y)** 
 +   * Redă grafica pentru capul șarpelui. 
 + 
 +5. **render_snake_body(int pos_x, int pos_y)** 
 +   * Redă grafica pentru corpul șarpelui. 
 + 
 +6. **render_apple(int pos_x, int pos_y)** 
 +   * Redă grafica pentru un măr. 
 + 
 +7. **render_red_apple(int pos_x, int pos_y)** 
 +   * Redă grafica pentru un măr roșu. 
 + 
 +8. **render_obstacle(int pos_x, int pos_y)** 
 +   * Redă grafica pentru un obstacol. 
 + 
 +9. **get_random_pos()** 
 +   * Generează o poziție aleatorie pentru plasarea unui măr pe hartă. 
 + 
 +===== Rezultate Obţinute ===== 
 +{{:​pm:​prj2024:​vstoica:​snk3_gif.gif?​250|}} {{:​pm:​prj2024:​vstoica:​snk2_gif.gif?​250|}}{{:​pm:​prj2024:​vstoica:​snk_gif.gif?​250|}}
  
 ===== Concluzii ===== ===== Concluzii =====
Line 73: Line 182:
  
 <note warning> <note warning>
-O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului:​ surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). 
  
-Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:​pm:​prj20??:​c?​** sau **:​pm:​prj20??:​c?:​nume_student** (dacă este cazul). **Exemplu:​** Dumitru Alin, 331CC -> **:pm:prj2009:cc:dumitru_alin**.+ 
 +{{:pm:prj2024:vstoica:snake.zip|}} 
 </​note>​ </​note>​
  
Line 85: Line 195:
   * 02/05/2024 - Crearea paginii proiectului si completarea partiala a acesteia   * 02/05/2024 - Crearea paginii proiectului si completarea partiala a acesteia
   * 12/05/2024 - Adaugarea schemei electrice si a schemei hardware   * 12/05/2024 - Adaugarea schemei electrice si a schemei hardware
 +  * 22/05/2024 - Adaugarea software designului
 +  * 24/05/2024 - Finisare proiect
 </​note>​ </​note>​
  
pm/prj2024/vstoica/gheorghe.grosu.1715626417.txt.gz · Last modified: 2024/05/13 21:53 by gheorghe.grosu
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