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: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;​ autoplayclipboard-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>​
  
pm/prj2024/vstoica/andrei.petrea1210.1716666154.txt.gz · Last modified: 2024/05/25 22:42 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