This shows you the differences between two versions of the page.
|
pm:prj2022:agmocanu:distancegame [2022/05/27 20:52] andrei.bolozan |
pm:prj2022:agmocanu:distancegame [2022/05/27 22:47] (current) andrei.bolozan [Software Design] |
||
|---|---|---|---|
| Line 57: | Line 57: | ||
| * mainGame :Initial numarul de secunde alocate primului nivel sunt 15. Cu ajutorul unui for inceracm sa imitam trecerea celor 15 secunde(forul itereaza de la 0 pana la t*10 si de cate ori iterezeaza aplica un delay de 100 de secunde). In acest for citim distanta jucatorului fata de aparat si o afisam alaturi de distanta pe care trb sa o indeplineasca( aceasta este alesa la intamplare la inceputul jocului). Cand se iese din for inseamna ca s-a terminat jocu si verificam ce la ce distanta se afla jucatorul. Daca acesta a reusit sa se plaseze la distanta corecta(+- o variatie deltaDist) atunci afisam un mesaj “Good Job!” pornim buzzer ul si ledul verde pentru 1 secunda si trecem la urmatorul nivel(incrementam score si decrementam timpul de asteptare). Daca acesta nu a reusit atunci aratam pe LCD mesajul “Fail ☹” arata m scorul current pornim buzzerul si ledul rosu pentru 1 secunda si trecem la scena mainGame. In cazul in care jucatorul este bun si ajuns la un nivel in care timpul de reactie este mai mic fata de 7 atunci se afiseaza mesajul “ You win” si se aprind ledurile alternativ si se trece la scena cu mainMenu.\\ | * mainGame :Initial numarul de secunde alocate primului nivel sunt 15. Cu ajutorul unui for inceracm sa imitam trecerea celor 15 secunde(forul itereaza de la 0 pana la t*10 si de cate ori iterezeaza aplica un delay de 100 de secunde). In acest for citim distanta jucatorului fata de aparat si o afisam alaturi de distanta pe care trb sa o indeplineasca( aceasta este alesa la intamplare la inceputul jocului). Cand se iese din for inseamna ca s-a terminat jocu si verificam ce la ce distanta se afla jucatorul. Daca acesta a reusit sa se plaseze la distanta corecta(+- o variatie deltaDist) atunci afisam un mesaj “Good Job!” pornim buzzer ul si ledul verde pentru 1 secunda si trecem la urmatorul nivel(incrementam score si decrementam timpul de asteptare). Daca acesta nu a reusit atunci aratam pe LCD mesajul “Fail ☹” arata m scorul current pornim buzzerul si ledul rosu pentru 1 secunda si trecem la scena mainGame. In cazul in care jucatorul este bun si ajuns la un nivel in care timpul de reactie este mai mic fata de 7 atunci se afiseaza mesajul “ You win” si se aprind ledurile alternativ si se trece la scena cu mainMenu.\\ | ||
| - | * Codul: | + | *Codul: |
| - | + | *Se afla in sectiunea de Download a paginii. | |
| - | <file cpp DistanceGame.ino> | + | |
| - | #include <LiquidCrystal.h> | + | |
| - | + | ||
| - | // initialize the library by associating any needed LCD interface pin | + | |
| - | // with the arduino pin number it is connected to | + | |
| - | const int rs = 11, en = 10, d4 = 5, d5 = 4, d6 = 3, d7 = 2; | + | |
| - | const int echo = 8, trig = 7, but = 6; | + | |
| - | const int buz = 9; | + | |
| - | const int rLED = 12, gLED = 13; | + | |
| - | LiquidCrystal lcd(rs, en, d4, d5, d6, d7); | + | |
| - | + | ||
| - | int sceneManager = 0; | + | |
| - | int t = 15; | + | |
| - | long lowDist = 20, highDist = 40; | + | |
| - | long deltaDist = 3; | + | |
| - | int score = 0; | + | |
| - | + | ||
| - | void setup() { | + | |
| - | Serial.begin(9600); | + | |
| - | lcd.begin(16, 2); | + | |
| - | + | ||
| - | pinMode(but, INPUT); | + | |
| - | pinMode(buz, OUTPUT); | + | |
| - | pinMode(rLED, OUTPUT); | + | |
| - | pinMode(gLED, OUTPUT); | + | |
| - | + | ||
| - | digitalWrite(rLED, LOW); | + | |
| - | digitalWrite(gLED, LOW); | + | |
| - | } | + | |
| - | + | ||
| - | void loop(){ | + | |
| - | switchScene(); | + | |
| - | } | + | |
| - | + | ||
| - | void switchScene(){ | + | |
| - | switch(sceneManager){ | + | |
| - | case 0: | + | |
| - | openingFrame(); | + | |
| - | break; | + | |
| - | case 1: | + | |
| - | mainMenu(); | + | |
| - | break; | + | |
| - | case 2: | + | |
| - | mainGame(); | + | |
| - | break; | + | |
| - | default: | + | |
| - | lcd.clear(); | + | |
| - | break; | + | |
| - | } | + | |
| - | } | + | |
| - | + | ||
| - | void openingFrame(){ | + | |
| - | lcd.clear(); | + | |
| - | lcd.setCursor(0, 0); | + | |
| - | lcd.print("Distance game!"); | + | |
| - | delay(2000); | + | |
| - | sceneManager = 1; | + | |
| - | } | + | |
| - | + | ||
| - | void mainMenu(){ | + | |
| - | lcd.clear(); | + | |
| - | lcd.setCursor(0, 0); | + | |
| - | lcd.print("Match the dist!"); | + | |
| - | lcd.setCursor(0, 1); | + | |
| - | lcd.print("But to start"); | + | |
| - | Serial.println(digitalRead(but)); | + | |
| - | if(digitalRead(but)){ | + | |
| - | sceneManager = 2; | + | |
| - | delay(200); | + | |
| - | } | + | |
| - | delay(500); | + | |
| - | } | + | |
| - | + | ||
| - | void mainGame(){ | + | |
| - | int localT = t; | + | |
| - | score = 0; | + | |
| - | while(1){ | + | |
| - | long trigDist = newrandom(lowDist, highDist); | + | |
| - | long dist = -1; | + | |
| - | for(int i = 0;i <= localT * 10;i++){ | + | |
| - | delay(100); | + | |
| - | lcd.clear(); | + | |
| - | dist = readDistanceSenzorData(trig, echo); | + | |
| - | lcd.setCursor(0, 0); | + | |
| - | lcd.print("Your dist:");lcd.print(dist);lcd.print(" cm"); | + | |
| - | lcd.setCursor(0, 1); | + | |
| - | lcd.print("Thr dist:");lcd.print(trigDist);lcd.print(" cm"); | + | |
| - | Serial.println(digitalRead(but)); | + | |
| - | + | ||
| - | } | + | |
| - | if((trigDist - deltaDist <= dist) && (dist < trigDist + deltaDist)){ | + | |
| - | lcd.clear(); | + | |
| - | lcd.setCursor(0, 0); | + | |
| - | lcd.print("Good job!"); | + | |
| - | tone(buz, 1000); | + | |
| - | digitalWrite(gLED, HIGH); | + | |
| - | score++; | + | |
| - | localT -= 2; | + | |
| - | delay(1000); | + | |
| - | noTone(buz); | + | |
| - | digitalWrite(gLED, LOW); | + | |
| - | if(t <= 7){ | + | |
| - | lcd.clear(); | + | |
| - | lcd.setCursor(0, 0); | + | |
| - | lcd.print("You win"); | + | |
| - | lcd.setCursor(0, 1); | + | |
| - | lcd.print("Score: "); lcd.print(score); | + | |
| - | for(int i = 0;i < 3;i++){ | + | |
| - | digitalWrite(rLED, HIGH); | + | |
| - | digitalWrite(gLED, LOW); | + | |
| - | delay(250); | + | |
| - | digitalWrite(rLED, LOW); | + | |
| - | digitalWrite(gLED, HIGH); | + | |
| - | delay(250); | + | |
| - | } | + | |
| - | digitalWrite(rLED, LOW); | + | |
| - | digitalWrite(gLED, LOW); | + | |
| - | sceneManager = 1; | + | |
| - | break; | + | |
| - | } | + | |
| - | } else { | + | |
| - | lcd.clear(); | + | |
| - | lcd.setCursor(0, 0); | + | |
| - | lcd.print("Fail :("); | + | |
| - | lcd.setCursor(0, 1); | + | |
| - | lcd.print("Score: "); lcd.print(score); | + | |
| - | sceneManager = 1; | + | |
| - | digitalWrite(rLED, HIGH); | + | |
| - | tone(buz, 500); | + | |
| - | delay(1000); | + | |
| - | noTone(buz); | + | |
| - | digitalWrite(rLED, LOW); | + | |
| - | break; | + | |
| - | } | + | |
| - | } | + | |
| - | } | + | |
| - | + | ||
| - | long readDistanceSenzorData(int ping, int echo){ | + | |
| - | long duration, inches, cm, distance; | + | |
| - | pinMode(ping, OUTPUT); | + | |
| - | digitalWrite(ping, LOW); | + | |
| - | delayMicroseconds(2); | + | |
| - | digitalWrite(ping, HIGH); | + | |
| - | delayMicroseconds(10); | + | |
| - | digitalWrite(ping, LOW); | + | |
| - | pinMode(echo, INPUT); | + | |
| - | duration = pulseIn(echo, HIGH); | + | |
| - | return duration / 29 / 2; | + | |
| - | } | + | |
| - | + | ||
| - | unsigned long newrandom(unsigned long howsmall, unsigned long howbig) | + | |
| - | { | + | |
| - | return howsmall + random() % (howbig - howsmall); | + | |
| - | } | + | |
| - | + | ||
| - | </file> | + | |
| ===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
| Line 225: | Line 69: | ||
| ===== Download ===== | ===== Download ===== | ||
| - | <note warning> | ||
| - | Fisierul cu codul se afla in sectiunea Software Design. | ||
| - | </note> | ||
| Repo github: | Repo github: | ||
| - | https://github.com/AndreiSlaShh/Distance_game/tree/main | + | https://github.com/AndreiSlaShh/Distance_Game_v2 |