Autor: Anca-Maria BUZATU - 336CB
Implementarea jocului X și O, având doi jucători reprezentați de led-uri verzi, respectiv roșii.
Jocul are două moduri:
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.
Am ales acest proiect, deoarece X și O este un joc clasic și foarte îndrăgit și îl voi folosi pentru a-mi distra verișorii mai mici de sărbători.
Ieșiri:
Jucătorul va apăsa butoanele up, down, right, left pentru a ajunge pe poziția dorită. Aceste acțiuni sunt interceptate de către placa Arduino care va schimba starea led-ului corespunzător fiecărei poziții. Când jucătorul decide poziția finală, apasă butonul submit, astfel anunțându-l pe celălalt. Schimbarea jucătorului va fi afișată și pe ecranul LCD.
În funcție de rezultatul rundei se actualizează scorul care, de asemenea, va fi afișat pe ecranul LCD.
Pinii folosiți
Pozițiile jucătorilor sunt păstrate în matrice 3×3: 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:
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:
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
Când se apelează funcția ValidMove, se verifică dacă mutarea este validă și se completează în matricea fiecarui jucator:
Pentru modul cu un singur jucător există și matricea ledState folosită în cadrul algoritmului minimax:
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.
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.
Demo
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. 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.
Î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.