Othello este un joc de strategie pentru doi jucători - tabla de joc are 8 linii și 8 coloane. Inițial fiecare jucător are câte două piese. Un jucător se poate deplasa doar dacă una dintre piesele sale sare peste o mulțime nevidă de piese ce aparțin doar jucătorului advers. Câștigător: jucătorul care, după umplerea tablei de joc, deține cele mai multe piese.
Principalele module:
Componente | Bucăţi |
---|---|
butoane | 6 |
matrice bicoloră | 1 |
circuit integrat 74HC138N | 1 |
fire legătură | 28 |
Utilizatorul are la dispoziție 4 opțiuni:
- Om-Calculator - jucătorul uman este cel roșu(beneficiază de prima mutare), iar calculatorul simulează jucatorul verde
- Calculator-Om - jucătorul uman este cel verde(beneficiază de a doua mutare), iar calculatorul simulează jucatorul roșu
- Om-Om - ambii jucători sunt umani
- Calculator-Calculator - ambii jucători sunt simulați de calculator
Utilizatorul are la dispoziție 3 opțiuni (pentru tipul de joc Multiplayer această fereastră nu este disponibilă) (funcția de calculare a valorii unei mutări ține cont de numărul de piese cucerite, dar și de poziția mutării efective - opțiunile de mai jos fac referire doar la valoarea poziției mutării)
Funcția de calculare a valorii unei mutări generează o valoare random(nu este întotdeauna cea mai usoară varianta, dar, neavând nicio strategie, statistic, nivelul de dificultate opus jucătorului este scăzut)
Doar mutările de pe pozițiile extreme au valori nenule (liniile 0,7 - pozitiv(+2), liniile 1,6 negativ(-2), analog pentru coloane)
- liniile/coloanele 3,4: 0
- liniile/coloanele 2,5: 2
- liniile/coloanele 1,6: -2
- liniile/coloanele 0,7: 4
- utilizatorul poate muta o piesă care nu aparține efectiv tablei de joc, ci se așteaptă a fi plasată pe aceasta - culoarea piesei speciale: portocaliu alternând cu culoarea jucătorului activ(în cazul unui jucator simulat de calculator această piesă nu este vizibilă) - atunci când piesa specială se află pe poziția unei piese ale jucătorului advers, aceasta nu iși mai schimba culoarea, rămănând doar portocaliu pentru a marca acest caz special - atunci când jucătorul dorește să plaseze piesa specială pe tabla de joc, apasă butonul SET
La un anumit interval de timp, apar, pentru o scurtă perioadă, mutările pe care jucătorul curent le-ar putea efectua în acel moment
- în funcție de fereastra în care se află
- unele dintre acestea pot fi blocate
- pentru a face o alegere se apasă acest buton
- este disponibil în oricare dintre ferestre (mai puțin în fereastra de joc atunci când calculatorul trebuie să efectueze mutarea)
- permite întoarcerea utilizatorului în fereastra de selecție a jocului - este disponibil în oricare dintre ferestre (mai puțin în fereastra de joc atunci când calculatorul trebuie să efectueze mutarea)
- ținând cont că matricea are linii comune, iar fiecare coloană dispune de doi pini(unul pentru rosu și unul pentru verde), afișez câte o linie la un moment de timp - vizualizare matricei în formă completă, fără întreruperi cauzate de stingerile succesive ale liniilor este posibilă datorită fenomenului Persistence of Vision, care presupune faptul că ochiul uman percepe o imagine pentru cel puțin 0.25 secunde
- este reținută în două numere întregi pe 64 de biți, reprezentând piesele aparținând celor doi jucători (red_player și green_player)
- fiecare octet al celor două numere reprezintă o linie a matricei
- sunt reținute de o structură de tip legal_moves:
- moves: vector ce reține pentru fiecare poziție de pe tabla de joc piesele cucerite prin selecția poziției respective
- maxRedValue: valoarea maximă dintre valorile mutărilor disponibile pentru roșu
- maxRedIndex: indexul valorii maxime
- maxGreenValue: valoarea maximă dintre valorile mutărilor disponibile pentru roșu
- maxGreenIndex: indexul valorii maxime
- moveRed: mutările disponibile pentru roșu
- moveGreen: mutările disponibile pentru verde
- după setarea unei piese de pe tabla de joc se calculează mutările posibile pentru ambii jucători(este nevoie de calcularea pentru ambii jucători pentru cazul în care deși îi vine rândul unui jucător acesta nu are unde să-ți seteze piesa) și se completează structura de la punctul 2.2.
- calularea mutărilor: se parcurge fiecare piesă de pe tabla de joc, iar pentru pozițiile neocupate se calculează pe fiecare direcție (NW, N, NE, W, E, SW, S, SE) piesele care pot fi cucerite de un jucător sau altul
- se calculează fiecare valoare a fiecărei mutări pentru fiecare jucător și se păstrează pentru fiecare valoarea cea mai mare pentru a fi aleasă de un jucător calculator(valoarea cea mai mare nu reprezintă cea mai bună alegere, ci doar valoarea cea mai mare a funcției descrise în partea I, punctul 2)
- din cauza faptului că doar matricea are 24 de pini, eram la limită cu numărul de porturi disponibile (unele fiind ocupate chiar de placuța de bază)
- soluție: demultiplexor
- am folosit doar pentru linii(reducând de la 24 de pini utilizați de pe microcontroller la 19)
- pentru coloane am preferat să nu folosesc demultiplexor din cauză că asta ar fi însemnat că la un moment de timp să pot aprinde doar un led (cel mult două led-uri) al(ale) matricei ceea ce ar fi dus la 63 de pași morți(față de 7) pentru fiecare led (+timpii de calcul ai aplicației), iar fenomenul Persistence of Vision nu ar mai fi fost suficient
- la început am lipit la fiecare coloană(fiecare culoare) în serie câte o rezistență, în ideea de a proteja matricea
- problemă: curentul era prea mic pentru a permite aprinderea led-urilor la o intensitate suficientă - soluție: eliminarea acestora
- problemă: tensiunile pe pinii ULN-ului fluctuau în jurul valorii 0.3V(același lucru se întâmplă și în simulator)
- soluție: ținând cont de punctul 2.2.(care aducea un plus de intensitate a curentului) și din lipsă de timp nu am mai căutat alt ULN și l-am înlocuit cu fire
http://en.wikipedia.org/wiki/Reversi
http://en.wikipedia.org/wiki/Persistence_of_vision
Datasheet: