Differences

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

Link to this comparison view

pm:prj2024:vstoica:andrei.petrea1210 [2024/05/25 22:39]
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 102: Line 123:
 </​code> ​ </​code> ​
  
-Pentru realizarea randomizarii pozitiilor, am folosit functiile //rand// si //srand// din biblioteca standard C, seed-ul pe care l-am ales fiind obtinut prin citirea unui pin analogic neconectat (in cazul meu, A1)+Pentru realizarea randomizarii pozitiilor, am folosit functiile //rand// si //srand// din biblioteca standard C, seed-ul pe care l-am ales fiind obtinut prin citirea unui pin analogic neconectat (in cazul meu, A1).
 <code cpp> <code cpp>
 void setup() void setup()
Line 111: Line 132:
 </​code>​ </​code>​
  
 +Odata intrat in joc, ne putem deplasa //UP//, //DOWN//, //LEFT// si //RIGHT// prin apasarea celor 4 butoane, dispuse conform celor 4 puncte cardinale. In functie de care buton a fost apasat, voi apela functia //move//, care are ca argument, deplasarea pe care i-o voi da PacMan-ului.
  
 +<code cpp>
 +void loop()
 +{
 +   // Rest of code...
 +   if (!gameOver) {
 +      draw();
 +      if (checkRange(value,​ 120, 170)) {
 +        move(0, -1);
 +      } else if (checkRange(value,​ 190, 230)) {
 +        move(-1, 0);
 +      } else if (checkRange(value,​ 420, 500)) {
 +        move(1, 0);
 +      } else if (checkRange(value,​ 900, 1024)) {
 +        move(0, 1);
 +      }
 +    } 
 +      // 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.
  
-===== Rezultate Obţinute ​=====+<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; 
 +      } 
 +    } 
 +  } 
 +
 +}
  
-<note tip> +int16_t manhattanDistance(PacmanObject obj1, PacmanObject obj2) { 
-Care au fost rezultatele obţinute în urma realizării proiectului vostru+  ​return (abs(obj2.x - obj1.x) + abs(obj2.y - obj1.y)); 
-</note>+} 
 +</code>
  
-===== Concluzii ===== 
  
-===== Download =====+== Final screen ​==
  
-<note warning>​ +La finaljucatorul ori a colectat toate punctele ori a fost ucis de catre inamicIn functie de cele 2 urmarise va afisa la ecran un mesaj corespunzatorse va schimba culoarea led-ului intr-una care reflecta rezultatul final si  
-O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului:​ sursescheme, etcUn fişier README, un ChangeLogun script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).+se va pune la speaker o melodie aferenta.
  
-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 Alin331CC -**:pm:​prj2009:​cc:​dumitru_alin**+<code cpp> 
-</note>+void loop() 
 +
 +  // Rest of code... 
 +      TFTscreen.fillScreen(TFT_BLACK);​ 
 +      char scoreSir[11];​ 
 +      sprintf(scoreSir,​ "Scor%d\n", score); 
 +      if (ateAll) { 
 +        TFTscreen.text("​Ati castigat! ​:)", 15, 50); 
 +        TFTscreen.text(scoreSir,​ 40, 70); 
 +        analogWrite(PIN_GREEN,​ 0); 
 +        analogWrite(PIN_BLUE,​ 64); 
 +        playPacmanIntro();​ 
 +      } else { 
 +        TFTscreen.text("​Ati pierdut! ​:(", 15, 50); 
 +        TFTscreen.text(scoreSir,​ 40, 70); 
 +        analogWrite(PIN_GREEN,​ 0); 
 +        analogWrite(PIN_RED,​ 64); 
 +        playFailedSong();​ 
 +      } 
 +      gameStarted = false; 
 +   // Rest of 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 proiectulca sa nu va cumparati piese degeaba si sa va cumparati piese de calitate 
 + 
 +===== Rezultate Obţinute ===== 
 + 
 +<html> 
 +<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>​ 
 +</html>
  
 ===== Jurnal ===== ===== Jurnal =====
Line 140: 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 146: 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 151: 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>​
  
pm/prj2024/vstoica/andrei.petrea1210.1716665944.txt.gz · Last modified: 2024/05/25 22:39 by andrei.petrea1210
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