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:
001 | public class Tris |
002 | { |
003 |
004 | // Metodo Costruttore |
005 | // Creo una matrice 3*3 vuota |
006 | public Tris() |
007 | { |
008 | board = new String[rows][columns]; |
009 | for ( int i= 0 ; i<rows; i++) |
010 | for ( int j = 0 ; j<columns; j++) |
011 | { |
012 | board[i][j] = " " ; |
013 | } |
014 | } |
015 |
016 | // Metodo che restituisce lo stato della matrice |
017 | public String tostring() |
018 | { |
019 | String r = "" ; |
020 | for ( int i= 0 ; i<rows; i++) |
021 | { |
022 | r = r + "|" ; |
023 | for ( int j= 0 ; j<columns ; j++) |
024 | r=r + board[i][j]; |
025 | r = r + "|\n" ; |
026 | } |
027 | return r; |
028 | } |
029 |
030 | // Metodo che permette di inserire una giocata |
031 | public void set( int i, int j, String player) |
032 | { |
033 | if (board[i][j] != " " ) |
034 | { |
035 | throw new IllegalArgumentException( "Posizione occupata" ); |
036 | } |
037 | board[i][j] = player; |
038 | } |
039 |
040 | // Metodo che restituisce il nome del giocatore vincitore |
041 | public String getWinner() |
042 | { |
043 | int k = 0 ; |
044 | int h = 0 ; |
045 | // Verifico se il tris è presente in una riga |
046 | for ( int i= 0 ; i<rows; i++) |
047 | { |
048 | for ( int j= 0 ; j<columns ; j++) |
049 | { |
050 | if (board[i][j]== "x" ) |
051 | { |
052 | k++; |
053 | if (k== 3 ){ return " VINCE IL GIOCATORE X " ; } |
054 | } |
055 | else |
056 | { |
057 | if (board[i][j] == "o" ) |
058 | { |
059 | h++; |
060 | if (h== 3 ){ return " VINCE IL GIOCATORE O " ; } |
061 | } |
062 | } |
063 | } |
064 | k= 0 ; |
065 | h= 0 ; |
066 | } |
067 | // Verifico se il tris è presente in una colonna |
068 | for ( int i= 0 ; i<columns; i++) |
069 | { |
070 | for ( int j= 0 ; j<rows ; j++) |
071 | { |
072 | if (board[j][i]== "x" ) |
073 | { |
074 | k++; |
075 | if (k== 3 ){ return " VINCE IL GIOCATORE X " ; } |
076 | } |
077 | else |
078 | { |
079 | if (board[j][i] == "o" ) |
080 | { |
081 | h++; |
082 | if (h== 3 ){ return " VINCE IL GIOCATORE O " ; } |
083 | } |
084 | } |
085 | } |
086 | k= 0 ; |
087 | h= 0 ; |
088 | } |
089 |
090 | // Verifico se il tris è presente in una diagonale |
091 | for ( int i= 0 ; i<rows; i++) |
092 | { |
093 | int j = i; |
094 | if (board[i][j]== "x" ) |
095 | { |
096 | k++; |
097 | if (k== 3 ){ return " VINCE IL GIOCATORE X " ; } |
098 | } |
099 | else |
100 | { |
101 | if (board[i][j] == "o" ) |
102 | { |
103 | h++; |
104 | if (h== 3 ){ return " VINCE IL GIOCATORE O " ; } |
105 | } |
106 | } |
107 | } |
108 | k= 0 ; |
109 | h= 0 ; |
110 | int j = 2 ; |
111 | for ( int i= 0 ; i<rows; i++) |
112 | { |
113 | if (board[i][j] == "x" ) |
114 | { |
115 | k++; |
116 | if (k== 3 ){ return " VINCE IL GIOCATORE X " ; } |
117 | } |
118 | else |
119 | { |
120 | if (board[i][j] == "o" ) |
121 | { |
122 | h++; |
123 | if (h== 3 ){ return " VINCE IL GIOCATORE O " ; } |
124 | } |
125 | } |
126 | j--; |
127 | } |
128 | return "" ; |
129 | } |
130 |
131 | private String[][] board; |
132 | private static final int rows = 3 ; |
133 | private static final int columns = 3 ; |
134 | } |
La classe di test, Gioca.java:
01 | import java.util.Scanner; |
02 | public class Gioca |
03 | { |
04 |
05 | public static void main(String[] args) |
06 | { |
07 | int numGiocate = 0 ; |
08 | String player = "x" ; |
09 |
10 | // Costruisco un nuovo oggetto Tris |
11 | Tris game = new Tris(); |
12 | Scanner in = new Scanner(System.in); |
13 |
14 | // Procedo con il gioco |
15 | while ( true ) |
16 | { |
17 | // Giocata del giocatore |
18 | System.out.println(game.toString()); |
19 | System.out.print( "inserisci riga per " + player); |
20 | System.out.println( " (-1 per uscire): " ); |
21 |
22 | int riga = in.nextInt(); |
23 |
24 | if (riga < 0 ) return ; |
25 |
26 | System.out.print( "Inserisci colonna per " +player); |
27 | System.out.println( " : " ); |
28 |
29 | int colonna = in.nextInt(); |
30 |
31 | // Inserimento giocata |
32 | game.set(riga,colonna,player); |
33 |
34 | // Visualizzo lo stato del tris |
35 | System.out.println(game.tostring()); |
36 |
37 | // Verifico se è presente un vincitore |
38 | String verifica = game.getWinner(); |
39 | if (verifica.equalsIgnoreCase( " VINCE IL GIOCATORE X " ) || verifica.equalsIgnoreCase( " VINCE IL GIOCATORE O " )) |
40 | { |
41 | // Il gioco termina se un giocatore vince la partita |
42 | System.out.println(verifica); |
43 | return ; |
44 | } |
45 |
46 | numGiocate++; |
47 | if (numGiocate== 9 ) |
48 | { |
49 | // Se il tris è pieno e non c'è vincitore, la partita termina |
50 | System.out.println( "NESSUN VINCITORE" ); |
51 | return ; |
52 | } |
53 |
54 | // Se ha giocato X allora dopo gioca O, altrimenti viceversa |
55 | if (player== "x" ) player = "o" ; |
56 | else player = "x" ; |
57 | } |
58 |
59 | } |
60 | } |
Cliccando qui è possibile scaricare il codice completo.