Home Chi sono Mappa del sito Contatti  
 
Java
Apache Wicket
Sistemistica Totocalcio
 
 
Programmare Applicativi...
Presentazione del libro
Panoramica dei contenuti
 
 
Giochi in PHP
Introduzione
Filetto (Tris)
Forza 4
Sudoku
 
 
Tutorial Linux/Unix
Archivio
 
 
Sql
Tutorial su Mysql
 
 
C++
Framework a oggetti
 


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

  • 0 1 2
    3 4 5
    6 7 8

  • 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.

    0 1 2
    3 4 5
    6 7 8

    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)