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_2_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.1622370359.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