This shows you the differences between two versions of the page.
pm:prj2024:vstoica:gheorghe.grosu [2024/05/21 23:54] gheorghe.grosu [Software Design] |
pm:prj2024:vstoica:gheorghe.grosu [2024/05/26 18:13] (current) gheorghe.grosu [Jurnal] |
||
---|---|---|---|
Line 49: | Line 49: | ||
{{:pm:prj2024:vstoica:snake_2024_schem_v4.png?600|}} | {{:pm:prj2024:vstoica:snake_2024_schem_v4.png?600|}} | ||
+ | |||
+ | {{:pm:prj2024:vstoica:img_3423.jpeg?600|}} | ||
Line 57: | Line 59: | ||
1. Mediu de dezvoltare: | 1. Mediu de dezvoltare: | ||
- **Platformă de dezvoltare**: Arduino IDE | - **Platformă de dezvoltare**: Arduino IDE | ||
- | - Arduino IDE este utilizat pentru scrierea, compilarea și încărcarea firmware-ului pe un microcontroller Arduino. | + | Arduino IDE este utilizat pentru scrierea, compilarea și încărcarea firmware-ului pe un microcontroller Arduino. |
2. Librării şi surse 3rd-party: | 2. Librării şi surse 3rd-party: | ||
Line 72: | Line 74: | ||
3. Algoritmi şi structuri implementate: | 3. Algoritmi şi structuri implementate: | ||
- **Structuri de date**: | - **Structuri de date**: | ||
- | - `Joystick`: Monitorizează direcția joystick-ului pentru controlul șarpelui. | + | |
- | - `GameState`: Gestionează stările jocului și timpul de cadru pentru fiecare stare. | + | **`Joystick`** |
- | - `Snake`: Păstrează lungimea și pozițiile șarpelui. | + | 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**: | - **Algoritmi**: | ||
- | - Algoritm pentru controlul direcției șarpelui pe baza intrărilor de la joystick. | + | - Controlul direcției șarpelui pe baza intrărilor de la joystick. |
- | - Algoritm pentru verificarea coliziunilor cu pereții, obstacolele și corpul șarpelui. | + | - Verificarea coliziunilor cu pereții, obstacolele și corpul șarpelui. |
- | - Algoritm pentru gestionarea creșterii șarpelui și actualizarea scorului. | + | - Gestionarea creșterii șarpelui și actualizarea scorului. |
- | - Algoritm pentru generarea aleatorie a pozițiilor merelor. | + | - Generarea aleatorie a pozițiilor merelor. |
- | - Algoritm pentru stocarea și citirea scorurilor maxime din EEPROM. | + | - Stocarea și citirea scorurilor maxime din EEPROM. |
Funcțiile implementate | Funcțiile implementate | ||
Line 88: | Line 111: | ||
Funcții principale: | Funcții principale: | ||
- | 1. **setup()** | + | * **setup()** |
- Inițializează comunicarea serială. | - Inițializează comunicarea serială. | ||
- Configurează pinii pentru joystick și LED-urile RGB. | - Configurează pinii pentru joystick și LED-urile RGB. | ||
Line 95: | Line 118: | ||
- Inițializează starea și timpul de cadru pentru joc. | - Inițializează starea și timpul de cadru pentru joc. | ||
- | 2. **loop()** | + | * **loop()** |
- Verifică dacă trebuie să actualizeze starea jocului pe baza timpului de cadru. | - Verifică dacă trebuie să actualizeze starea jocului pe baza timpului de cadru. | ||
- Citește direcțiile de la joystick. | - 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). | - Execută funcțiile corespunzătoare fiecărei stări (selecție nivel, inițializare nivel, rulare nivel, game over). | ||
- | #### Funcții de stare: | + | **Funcții de stare:** |
- | 1. **state_level_select()** | + | * **state_level_select()** |
- Permite utilizatorului să aleagă nivelul dorit folosind joystick-ul. | - Permite utilizatorului să aleagă nivelul dorit folosind joystick-ul. | ||
- Afișează săgeata de selecție pe ecran. | - 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. | - Trecerea la starea de inițializare a nivelului atunci când utilizatorul apasă butonul de selecție. | ||
- | 2. **state_level_init()** | + | * **state_level_init()** |
- Inițializează nivelul selectat, resetând șarpele și plasând obstacole și mere pe hartă. | - Inițializează nivelul selectat, resetând șarpele și plasând obstacole și mere pe hartă. | ||
- Trecerea la starea de rulare a nivelului. | - Trecerea la starea de rulare a nivelului. | ||
- | 3. **state_level_running()** | + | * **state_level_running()** |
- Actualizează poziția șarpelui pe baza direcțiilor de la joystick. | - Actualizează poziția șarpelui pe baza direcțiilor de la joystick. | ||
- Verifică coliziunile și gestionează creșterea șarpelui. | - Verifică coliziunile și gestionează creșterea șarpelui. | ||
Line 117: | Line 140: | ||
- Trecerea la starea de game over în caz de coliziune. | - Trecerea la starea de game over în caz de coliziune. | ||
- | 4. **state_game_over()** | + | * **state_game_over()** |
- Afișează scorul final și scorul maxim pe ecran. | - Afișează scorul final și scorul maxim pe ecran. | ||
- Salvează scorul maxim în EEPROM dacă este cazul. | - Salvează scorul maxim în EEPROM dacă este cazul. | ||
- Afișează un mesaj de finalizare a jocului. | - Afișează un mesaj de finalizare a jocului. | ||
- | Funcții utilitare: | + | **Funcții utilitare:** |
1. **level_select_init()** | 1. **level_select_init()** | ||
- | - Afișează ecranul de selecție a nivelului. | + | * Afișează ecranul de selecție a nivelului. |
2. **renderIfDifferent(int pos, int tile)** | 2. **renderIfDifferent(int pos, int tile)** | ||
- | - Redă graficul corespunzător pentru un tile dacă este diferit de cel precedent. | + | * Redă graficul corespunzător pentru un tile dacă este diferit de cel precedent. |
3. **render_grass(int pos_x, int pos_y)** | 3. **render_grass(int pos_x, int pos_y)** | ||
- | - Redă grafica pentru iarbă. | + | * Redă grafica pentru iarbă. |
4. **render_snake_head(int pos_x, int pos_y)** | 4. **render_snake_head(int pos_x, int pos_y)** | ||
- | - Redă grafica pentru capul șarpelui. | + | * Redă grafica pentru capul șarpelui. |
5. **render_snake_body(int pos_x, int pos_y)** | 5. **render_snake_body(int pos_x, int pos_y)** | ||
- | - Redă grafica pentru corpul șarpelui. | + | * Redă grafica pentru corpul șarpelui. |
6. **render_apple(int pos_x, int pos_y)** | 6. **render_apple(int pos_x, int pos_y)** | ||
- | - Redă grafica pentru un măr. | + | * Redă grafica pentru un măr. |
7. **render_red_apple(int pos_x, int pos_y)** | 7. **render_red_apple(int pos_x, int pos_y)** | ||
- | - Redă grafica pentru un măr roșu. | + | * Redă grafica pentru un măr roșu. |
8. **render_obstacle(int pos_x, int pos_y)** | 8. **render_obstacle(int pos_x, int pos_y)** | ||
- | - Redă grafica pentru un obstacol. | + | * Redă grafica pentru un obstacol. |
9. **get_random_pos()** | 9. **get_random_pos()** | ||
- | - Generează o poziție aleatorie pentru plasarea unui măr pe hartă. | + | * Generează o poziție aleatorie pentru plasarea unui măr pe hartă. |
- | + | ||
- | Structura `Joystick` se ocupă de citirea pozițiilor analogice ale joystick-ului și de calcularea direcțiilor următoare pentru deplasarea șarpelui. | + | |
- | + | ||
- | 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. | + | |
- | + | ||
- | 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. | + | |
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
- | + | {{:pm:prj2024:vstoica:snk3_gif.gif?250|}} {{:pm:prj2024:vstoica:snk2_gif.gif?250|}}{{:pm:prj2024:vstoica:snk_gif.gif?250|}} | |
- | <note tip> | + | |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
- | </note> | + | |
===== Concluzii ===== | ===== Concluzii ===== | ||
Line 168: | 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 180: | 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> | ||