Cows And Bulls
Mediul de dezvoltare:
Libraries used:
Organizarea codului:
Functile urmatoare sunt pentru logica jocului:
void start() { lcd.clear(); do { set_random(); } while(check_duplicate(random_number)!=true); lcd.setCursor(0,0); lcd.print("Press 4 digits"); tries=0; cows=0; bulls=0; }
Functia start() se foloseste de toate celelate functii prezentate mai jos, care sunt logica jocului, se incepe prin a curata ecranul LCD, creeand un numar random si verificand ca are cifrele distincte.
void set_random() { for(x=0;x<=3;x++) { randomSeed(analogRead(analogRead(x))); randomNumber[x]=random(1,9); } random_number = String(randomNumber[0])+String(randomNumber[1])+String(randomNumber[2]+String(randomNumber[3])); }
Functia set_random() creeaza un numar random de la 1-9 pe care il copieaza in variabila random_number pe care o comparam cu numarul introdus de la keypad.
void enter() { if(count==4) { k=String(generatedNumber_stored[0]); l=String(generatedNumber_stored[1]); m=String(generatedNumber_stored[2]); n=String(generatedNumber_stored[3]); player_number = k+l+m+n; if(check_duplicate(player_number)) { check(); } } else { lcd.setCursor(0,0); lcd.print("Incomplete"); } count=0; }
Functia enter() verifica daca tasta ”#” a fost apasata verificand daca avem 4 cifre introduse care creeaza un numar cu cifre distincte.
void check() { a1=String(randomNumber[0]); b1=String(randomNumber[1]); c1=String(randomNumber[2]); d1=String(randomNumber[3]); if(a1==k) {bulls++;} if(b1==l) {bulls++;} if(c1==m) {bulls++;} if(d1==n) {bulls++;} if(a1==l || a1==m || a1==n) { cows++;} if(b1==k || b1==m || b1==n) { cows++;} if(c1==k || c1==l || c1==n) { cows++;} if(d1==k || d1==l || d1==m) { cows++;} tries++; if(bulls==4) { lcd.clear(); lcd.print("You won in: "); lcd.print(tries); lcd.setCursor(0,1); lcd.print( "tries"); delay(2000); for (int thisNote = 0; thisNote < notes * 2; thisNote = thisNote + 2) { divider = melody[thisNote + 1]; if (divider > 0) { noteDuration = (wholenote) / divider; } else if (divider < 0) { noteDuration = (wholenote) / abs(divider); noteDuration *= 1.5; // increases the duration in half for dotted notes } tone(buzzer, melody[thisNote], noteDuration*0.9); delay(noteDuration); noTone(buzzer); } start(); } // Aici am introdus si cod-ul pentru buzzer care v-a incepe sa cante cand jocul este castigat. update_display(); if(tries==maxTries) { lcd.clear(); lcd.setCursor(0,0); lcd.write("You lost, the"); lcd.setCursor(0,1); lcd.print("number was: "); lcd.print(a1); lcd.print(b1); lcd.print(c1); lcd.print(d1); } count=0; cows=0; bulls=0; }
Functia check() verifica daca numarul de bulls este 4, adica am castigat jocul, aici buzzer ul intervine cu un cantec care evidentiaza faptul ca am castigat. Numarul maxim de incercari fiind de 5.
void update_display() { lcd.clear(); lcd.setCursor(0,0); lcd.print("Cows:"); lcd.print(cows); lcd.setCursor(8,0); lcd.print(" Bulls:"); lcd.print(bulls); lcd.setCursor(9,1); lcd.print("Try:"); lcd.print(tries); lcd.print("/5"); lcd.setCursor(0,1); lcd.blink(); }
Functia update_display() il ajuta pe jucator sa stie cate poziti cu numarul corect sunt (” Bulls:”) si numarul corect dar pozitia incorecta (” Cows:”). LCD arata mereu in functie de numarul introdus de catre jucator in plus cate incercari mai are din 5.
Functile setup() si loop():
void setup() { Serial.begin(9600); lcd.begin(); start(); }
Functia setup() porneste serial monitor-ul, ecranul si jocul Cows and Bulls prin functia start() explicata mai sus.
void loop() { char key = customKeypad.getKey(); if(key) { switch (key) { case '*': start(); //Starts a new game Serial.println(random_number); // implemented only to test the win, break; case '0': lcd.clear(); lcd.setCursor(0,0); lcd.print("Bye, the number "); lcd.setCursor(0,1); lcd.print("was: "); lcd.print(random_number); break; case '#': enter(); //Enter break; } } if(key) { generatedNumber_stored[count] = key; // if(key!='*' && key!='#' && key!='0') { lcd.setCursor(0+count,1); lcd.print(generatedNumber_stored[count]); count++; } } }
Functia loop() prin variabila key asteapta de la keypad 4 cifre, dar in cazul in care avem tasta “*” jucatorul incepe un nou joc cu alt numar, tasta “0” opreste jocul, si tasta ”#” cum am evidentiat la functia enter() este input ul catre joc.
Acest proiect mi s-a parut foarte interesant deoarece am inteles mai bine cum sa folosesc librari in arduino, cum sa fac legatura intre partea hardware si partea software in cazul meu datele care le obtineam de la keypad sa le introduc intr-o variabila cu care comparam variabila random generata, dupa aceea sa afisez aceste variabile pe LCD.
Pe viitor, voi incerca proiecte mai complexe folosindu-ma de mai multe componente hardware. Cu siguranta voi folosi aceste cunostinte in a face proiecte for fun :).
Final documentation (Software Design, Rezultate Obtinute, Concluzii, Download, Bibliografie) - 27.05.2023