QUATTRO

FOGARASI MONICA - 332CB

Cuprins

  1. Regulile jocului
  2. Appletul JAVA
  3. Sursa
  4. Detalii despre algoritm
  5. Alte observatii

Regulile jocului

Quattro este un joc care se disputa intre doi jucatori, pe o tabla dreptunghiulara, avand in general 6 linii si 8 coloane. Fiecare dintre jucatori poseda piese de o anumita culoare. Scopul jocului este acela de a realiza o "formatie" de patru piese, pe verticala, orizontala sau diagonala. Desfasurarea jocului: Cei doi jucatori efectueaza pe rand "mutari". O mutare consta in plasarea unei piese proprii in una dintre coloanele tablei de joc, pe cea mai joasa pozitie posibila. In cazul in care toata tabla este ocupata, se considera ca jocul s-a terminat egal.

Appletul Java

Sursa

Detalii despre algoritm:

Algoritmul se bazeaza pe o rutina de tip backtracking, implementata recursiv, cu limitare a cautarii in adancime.

Functia principala este:

int bestMove(int [] move, int depth)

Functia va intoarce una din varibilele intregi predefinite IWIN, IDRAW, ILOSE, avand semnificatia: cel mai prost rezultat posibil, in cazul in care ambii jucatori aleg cele mai bune mutari. Ideea de functionare a acestei functii este:

daca adancime==0 atunci intoarce IDRAW result = ILOSE; pentru fiecare mutare posibila daca castig atunci intoarce IWIN altfel x = bestMove(adancime - 1) //mutarea adversarului daca x == ILOSE atunci x = IWIN daca x == IWIN atunci x = ILOSE daca result mai slab decat x atunci result = x intoarce result

Acest algoritm are o complexitate exponentiala, de forma COLS^adancime, unde COLS este o constanta intreaga, reprezentand numarul de coloane, si implicit, numarul de mutari posibile. Evident, se realizeaza optimizari, si anume: (a) se cauta mai intai o eventuala mutare castigatoare (se evita astfel un numar mare de cautari in adancime nejustificate) (b) se "fura" mutarea castigatoare a adversarului, evitandu-se astfel COLS-1 cautari care vor avea ca rezultat ILOSE si (c) se foloseste o functie care "evalueaza" pozitia curenta de pe tabla, facand posibila alegerea unei mutari dintre mai multe care au acelasi rezultat.

Se mai definesc functii pentru: adaugarea unei mutari O(1) si retragerea ultimei mutari efectuate O(1)

O alta functie importanta este:

int win (int y)

Aceasta determina, pornind de la ultima mutare efectuata, daca jocul s-a incheiat (ultima mutare a fost castigatoare sau s-a ajuns la situatia de egalitate - toata tabla este completata) sau nu. In cazul in care jocul nu s-a terminat, intoarce o evaluare a situatiei de pe tabla, din punctul de vedere al jucatorului care a efectuat ultima mutare. Aceasta evaluare depinde de numarul de piese cu care este "legata" piesa curenta si de posibilitatea de dezvoltare a acestei "formatii". Complexitatea acestei functii este egala cu maximul dintre inaltimea si latimea tablei de joc.

Observatii

Pentru retinerea datelor s-au folosit urmatoarele structuri:

public final static int ROWS = 6; //Numarul de linii public final static int COLS = 8; //Numarul de coloane public final static int CONN = 4; //Numarul de piese pt. victorie private int[] moves = new int [ROWS*COLS]; //Mutarile efectuate private int n = 0; //Numarul de mutari private int[][] a = new int [ROWS+1][COLS]; //Tabla de joc

Se observa ca jocul se poate modifica usor prin simpla modificare a constantelor COLS, ROWS si CONN. O imbunatatire evidenta ar fi introducerea unei componente in cadrul appletului care sa permita setarea acestor valori, precum si a adancimii de cautare. Pentru cazul general, adancimea s-a considerat egala cu CONN, o adancime de 4 in acest caz facand din calculator un jucator putin peste medie si cu un timp de raspuns bun (adica instant).