Differences

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

Link to this comparison view

pm:prj2021:abirlica:x_si_o [2021/05/30 13:25]
anca_maria.buzatu
pm:prj2021:abirlica:x_si_o [2021/05/31 09:31] (current)
anca_maria.buzatu [Concluzii]
Line 4: Line 4:
 Implementarea jocului X și O, având doi jucători reprezentați de led-uri verzi, respectiv roșii.\\ ​ Implementarea jocului X și O, având doi jucători reprezentați de led-uri verzi, respectiv roșii.\\ ​
 Jocul are două moduri: Jocul are două moduri:
-  * 2 jucători: RED vs GREEN +  * 2 jucători: RED vs GREEN (single player) 
-  * 1 jucător: ​ RED vs GREEN Arduino.\\ +  * 1 jucător: ​ RED vs GREEN Arduino ​(two players)\\ 
 Poziția se alege prin intermediul butoanelor, iar scorul fiecărei runde va fi afișat pe un ecran LCD.\\ ​ Poziția se alege prin intermediul butoanelor, iar scorul fiecărei runde va fi afișat pe un ecran LCD.\\ ​
 Proiectul are ca scop realizarea unui joc folosind cunoștințele acumulate în cadrul laboratoarelor.\\ ​ Proiectul are ca scop realizarea unui joc folosind cunoștințele acumulate în cadrul laboratoarelor.\\ ​
Line 42: Line 42:
  
 ===== Software Design ===== ===== Software Design =====
-=== Diagramă activitate ===+=== Diagramă ​de activitate ===
 {{:​pm:​prj2021:​abirlica:​uml_x_o_buzatuanca.jpg}}\\ ​ {{:​pm:​prj2021:​abirlica:​uml_x_o_buzatuanca.jpg}}\\ ​
-{{:​pm:​prj2021:​abirlica:​uml_x_o_buzatuanca.jpg}}+{{:​pm:​prj2021:​abirlica:​uml_x_o_2_buzatuanca.jpg}} 
 +=== Implementare === 
 +Pinii folosiți 
 +  * playerSelectRed:​ 3 - PD3 
 +  * playerSelectGreen:​ 2 - PD2 
 +  * led11: 4 - PD4 
 +  * led12: 5 - PD5 
 +  * led13: 6 - PD6 
 +  * led21: 7 - PD7 
 +  * led22: 8 - PB0 
 +  * led23: 9 - PB1 
 +  * led31: 10 - PB2 
 +  * led32: 11 - PB3 
 +  * led33: 12 - PB4 
 +Pozițiile jucătorilor sunt păstrate în matrice 3x3: ledStateRed,​ ledStateGreen.\\ 
 +Pin-urile reprezentative pentru led-uri sunt configurate ca ieșiri în setup(). Led-urile sunt aprinse într-o rutină de întreruperi. Am folosit Timer0 în modul normal cu top 0xFF. 
 +Mai întai sting toate ledurile și configurez pinii pe valoarea LOW. Apoi cu ajutorul unei variabile palyer: 
 +   * dacă este true - aprind ledurile roșii: pinul playerSelectGreen va fi configurat ca input, playerSelectRed va fi configurat ca output, iar pentru led-urile care au în matricea ledStateRed valori diferite de 0, pinii vor fi setați pe HIGH. 
 +   * dacă este false - aprind ledurile verzi: pinul playerSelectGreen va fi configurat ca output, playerSelectRed va fi configurat ca input, iar pentru led-urile care au în matricea ledStateGreen valori diferite de 0, pinii vor fi setați pe HIGH. 
 +Pentru a nu schimba player la ficare întrerupere am adăugat o variabila care este incrementată în cadrul rutinei. Când variabila ajunge la 5, se schimbă playerul și se aprind ledurile acestuia. 
 + 
 +Inputul este recepționat în funcția GetInput() care citește valorile pe pinii analogici A0, A1, A2. 
 +Pinii sunt împărțiți astfel: 
 +  * A0 linia 1: stânga, dreapta 
 +  * A1 linia 2: sus, jos 
 +  * A2 submit 
 +Pentru a diferenția butoanele stânga-dreapta,​ respectiv sus-jos am mai adaugat câte o rezistență de 100 ohm. Astfel pentru 
 +butonul din stânga este citită valoarea 1023, iar pentru cel din dreapta valoarea 1013. 
 + 
 +Invalid moves 
 +  * jucătorul curent dă submit pe o poziție ocupată de celălalt jucător sau o poziție aleasă într-un pas anterior 
 +  * această mutare duce la depășirea matricei 3x3\\  
 +Când se apelează funcția ValidMove, se verifică dacă mutarea este validă și se completează în matricea fiecarui jucator: 
 +  * 1, dacă nu este deja aprins led-ul 
 +  * 2, dacă led-ul deja a fost aprins, jucătorului nu îi este permis să aleagă această poziție, dar poate trece peste ea pentru a ajunge într-o celula disponibilă.  
 + 
 +Pentru modul cu un singur jucător există și matricea ledState folosită în cadrul algoritmului minimax: 
 +  * 0, poziție liberă 
 +  * 1, poziție ocupată de red 
 +  * 2, poziție ocupată de arduino. 
 +ArduinoMove() realizeză mutarea jucătorului vrede când se alege modul single player. Folosește algoritmul minimax, care evaluează toate mutările posibile și alege soluția care are cele mai multe șanse de câștig.\\ 
 +Dupa apăsarea butonului submit, se verifică dacă există un caștigător,​ caz în care sunt stinse led-urile pierzătorului,​ se  
 +actualizează scorul și se resetează jocul pentru runda următoare. Dacă nu există câștigător și numărul de mutări este 
 +egal cu 9, este egalitate și se resetează runda. Altfel așteaptă următoarea mutare.\\ 
 + 
 +Când scorul însumat al celor doi jucători este egal cu o valoarea maximă, impară, predefinită,​ se resetează iarăși jocul și se poate alege înca o dată modul jocului.
 === Mediu de dezvolare === === Mediu de dezvolare ===
   * Arduino IDE   * Arduino IDE
Line 55: Line 100:
  
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
 +După ce se alege modul single player sau two players, jocul continuă cu câte o rundă nouă până când există un număr de câștiguri egal cu MAX_ROUNDS definit cu valoarea 3. Se va afișa pe ecran câștigătorul final.\\
 [[https://​www.youtube.com/​watch?​v=MFg_QGZY0Fk&​ab_channel=AncaBuzatu | Demo]]\\ [[https://​www.youtube.com/​watch?​v=MFg_QGZY0Fk&​ab_channel=AncaBuzatu | Demo]]\\
 {{:​pm:​prj2021:​abirlica:​rezultat_1_buzatuanca.jpg?​780x680}}\\ ​ {{:​pm:​prj2021:​abirlica:​rezultat_1_buzatuanca.jpg?​780x680}}\\ ​
Line 62: Line 108:
 ===== Concluzii ===== ===== Concluzii =====
 Proiectul a fost destul de simplu de realizat, jocul are implementate toate funcționalitățile menționate în descriere.\\ ​ Proiectul a fost destul de simplu de realizat, jocul are implementate toate funcționalitățile menționate în descriere.\\ ​
-Partea hardware am încercat să o realizez cât mai ordonat, chiar dacă am folosit breadboards și un număr mare de pini.  +Partea hardware am încercat să o realizez cât mai ordonat, chiar dacă am folosit breadboards și un număr mare de pini. O problemă ar fi faptul că există momente când valoarea citită cu analogRead() nu este cea așteptă, iar prima mutare arduino necesita mai mult timp de calcul.\\ ​ 
-Există totuși ​momente când valoarea citită cu analogRead() nu este cea așteptă, iar prima mutare arduino necesita mai mult timp de calcul.\\ ​+În final, să lucrez cu un ecran lcd a fost foarte simplu datorită bibliotecii ajutătoare,​ la fel si partea de debugging, datorită multitudinii de led-uri.
  
  
 ===== Download ===== ===== Download =====
-TODO+{{:​pm:​prj2021:​abirlica:​proiect_x_o_buzatuanca.zip | Cod sursă și README}}
  
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
pm/prj2021/abirlica/x_si_o.1622370315.txt.gz · Last modified: 2021/05/30 13:25 by anca_maria.buzatu
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