Giochi in PHP: Filetto (Tris)
In questo paragrafo verrà spiegato come implementare un programma
che permette di far giocare il computer al gioco del filetto.
Questo gioco è noto ai bambini in quanto molto semplice,
ed è quindi l'ideale per introdurre la metodologia ricorsiva del min-max.
Questa metodologia sia basa su un semplice presupposto:
l'utente A cerca la mossa che gli porta il punteggio massimo,
e nella mossa successiva l'avversario B cercherà la sua mossa migliore,
che corrisponderà al punteggio minimo di A.
Per spiegare questo algoritmo si procederà per esempi,
dapprima si implementerà un algoritmo stupido con soluzioni random,
quindi si procederà con vari affinamenti fino ad arrivare ad ottenere
l'algoritmo di ricerca definivo.
Consideriamo le variabili contenenti i dati dello schema del gioco:
La variabile ($matrice) contenente lo schema, è un array di 9 elementi,
dove gli indici sono impostati nel modo seguente
La costante COMPUTER definisce il simbolo relativo alla mossa
del computer
La costante UTENTE definisce il simbolo relativo alla mossa dell'utente
La costante MAX_PUNTEGGIO definisce il valore con il quale il computer vince
La costante MIN_PUNTEGGIO definisce il valore con il quale il computer perde
La prima funzione che andremo ad implementare è quella relativa
al controllo del tris: ovvero la funziona verifica se l'utente o
il computer è riuscito a comporre una sequenza di tre elementi successivi,
disposti in verticale, orizzontale o in diagonale.
L'implementazione è piuttosto semplice in quanto si tratta di verificare
questa sequenza in tutti i possibili modi.
La visualizzazione del gioco a fine partita è piuttosto semplice.
Di seguito la funzione che lo implementa.
Di seguito l'implementazione dell'ambiente grafico di gioco,
con la visualizzazione dello schema, e la possibilità da parte dell'utente
di selezionare la sua prossima mossa.
L'utente ha anche la possibilità di decidere di far iniziare il computer.
Di seguito il codice
Si osservi che quando l'utente seleziona la casella, la funzione javascript
Muovi() visualizza la mossa dell'utente prima di ricaricare la pagina;
in questo modo l'utente vede subito l'esecuzione della sua mossa, ed aspetta
per vedere la mossa del computer (invece di aspettare per vedere la sua mossa
e contemporaneamente quella del computer).
Quando è il computer ad iniziare, è possibile far scegliere la sua prima
mossa in modo random tra una serie di posti ritenuti buoni.
Le caselle evidenziate (in grassetto e sottolineato) indicano quali siano
questi posti.
Vediamo il codice
Infine vediamo il controllo del gioco
Mossa random
La successiva funzione implementa la ricerca di una mossa valida,
che come detto precedentemente si tratta di una ricerca stupida.
Si osservi che viene cercata una mossa valida random tra tutti i posti liberi.
Mossa Max
La successiva funzione implementa la ricerca di un tris, anche qui si
tratta di una ricerca stupida.
Si osservi che se non trova un tris, restituisce una mossa valida random.
Mossa Min-Max
Di seguito l'implementazione del metodo min-max.
S osservi che la natura semplice del gioco, permetta l'esplorazione di tutte
le possibili soluzioni in tempi ragionevoli.
Min-Max migliore
Finora le funzioni di ricerca hanno restituito un valore tra le tre possibili:
0: Possibile patta
MAX_PUNTEGGIO: Vince il computer
MIN_PUNTEGGIO: vince l'utente
In pratica quando il computer gioca, se non riesce a innescare
una "trappola", gioca a caso senza neanche tentare un approccio di tris;
questo perché parte dal presupposto che l'utente
sia comunque in grado di bloccarlo.
Quello che invece il computer dovrebbe fare, è provarci ugualmente.
Per fare questo le funzioni di ricerca dovrebbero restituire
un valore tra le quattro possibili:
0: Possibile patta
1: Il computer potrebbe vincere
MAX_PUNTEGGIO: Vince il computer
MIN_PUNTEGGIO: vince l'utente
Nella funzione CercaMossaMin(), viene valutata anche la possibilità
da parte dell'utente di commettere un errore quindi in questo caso
di tornare il valore '1' al posto del valore '0'.
Nella funzione CercaMossaMax() viene calcolato il massimo punteggio.
Nella funzione CercaMossa in caso non ci siano mosse vincenti,
viene data la possibilità di selezionare una mossa random tra quelle
che hanno una qualche probabilità di vittoria (qualora l'utente sbagli).
Di seguito le modifiche alle funzioni di ricerca.
Scarica documento e sorgenti 
(235 Kb)