Introducere

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.

Descriere generală

Principalele module:

  • Hardware
    • Control linie comună matrice
    • Matrice bicoloră
    • Joystick
  • Software
    • Interfața cu utilizatorul
      • Fereastră de selecție a tipului de joc
      • Fereastră de selecția a nivelului de dificultate
      • Fereastra de joc
    • Interacțiunea utilizatorului cu aplicația
      • Butoanele de mișcare
        • UP
        • DOWN
        • LEFT
        • RIGHT
      • Butonul SET
      • Butonul RESET

Hardware Design

Listă piese

Componente Bucăţi
butoane 6
matrice bicoloră 1
circuit integrat 74HC138N 1
fire legătură 28

Scheme electrice

Simulare

Hardware

Matrice bicoloră:

Matrice bicoloră

Circuit control linii comune:

Circuit control linii comune matrice

Joystick:

Joystick

Plăcuța de bază:

Plăcuța de bază

Software Design

Interfața cu utilizatorul

1. Fereastră de selecție a tipului de joc

Utilizatorul are la dispoziție 4 opțiuni:

1.1. Single Player - Red

- Om-Calculator - jucătorul uman este cel roșu(beneficiază de prima mutare), iar calculatorul simulează jucatorul verde

1.2. Single Player - Green

- Calculator-Om - jucătorul uman este cel verde(beneficiază de a doua mutare), iar calculatorul simulează jucatorul roșu

1.3. Multiplayer

- Om-Om - ambii jucători sunt umani

1.4. AutoMode

- Calculator-Calculator - ambii jucători sunt simulați de calculator

2. Fereastra de selecția a nivelului de dificultate

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)

2.1. Random

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)

2.2. Soft

Doar mutările de pe pozițiile extreme au valori nenule (liniile 0,7 - pozitiv(+2), liniile 1,6 negativ(-2), analog pentru coloane)

2.3. Hard

- liniile/coloanele 3,4: 0

- liniile/coloanele 2,5: 2

- liniile/coloanele 1,6: -2

- liniile/coloanele 0,7: 4

3. Fereastra de joc

3.1. Interacțiunea utilizatorului cu tabla de joc

- 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

3.2. Hint-uri

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

Interacțiunea utilizatorului cu aplicația

1. Butoanele de mișcare

- în funcție de fereastra în care se află

- unele dintre acestea pot fi blocate

1.1. UP

1.2. DOWN

1.3. LEFT

2. Butonul SET

- 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)

3. Butonul RESET

- 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)

Algoritm

1. Afisarea matricei(a tablei de joc)

- ț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

2. Reținerea datelor

2.1. Tabla de joc(matricea)

- 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

2.2. Mutările disponibile aferente fiecărui jucător la un anumit moment de timp

- 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

3. Hint-uri + simularea jucatorului de catre calculator

- 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)

Rezultate Obţinute

Alegerea tipului de joc

Alegerea nivel de dificultate

Început de joc

Pe durara jocului

Concluzii

1. Stadiul proiectului

Finalizat

Filmuleț:

http://pow.cs.pub.ro/PM/

2. Probleme întâmpinate

2.1. Diminuarea numărului de porturi folosite de pe microcontroller

- 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

2.2. Utilizarea rezistențelor legate serie la coloanele matricei

- 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

2.3. Utilizarea unui ULN2803 legat în serie între demultiplexor și pinii de coloane ai matricei pentru a spori intensitatea curentului

- 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

Download

Bibliografie/Resurse

pm/prj2010/avoinescu/othello.txt · Last modified: 2021/04/14 17:07 (external edit)
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