This shows you the differences between two versions of the page.
pm:prj2023:alexau:ponggame [2023/05/21 21:30] cerasela.enus [Hardware Design] |
pm:prj2023:alexau:ponggame [2023/05/28 22:19] (current) cerasela.enus [Software Design] |
||
---|---|---|---|
Line 12: | Line 12: | ||
===== Descriere generală ===== | ===== Descriere generală ===== | ||
- | {{:pm:prj2023:alexau:schema.png?nolink&300 |}} | + | {{ :pm:prj2023:alexau:schema_pg_ec.png?nolink&300 |}} |
===== Hardware Design ===== | ===== Hardware Design ===== | ||
Line 20: | Line 20: | ||
* Placă Arduino Uno | * Placă Arduino Uno | ||
* Ecran color OLED | * Ecran color OLED | ||
+ | * Buzzer | ||
* Butoane | * Butoane | ||
* Breadboard | * Breadboard | ||
* Fire de conexiune | * Fire de conexiune | ||
</note> | </note> | ||
- | {{:pm:prj2023:alexau:thinkercad.png?nolink |}} | + | {{ :pm:prj2023:alexau:thinkercad_ec.png?nolink |}} |
===== Software Design ===== | ===== Software Design ===== | ||
- | |||
<note tip> | <note tip> | ||
- | Se începe prin includerea bibliotecilor necesare pentru comunicarea cu afișajul OLED și alte componente. | ||
- | Sunt definite constante pentru butoanele de sus și de jos utilizate pentru mișcarea jucătorului. | + | {{:pm:prj2023:alexau:pong_game_ec.zip|}} |
+ | {{:pm:prj2023:alexau:video.zip|}} | ||
- | Sunt definite și inițializate variabilele pentru poziția bilei, direcția de deplasare a bilei, ratele de actualizare pentru mișcarea bilei și a paletelor, înălțimea paletei și pozițiile inițiale ale paletei CPU și jucătorului. | + | La începutul codului sunt incluse mai multe biblioteci necesare pentru controlul afișajului OLED, butoanelor și buzzer-ului. |
- | Funcția setup() este apelată o singură dată la pornirea programului și se ocupă de inițializarea afișajului OLED și a pinilor pentru butoane. De asemenea, afișează un teren de joc gol pentru o scurtă perioadă de timp. | + | Se definesc mai multe constante și variabile globale pentru a configura și a stoca starea jocului, inclusiv coordonatele bilei, direcțiile de deplasare, scorurile jucătorilor și pozițiile paletei pentru jucătorul și calculatorul controlate de cod. |
- | Funcția loop() rulează într-o buclă continuă și gestionează mișcarea bilei și a paletelor în fiecare cadru. | + | Funcțiile setup_interrupts() și setup() sunt responsabile pentru inițializarea hardware-ului și a afișajului OLED. În setup_interrupts(), se configurează intrările de întreruperi pentru butoanele de sus și jos, iar în setup() se inițializează afișajul OLED. |
- | În fiecare cadru, se verifică dacă trebuie actualizată poziția bilei. Dacă a trecut suficient timp de la ultima actualizare a bilei, se calculează noua poziție a bilei și se verifică dacă a lovit pereții verticali, pereții orizontali sau paletele CPU și jucătorului. Dacă bilea a lovit un obiect, direcția ei este inversată și noua poziție este calculată corespunzător. | + | Funcția ISR(INT0_vect) este o rutină de întrerupere pentru butonul de sus și ISR(INT1_vect) este o rutină de întrerupere pentru butonul de jos. Aceste rutine sunt declanșate atunci când se detectează o schimbare de stare a butoanelor și setează variabilele up și down în funcție de starea butoanelor. |
- | În fiecare cadru, se verifică dacă trebuie actualizată poziția paletelor. Dacă a trecut suficient timp de la ultima actualizare a paletelor, se calculează noua poziție a paletei CPU pe baza poziției actuale a bilei și se verifică starea butoanelor pentru mișcarea paletei jucătorului. Apoi, se actualizează pozițiile paletei CPU și jucătorului și se desenează paletele pe afișaj. | + | Funcția loop() conține logica principală a jocului și este executată într-un ciclu continuu. În fiecare iterație a buclei, se verifică dacă a sosit momentul de actualizare a poziției bilei sau a paletei și se efectuează acțiunile corespunzătoare. De asemenea, se verifică dacă un jucător a marcat un punct și se afișează scorul pe afișajul OLED. Jocul se oprește atunci când un jucător atinge scorul de 5. |
- | La fiecare cadru în care s-a produs o actualizare, se actualizează afișajul pentru a reflecta noile poziții ale bilei și paletelor. | + | Funcția resetGame() este responsabilă de resetarea stării jocului la începutul fiecărei runde, inclusiv resetarea poziției bilei, direcțiilor de deplasare și a pozițiilor paletei. |
+ | |||
+ | Funcția drawCourt() desenează terenul de joc pe afișajul OLED, adică un chenar alb de dimensiune 128x64 pixeli. | ||
+ | |||
+ | În general, codul implementează logica de bază a jocului Pong și utilizează afișajul OLED și butoanele pentru a permite unui jucător să controleze o paletă și să joace împotriva calculatorului. | ||
+ | |||
+ | La final se afiseaza scorul. | ||
- | Funcția drawCourt() este folosită pentru a desena terenul de joc pe afișaj la începutul programului | ||
</note> | </note> | ||
+ | |||
+ | {{:pm:prj2023:alexau:whatsapp_image_2023-05-28_at_16.39.27.jpeg?nolink&300|}}{{ :pm:prj2023:alexau:whatsapp_image_2023-05-28_at_16.39.27_2_.jpeg?nolink&300|}} | ||
+ | |||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== |