Esercizio 30 – Semplice gioco del TRIS
- Febbraio 11, 2013
- by
- Donatantonio
Implementare una semplice versione del gioco del tris.
Realizzare quindi una matrice (3×3) come struttura dati di base e fornire i seguenti metodi:
- set(riga, colonna, simbolo) [inserisce una giocata]
- toString() [stampa lo stato della matrice]
- getWinner() [stampa l’eventuale vincitore]
Lanciare un’eccezione di tipo IllegalArgument qualora la posizione scelta per l’inserimento di una giocata sia già occupata.
Realizzare una classe di test denominata Gioca.java.
[In un prossimo esercizio riprenderemo il Tris fornendo un’interfaccia grafica e ulteriori metodi]
La classe Tris.java:
public class Tris { // Metodo Costruttore // Creo una matrice 3*3 vuota public Tris() { board = new String[rows][columns]; for(int i=0; i<rows; i++) for(int j =0; j<columns; j++) { board[i][j] = " "; } } // Metodo che restituisce lo stato della matrice public String tostring() { String r = ""; for(int i=0; i<rows; i++) { r = r + "|"; for (int j=0; j<columns ; j++) r=r + board[i][j]; r = r + "|\n"; } return r; } // Metodo che permette di inserire una giocata public void set(int i, int j, String player) { if(board[i][j] != " ") { throw new IllegalArgumentException("Posizione occupata"); } board[i][j] = player; } // Metodo che restituisce il nome del giocatore vincitore public String getWinner() { int k = 0; int h = 0; // Verifico se il tris è presente in una riga for(int i=0; i<rows; i++) { for (int j=0; j<columns ; j++) { if(board[i][j]== "x") { k++; if(k==3){ return " VINCE IL GIOCATORE X "; } } else { if(board[i][j] == "o") { h++; if(h==3){ return " VINCE IL GIOCATORE O "; } } } } k=0; h=0; } // Verifico se il tris è presente in una colonna for(int i=0; i<columns; i++) { for (int j=0; j<rows ; j++) { if(board[j][i]== "x") { k++; if(k==3){ return " VINCE IL GIOCATORE X "; } } else { if(board[j][i] == "o") { h++; if(h==3){ return " VINCE IL GIOCATORE O "; } } } } k=0; h=0; } // Verifico se il tris è presente in una diagonale for(int i=0; i<rows; i++) { int j = i; if(board[i][j]== "x") { k++; if(k==3){ return " VINCE IL GIOCATORE X "; } } else { if(board[i][j] == "o") { h++; if(h==3){ return " VINCE IL GIOCATORE O "; } } } } k=0; h=0; int j = 2; for(int i=0; i<rows; i++) { if(board[i][j] == "x") { k++; if(k==3){ return " VINCE IL GIOCATORE X "; } } else { if(board[i][j] == "o") { h++; if(h==3){ return " VINCE IL GIOCATORE O "; } } } j--; } return "" ; } private String[][] board; private static final int rows = 3; private static final int columns = 3; }
La classe di test, Gioca.java:
import java.util.Scanner; public class Gioca { public static void main(String[] args) { int numGiocate = 0; String player = "x"; // Costruisco un nuovo oggetto Tris Tris game = new Tris(); Scanner in = new Scanner(System.in); // Procedo con il gioco while(true) { // Giocata del giocatore System.out.println(game.toString()); System.out.print("inserisci riga per " + player); System.out.println(" (-1 per uscire): "); int riga = in.nextInt(); if (riga < 0) return; System.out.print("Inserisci colonna per " +player); System.out.println(" : "); int colonna = in.nextInt(); // Inserimento giocata game.set(riga,colonna,player); // Visualizzo lo stato del tris System.out.println(game.tostring()); // Verifico se è presente un vincitore String verifica = game.getWinner(); if(verifica.equalsIgnoreCase(" VINCE IL GIOCATORE X ") || verifica.equalsIgnoreCase(" VINCE IL GIOCATORE O ")) { // Il gioco termina se un giocatore vince la partita System.out.println(verifica); return; } numGiocate++; if(numGiocate==9) { // Se il tris è pieno e non c'è vincitore, la partita termina System.out.println("NESSUN VINCITORE"); return; } // Se ha giocato X allora dopo gioca O, altrimenti viceversa if(player=="x") player = "o"; else player = "x"; } } }
Cliccando qui è possibile scaricare il codice completo.