This shows you the differences between two versions of the page.
pm:prj2024:vstoica:andrei.petrea1210 [2024/05/25 22:42] andrei.petrea1210 [Software Design] |
pm:prj2024:vstoica:andrei.petrea1210 [2024/05/27 00:19] (current) andrei.petrea1210 [Bibliografie/Resurse] |
||
---|---|---|---|
Line 60: | Line 60: | ||
=== Descrierea implementarii === | === Descrierea implementarii === | ||
+ | |||
+ | == Structura unui obiect == | ||
+ | Pentru a opera mai usor cu logica jocului, mi-am creat structura //PacmanObject//, care contine 4 campuri | ||
+ | * x -> abscisa obiectului | ||
+ | * y -> ordonata obiectului | ||
+ | * draw -> flag pentru afisarea la ecran | ||
+ | * symbol -> ce afisez la ecran | ||
+ | |||
+ | <code cpp> | ||
+ | // Symbols depending on object type | ||
+ | #define PACMAN "C" | ||
+ | #define FOOD "*" | ||
+ | #define ENEMY "#" | ||
+ | |||
+ | struct PacmanObject { | ||
+ | int16_t x; | ||
+ | int16_t y; | ||
+ | bool draw; | ||
+ | String symbol; | ||
+ | }; | ||
+ | </code> | ||
== Start-up screen == | == Start-up screen == | ||
Line 128: | Line 149: | ||
move(0, 1); | move(0, 1); | ||
} | } | ||
- | } else { | + | } |
+ | // Rest of code... | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | In functia //move//, voi muta PacMan-ul la pozitia noua, si voi calcula folosind functia //checkCollision//, daca ma intersectez cu obiectul de tip //FOOD// sau cu //ENEMY//. Ma voi folosi si de functia //checkRange//, pentru a oferi toleranta la detectia coliziunii. | ||
+ | |||
+ | <code cpp> | ||
+ | bool checkCollision(PacmanObject obj1, PacmanObject obj2) { | ||
+ | return (checkRange(obj1.x, obj2.x - 2, obj2.x + 2) && checkRange(obj1.y, obj2.y - 2, obj2.y + 2) && checkRange(obj2.x, obj1.x - 2, obj1.x + 2) && checkRange(obj2.y, obj1.y - 2, obj1.y + 2)); | ||
+ | } | ||
+ | |||
+ | bool checkRange(int val, int low, int high) { | ||
+ | return (val >= low && val <= high); | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Inedit, pentru inamici, am folosit un algoritm de tip **[[https://en.wikipedia.org/wiki/Hill_climbing|Hill-Climbing]]**, care este apelat atunci cand jucatorul face o mutare, facand ca acestia sa se deplaseze catre PacMan. Fiecare inamic se va uita la starile sale vecine (//UP//, //DOWN//, //LEFT//, //RIGHT// in ordinea aceasta) si va alege prima stare mai apropiata decat pozitia sa curenta, folosind distanta Manhattan ca euristica. | ||
+ | |||
+ | <code cpp> | ||
+ | void move(int16_t dx, int16_t dy) | ||
+ | { | ||
+ | // Rest of code... | ||
+ | for (i = 0; i < NR_ENEMIES; i++) { | ||
+ | int8_t j, k; | ||
+ | int16_t currDistance = manhattanDistance(pacMan, enemies[i]); | ||
+ | PacmanObject aux; | ||
+ | for (j = -1; j <= 1; j++) { | ||
+ | bool ok = true; | ||
+ | for (k = -1; k <= 1; k++) { | ||
+ | if (abs(j) != abs(k)) { | ||
+ | aux.x = enemies[i].x + j; | ||
+ | aux.y = enemies[i].y + k; | ||
+ | int16_t distance = manhattanDistance(pacMan, aux); | ||
+ | if (distance < currDistance) { | ||
+ | enemies[i].x = aux.x; | ||
+ | enemies[i].y = aux.y; | ||
+ | ok = false; | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | if (!ok) { | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | int16_t manhattanDistance(PacmanObject obj1, PacmanObject obj2) { | ||
+ | return (abs(obj2.x - obj1.x) + abs(obj2.y - obj1.y)); | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | |||
+ | == Final screen == | ||
+ | |||
+ | La final, jucatorul ori a colectat toate punctele ori a fost ucis de catre inamic. In functie de cele 2 urmari, se va afisa la ecran un mesaj corespunzator, se va schimba culoarea led-ului intr-una care reflecta rezultatul final si | ||
+ | se va pune la speaker o melodie aferenta. | ||
+ | |||
+ | <code cpp> | ||
+ | void loop() | ||
+ | { | ||
+ | // Rest of code... | ||
TFTscreen.fillScreen(TFT_BLACK); | TFTscreen.fillScreen(TFT_BLACK); | ||
char scoreSir[11]; | char scoreSir[11]; | ||
Line 146: | Line 231: | ||
} | } | ||
gameStarted = false; | gameStarted = false; | ||
- | //Rest of code | + | // Rest of code... |
} | } | ||
</code> | </code> | ||
- | + | ===== Concluzii ===== | |
+ | * Proiectul a fost amuzant de facut (exceptand partea hardware :( ), si acum simt ca inteleg mai bine arhitectura calculatoarelor | ||
+ | * Nu pot sa folosesc memoria la fel ca si pe calculator, deoarece am foarte putina memorie si se umple foarte repede | ||
+ | * Sa va uitati de 10 ori in datasheet sa verificati ca ati legat bine firele :) | ||
+ | * Sa va aveti planuri cum o sa arate proiectul, ca sa nu va cumparati piese degeaba si sa va cumparati piese de calitate | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
- | <note tip> | + | <html> |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | <iframe width="560" height="315" src="https://www.youtube.com/embed/M0we7dr7Ifs?si=FwVCBkxV57mRdraP" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe> |
- | </note> | + | </html> |
- | + | ||
- | ===== Concluzii ===== | + | |
- | + | ||
- | ===== Download ===== | + | |
- | + | ||
- | <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**. | + | |
- | </note> | + | |
===== Jurnal ===== | ===== Jurnal ===== | ||
Line 178: | Line 256: | ||
* **19.05** - Adaugat legarea initiala | * **19.05** - Adaugat legarea initiala | ||
* **21.05** - Adaugat design software initial + bibliografie + legarea finala | * **21.05** - Adaugat design software initial + bibliografie + legarea finala | ||
+ | * **25.05** - Finalizat design software + pagina OCW | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
Line 184: | Line 263: | ||
* [[https://docs.arduino.cc/resources/datasheets/A000066-datasheet.pdf|Arduino UNO R3 Datasheet]] | * [[https://docs.arduino.cc/resources/datasheets/A000066-datasheet.pdf|Arduino UNO R3 Datasheet]] | ||
* [[https://www.openhacks.com/uploadsproductos/tutorial_display_tft.pdf|KMR 1.8" TFT LCD Datasheet]] | * [[https://www.openhacks.com/uploadsproductos/tutorial_display_tft.pdf|KMR 1.8" TFT LCD Datasheet]] | ||
+ | * [[https://www.youtube.com/watch?v=FGqRiPqg4Ds|TUTORIAL: How to work with a 1.8" SPI TFT with strange incorrect labelling!]] | ||
+ | * [[https://www.instructables.com/Accessing-5-buttons-through-1-Arduino-pin-Revisi/| Accessing 5 Buttons Through 1 Arduino Pin - Revisited]] | ||
=== Resurse Software === | === Resurse Software === | ||
Line 189: | Line 270: | ||
* [[https://www.arduino.cc/en/software| Arduino IDE]] | * [[https://www.arduino.cc/en/software| Arduino IDE]] | ||
* [[https://github.com/robsoncouto/arduino-songs| Arduino Songs]] | * [[https://github.com/robsoncouto/arduino-songs| Arduino Songs]] | ||
+ | * [[https://en.wikipedia.org/wiki/Hill_climbing| Hill climbing]] | ||
+ | ===== Download ===== | ||
+ | <html><a class="media mediafile mf_zip" href="https://ocw.cs.pub.ro/courses/_media/pm/prj2024/vstoica/petrea_andrei_pacman.zip">Download archive</a></html> | ||
<html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||