Ecco un esempio di codice Java per implementare il gioco del tris contro il computer. Ci sono molti modi per farlo, quindi questa è solo una possibile soluzione.

tris java

Il gioco del tris è un classico passatempo che tutti conosciamo, spesso giocato su un foglio di carta. In questo articolo vedremo come implementare il gioco del tris in Java, includendo una modalità di gioco contro il computer. Il nostro programma utilizzerà una griglia 3×3, in cui due giocatori (il giocatore umano e il computer) si sfideranno per ottenere tre simboli in linea (orizzontale, verticale o diagonale). Ogni giocatore potrà inserire il proprio simbolo (X per il giocatore umano e O per il computer) alternativamente, finché non verrà raggiunto un risultato (una vittoria o un pareggio). Vedremo in dettaglio come implementare le funzionalità principali del gioco, inclusa la validazione delle mosse, la verifica della vittoria e la scelta della mossa del computer.

ALLA FINE DI QUESTO ARTICOLO TROVERETE IL CODICE COMPLETO

Tris java: analizziamo i passaggi

La prima cosa che facciamo è definire alcune costanti utilizzate nel gioco, come la dimensione della griglia (che è 3×3) e i simboli utilizzati dai due giocatori (‘X’ per il giocatore umano e ‘O’ per il computer):

public class Tris {
private static final int DIMENSIONE_GRIGLIA = 3;
private static final char GIOCATORE_UMANO = 'X';
private static final char GIOCATORE_COMPUTER = 'O';
…
}

Inizializziamo poi la griglia con i simboli ‘-‘ in ogni cella:

char[][] griglia = new char[DIMENSIONE_GRIGLIA][DIMENSIONE_GRIGLIA];
for (int i = 0; i < DIMENSIONE_GRIGLIA; i++) {
    for (int j = 0; j < DIMENSIONE_GRIGLIA; j++) {
        griglia[i][j] = '-';
    }
}

Il gioco inizia con il giocatore umano, quindi inizializziamo la variabile giocatoreCorrente con il valore del simbolo del giocatore umano:

char giocatoreCorrente = GIOCATORE_UMANO;

Inizia quindi il ciclo principale del gioco, che continua finché non ci sono più mosse disponibili o finché non c’è un vincitore. Ad ogni turno, stampiamo la griglia, chiediamo al giocatore corrente di fare una mossa e controlliamo se la mossa è valida. Se la mossa è valida, aggiorniamo la griglia, incrementiamo il numero di mosse effettuate e cambiamo il giocatore corrente. Se la mossa non è valida, stampiamo un messaggio di errore e chiediamo al giocatore di fare un’altra mossa:

while (mosseEffettuate < DIMENSIONE_GRIGLIA * DIMENSIONE_GRIGLIA) {
    stampaGriglia(griglia);
    if (giocatoreCorrente == GIOCATORE_UMANO) {
        System.out.println("E' il turno del giocatore umano.");
        System.out.print("Inserisci la riga della tua mossa (0-2): ");
        int riga = scanner.nextInt();
        System.out.print("Inserisci la colonna della tua mossa (0-2): ");
        int colonna = scanner.nextInt();
        if (mossaValida(griglia, riga, colonna)) {
            griglia[riga][colonna] = GIOCATORE_UMANO;
            mosseEffettuate++;
            giocatoreCorrente = GIOCATORE_COMPUTER;
        } else {
            System.out.println("Mossa non valida. Riprova.");
        }
    } else {
        System.out.println("E' il turno del computer.");
        // ...
    }
}

Quando il ciclo termina, stampiamo la griglia finale e controlliamo il vincitore utilizzando il metodo haVinto:

stampaGriglia(griglia);
if (haVinto(griglia, GIOCATORE_UMANO)) {
System.out.println("Il giocatore umano ha vinto!");
} else if (haVinto(griglia, GIOCATORE_COMPUTER)) {
System.out.println("Il computer ha vinto!");
} else {
System.out.println("Pareggio!");
}
``

Per quanto riguarda il turno del computer, utilizziamo un algoritmo molto semplice che sceglie una mossa casuale finché non trova una mossa valida:

if (giocatoreCorrente == GIOCATORE_COMPUTER) {
System.out.println("E' il turno del computer.");
int riga, colonna;
do {
riga = random.nextInt(DIMENSIONE_GRIGLIA);
colonna = random.nextInt(DIMENSIONE_GRIGLIA);
} while (!mossaValida(griglia, riga, colonna));
griglia[riga][colonna] = GIOCATORE_COMPUTER;
mosseEffettuate++;
giocatoreCorrente = GIOCATORE_UMANO;
}

Il metodo mossaValida controlla se la mossa inserita dal giocatore è valida, cioè se la cella corrispondente è vuota:

private static boolean mossaValida(char[][] griglia, int riga, int colonna) {
return griglia[riga][colonna] == '-';
}

Il metodo haVinto controlla se un giocatore ha vinto il gioco, controllando tutte le possibili combinazioni di tre simboli uguali in linea:

private static boolean haVinto(char[][] griglia, char giocatore) {
// Controllo le righe
for (int i = 0; i < DIMENSIONE_GRIGLIA; i++) {
if (griglia[i][0] == giocatore && griglia[i][1] == giocatore && griglia[i][2] == giocatore) {
return true;
}
}
// Controllo le colonne
for (int j = 0; j < DIMENSIONE_GRIGLIA; j++) {
if (griglia[0][j] == giocatore && griglia[1][j] == giocatore && griglia[2][j] == giocatore) {
return true;
}
}
// Controllo le diagonali
if (griglia[0][0] == giocatore && griglia[1][1] == giocatore && griglia[2][2] == giocatore) {
return true;
}
if (griglia[0][2] == giocatore && griglia[1][1] == giocatore && griglia[2][0] == giocatore) {
return true;
}
return false;
}

Infine, il metodo stampaGriglia stampa la griglia con i simboli attuali dei giocatori:

private static void stampaGriglia(char[][] griglia) {
System.out.println("Griglia:");
for (int i = 0; i < DIMENSIONE_GRIGLIA; i++) {
for (int j = 0; j < DIMENSIONE_GRIGLIA; j++) {
System.out.print(griglia[i][j] + " ");
}
System.out.println();
}
}

Questo è solo un esempio molto semplice di come si può implementare il gioco del tris in Java contro il computer. Ci sono molte varianti e miglioramenti che si possono apportare, come ad esempio un algoritmo più sofisticato per la mossa del computer o l’implementazione di un’interfaccia grafica per rendere il gioco più user-friendly.

Tris JAVA: programma completo

import java.util.Scanner;

public class TrisControIlComputer {
// Definiamo la costante per la dimensione della griglia
private static final int DIMENSIONE_GRIGLIA = 3;
// Definiamo le costanti per i segni dei giocatori
private static final char GIOCATORE_UMANO = 'X';
private static final char GIOCATORE_COMPUTER = 'O';

public static void main(String[] args) {
    // Inizializziamo la griglia vuota
    char[][] griglia = new char[DIMENSIONE_GRIGLIA][DIMENSIONE_GRIGLIA];
    for (int i = 0; i < DIMENSIONE_GRIGLIA; i++) {
        for (int j = 0; j < DIMENSIONE_GRIGLIA; j++) {
            griglia[i][j] = '-';
        }
    }

    // Inizializziamo il giocatore umano come il primo giocatore
    char giocatoreCorrente = GIOCATORE_UMANO;

    // Inizializziamo il numero di mosse effettuate a 0
    int mosseEffettuate = 0;

    // Creiamo uno scanner per leggere l'input dall'utente
    Scanner input = new Scanner(System.in);

    // Continuiamo finché non abbiamo un vincitore o la griglia è piena
    while (!haVinto(griglia, GIOCATORE_UMANO) && !haVinto(griglia, GIOCATORE_COMPUTER) && mosseEffettuate < DIMENSIONE_GRIGLIA * DIMENSIONE_GRIGLIA) {
        // Stampiamo la griglia corrente
        stampaGriglia(griglia);

        if (giocatoreCorrente == GIOCATORE_UMANO) {
            // Chiediamo all'utente di fare una mossa
            System.out.println("Turno del giocatore umano");
            System.out.print("Inserisci la riga (da 1 a " + DIMENSIONE_GRIGLIA + "): ");
            int riga = input.nextInt() - 1;
            System.out.print("Inserisci la colonna (da 1 a " + DIMENSIONE_GRIGLIA + "): ");
            int colonna = input.nextInt() - 1;

            // Controlliamo che la mossa sia valida
            if (mossaValida(griglia, riga, colonna)) {
                // Aggiorniamo la griglia
                griglia[riga][colonna] = GIOCATORE_UMANO;
                mosseEffettuate++;
                // Cambiamo il giocatore corrente
                giocatoreCorrente = GIOCATORE_COMPUTER;
            } else {
                System.out.println("Mossa non valida, riprova.");
            }
        } else {
            // È il turno del computer, facciamo una mossa casuale
            System.out.println("Turno del computer");
            int riga = (int) (Math.random() * DIMENSIONE_GRIGLIA);
            int colonna = (int) (Math.random() * DIMENSIONE_GRIGLIA);

            // Controlliamo che la mossa sia valida
            if (mossaValida(griglia, riga, colonna))
                // Aggiorniamo la griglia
                griglia[riga][colonna] = GIOCATORE_COMPUTER;
                mosseEffettuate++;
                // Cambiamo il giocatore corrente
                giocatoreCorrente = GIOCATORE_UMANO;
            }
        }
    }

    // Stampiamo la griglia finale
    stampaGriglia(griglia);

    // Controlliamo il vincitore
    if (haVinto(griglia, GIOCATORE_UMANO)) {
        System.out.println("Il giocatore umano ha vinto!");
    } else if (haVinto(griglia, GIOCATORE_COMPUTER)) {
        System.out.println("Il computer ha vinto!");
    } else {
        System.out.println("Pareggio!");
    }
}

// Metodo per controllare se una mossa è valida
private static boolean mossaValida(char[][] griglia, int riga, int colonna) {
    return riga >= 0 && riga < DIMENSIONE_GRIGLIA &&
            colonna >= 0 && colonna < DIMENSIONE_GRIGLIA &&
            griglia[riga][colonna] == '-';
}

// Metodo per controllare se un giocatore ha vinto
private static boolean haVinto(char[][] griglia, char giocatore) {
    // Controlliamo le righe
    for (int i = 0; i < DIMENSIONE_GRIGLIA; i++) {
        boolean rigaVinta = true;
        for (int j = 0; j < DIMENSIONE_GRIGLIA; j++) {
            if (griglia[i][j] != giocatore) {
                rigaVinta = false;
                break;
            }
        }
        if (rigaVinta) {
            return true;
        }
    }

    // Controlliamo le colonne
    for (int j = 0; j < DIMENSIONE_GRIGLIA; j++) {
        boolean colonnaVinta = true;
        for (int i = 0; i < DIMENSIONE_GRIGLIA; i++) {
            if (griglia[i][j] != giocatore) {
                colonnaVinta = false;
                break;
            }
        }
        if (colonnaVinta) {
            return true;
        }
    }

    // Controlliamo le diagonali
    boolean diagonale1Vinta = true;
    boolean diagonale2Vinta = true;
    for (int i = 0; i < DIMENSIONE_GRIGLIA; i++) {
        if (griglia[i][i] != giocatore) {
            diagonale1Vinta = false;
        }
        if (griglia[i][DIMENSIONE_GRIGLIA - 1 - i] != giocatore) {
            diagonale2Vinta = false;
        }
    }
    if (diagonale1Vinta || diagonale2Vinta) {
        return true;
    }

    // Nessun vincitore
    return false;
}

// Metodo per stampare la griglia
private static void stampaGriglia(char[][] griglia) {
    for (int i = 0; i < DIMENSIONE_GRIGLIA; i++) {
        for (int j = 0; j < DIMENSIONE_GRIGLIA; j++) {
            System.out.print(griglia[i][j] + " ");
        }
        System.out.println();
    }
}
}