Vediamo un altro classico esercizio da realizzare con le interfacce grafiche e quindi la nostra JavaFX: il tris o, meglio noto in inglese, tic tac toe. Il gioco è molto semplice, a turno è pronto un giocatore con uno dei simboli X o O che clicca una delle caselle disponibili. Un messaggio in basso deve avvisare del turno ed eventualmente della vittoria. Realizziamo anche una barra menu con una voce per resettare una nuova partita, annullare l’ultima mossa fatta, visualizzare una informativa del software.

SceneBuilder e FXML
La realizzazione grafica del campo di gioco è sempre molto personalizzabile. Ci si può orientare con un GridPane o realzizare una griglia manuale su Pane semplice. Qui abbiamo scelto la seconda soluzione. Come sempre, prevedete accuratamente tutti gli elementi che devono interagire con il codice, assegnandogli un fx:id ed eventualmente un evento. Nel nostro caso dobbiamo scatenare del codice quando vengono cliccate le label disposte sul piano di gioco quindi sceglieremo un nome di funzione per l’evento “On mouse clicked“


<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.control.Separator?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<VBox alignment="CENTER" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1" fx:controller="iis.tris.Controller">
<children>
<MenuBar prefHeight="27.0" prefWidth="600.0" VBox.vgrow="ALWAYS">
<menus>
<Menu mnemonicParsing="false" text="File">
<items>
<MenuItem mnemonicParsing="false" onAction="#nuovapartita" text="Nuova partita" />
<MenuItem mnemonicParsing="false" onAction="#chiudi" text="Chiudi" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Modifica">
<items>
<MenuItem fx:id="btnAnnulla" mnemonicParsing="false" onAction="#annulla" text="Annulla ultima mossa" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Aiuto">
<items>
<MenuItem fx:id="btnInfo" mnemonicParsing="false" onAction="#info" text="Informazioni su Tris" />
</items>
</Menu>
</menus>
</MenuBar>
<Pane prefHeight="441.0" prefWidth="600.0">
<children>
<Separator layoutX="45.0" layoutY="120.0" prefHeight="1.0" prefWidth="500.0" />
<Separator layoutX="45.0" layoutY="220.0" prefHeight="1.0" prefWidth="500.0" />
<Separator layoutX="209.0" layoutY="20.0" orientation="VERTICAL" prefHeight="300.0" />
<Separator layoutX="390.0" layoutY="20.0" orientation="VERTICAL" prefHeight="300.0" />
<Label fx:id="casella0" alignment="CENTER" layoutX="70.0" layoutY="20.0" onMouseClicked="#click0" prefHeight="100.0" prefWidth="100.0" text="cliccami" textAlignment="CENTER" />
<Label fx:id="casella3" alignment="CENTER" layoutX="70.0" layoutY="120.0" onMouseClicked="#click3" prefHeight="100.0" prefWidth="100.0" text="cliccami" textAlignment="CENTER" />
<Label fx:id="casella6" alignment="CENTER" layoutX="70.0" layoutY="220.0" onMouseClicked="#click6" prefHeight="100.0" prefWidth="100.0" text="cliccami" textAlignment="CENTER" />
<Label fx:id="casella1" alignment="CENTER" layoutX="252.0" layoutY="20.0" onMouseClicked="#click1" prefHeight="100.0" prefWidth="100.0" text="cliccami" textAlignment="CENTER" />
<Label fx:id="casella2" alignment="CENTER" layoutX="420.0" layoutY="20.0" onMouseClicked="#click2" prefHeight="100.0" prefWidth="100.0" text="cliccami" textAlignment="CENTER" />
<Label fx:id="casella4" alignment="CENTER" layoutX="252.0" layoutY="120.0" onMouseClicked="#click4" prefHeight="100.0" prefWidth="100.0" text="cliccami" textAlignment="CENTER" />
<Label fx:id="casella5" alignment="CENTER" layoutX="420.0" layoutY="120.0" onMouseClicked="#click5" prefHeight="100.0" prefWidth="100.0" text="cliccami" textAlignment="CENTER" />
<Label fx:id="casella7" alignment="CENTER" layoutX="252.0" layoutY="220.0" onMouseClicked="#click7" prefHeight="100.0" prefWidth="100.0" text="cliccami" textAlignment="CENTER" />
<Label fx:id="casella8" alignment="CENTER" layoutX="423.0" layoutY="220.0" onMouseClicked="#click8" prefHeight="100.0" prefWidth="100.0" text="cliccami" textAlignment="CENTER" />
</children>
</Pane>
<Label fx:id="lblMessaggio" alignment="CENTER" minHeight="40.0" prefWidth="600.0" style="-fx-background-color: #fcfcfcfc;" text="Benvenuto! Comincia il giocatore O" textAlignment="CENTER">
<font>
<Font name="System Bold" size="13.0" />
</font>
</Label>
</children>
</VBox>
Per la finestrella delle informazioni predisponiamo un altro fxml, molto semplice con un singolo Pane a cui aggiungiamo una immagine e delle semplici label che conterranno il testo statico.

Il suo codice per importare in un nuovo progetto.
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.text.Font?>
<Pane xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1">
<children>
<AnchorPane prefHeight="200.0" prefWidth="500.0">
<children>
<ImageView fitHeight="150.0" fitWidth="200.0" layoutX="21.0" layoutY="25.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@img/pngwing.com.png" />
</image>
</ImageView>
<Label layoutX="250.0" layoutY="25.0" prefHeight="18.0" prefWidth="200.0" text="Tris JavaFX">
<font>
<Font name="System Bold" size="20.0" />
</font>
</Label>
<Label layoutX="250.0" layoutY="67.0" prefHeight="18.0" prefWidth="194.0" text="Versione 1.0" />
<Label layoutX="250.0" layoutY="100.0" text="Realizzato da prof. Alfredo Centinaro" />
<Label layoutX="250.0" layoutY="132.0" text="Anno Scolasico 2022/23" />
</children>
</AnchorPane>
</children>
</Pane>
Le classi Modello: Casella e Tavolo
Come ogni applicazione che si rispetti, la GUI è solo una interfaccia più o meno complessa per interagire con l’utente. Il vero cuore del software deve risiedere altrove, nel nostro caso, dentro delle classi. Lo sforzo che deve farei lprogrammatore in erba è individuare come trasferire la realtà del software o gioco in opportune classi. In realtà per noi in questo caso è molto facile: abbiamo una serie di caselle dove inserire i simboli dei giocatori ed un tavolo che deve contenere le caselle con un array e gestire i turni dei giocatori.
package iis.tris;
public enum Scelta {Vuota, X, O}
package iis.tris;
public enum Turno {Giocatore_X, Giocatore_O}
package iis.tris;
public class Casella
{
private int numero;
private Scelta scelta;
public Casella(int numero, Scelta scelta)
{
this.numero = numero;
this.scelta = scelta;
}
public Casella(int numero)
{
this.numero = numero;
this.scelta = Scelta.Vuota;
}
public int getNumero() {
return numero;
}
public void setNumero(int numero) {
this.numero = numero;
}
public Scelta getScelta() {
return scelta;
}
public void setScelta(Scelta scelta) {
this.scelta = scelta;
}
}
Leggermente più complesso il tavolo che ha tutto per far funzionare il nostro gioco Un attributo per gestire l’array di caselle, una varibile di storico per capire quale sia l’ultima casella selzionata/cliccata, un enum per gestire il turno. Ovviamente abbiamo tutti i metodi per capire se c’è un tris di un simbolo piuttosto che l’altro, individuare quale sia il simbolo vincitore, un metodo per resettare tutto e fare quindi una nuova partita fino segnalare l’ultima mossa. I metodi per determinare vincitore e tris possono essre indubbiamente ottimizzati, li lasciamo nella loro forme più intutitiva.
package iis.tris;
import java.util.ArrayList;
public class Tavolo
{
private ArrayList<Casella> tavolo;
private int ultimaCarta;
private Turno turno;
public Tavolo()
{
this.tavolo = new ArrayList<>();
this.turno = Turno.Giocatore_O;
this.ultimaCarta = -1;
}
public int getUltimaCarta() {
return ultimaCarta;
}
public void setUltimaCarta(int ultimaCarta) {
this.ultimaCarta = ultimaCarta;
}
public Turno getTurno() {
return turno;
}
public void setTurno(Turno turno) {
this.turno = turno;
}
public Casella get(int i)
{
return this.tavolo.get(i);
}
public void inserisci(Casella c)
{
this.tavolo.add(c);
}
/*
* La caselle sono disposte come segue
* 0 1 2
* 3 4 5
* 6 7 8
*/
public boolean controllaVincitore()
{
//Controllo le righe
if(tavolo.get(0).getScelta() == tavolo.get(1).getScelta() &&
tavolo.get(0).getScelta() == tavolo.get(2).getScelta() &&
tavolo.get(0).getScelta() != Scelta.Vuota)
return true;
if(tavolo.get(3).getScelta() == tavolo.get(4).getScelta() &&
tavolo.get(3).getScelta() == tavolo.get(5).getScelta()&&
tavolo.get(3).getScelta() != Scelta.Vuota)
return true;
if(tavolo.get(6).getScelta() == tavolo.get(7).getScelta() &&
tavolo.get(6).getScelta() == tavolo.get(8).getScelta() &&
tavolo.get(6).getScelta() != Scelta.Vuota)
return true;
//Controllo le colonne
if(tavolo.get(0).getScelta() == tavolo.get(3).getScelta() &&
tavolo.get(0).getScelta() == tavolo.get(6).getScelta()&&
tavolo.get(0).getScelta() != Scelta.Vuota)
return true;
if(tavolo.get(1).getScelta() == tavolo.get(4).getScelta() &&
tavolo.get(1).getScelta() == tavolo.get(7).getScelta()&&
tavolo.get(1).getScelta() != Scelta.Vuota)
return true;
if(tavolo.get(2).getScelta() == tavolo.get(5).getScelta() &&
tavolo.get(2).getScelta() == tavolo.get(8).getScelta()&&
tavolo.get(2).getScelta() != Scelta.Vuota)
return true;
//Controllo le diagonali
if(tavolo.get(2).getScelta() == tavolo.get(4).getScelta() &&
tavolo.get(2).getScelta() == tavolo.get(6).getScelta()&&
tavolo.get(2).getScelta() != Scelta.Vuota)
return true;
if(tavolo.get(0).getScelta() == tavolo.get(4).getScelta() &&
tavolo.get(0).getScelta() == tavolo.get(8).getScelta()&&
tavolo.get(0).getScelta() != Scelta.Vuota)
return true;
return false;
}
public Scelta vincitore()
{
//Controllo le righe
if(tavolo.get(0).getScelta() == tavolo.get(1).getScelta() &&
tavolo.get(0).getScelta() == tavolo.get(2).getScelta())
return tavolo.get(0).getScelta();
if(tavolo.get(3).getScelta() == tavolo.get(4).getScelta() &&
tavolo.get(3).getScelta() == tavolo.get(5).getScelta())
return tavolo.get(3).getScelta();
if(tavolo.get(6).getScelta() == tavolo.get(7).getScelta() &&
tavolo.get(6).getScelta() == tavolo.get(8).getScelta())
return tavolo.get(6).getScelta();
//Controllo le colonne
if(tavolo.get(0).getScelta() == tavolo.get(3).getScelta() &&
tavolo.get(0).getScelta() == tavolo.get(6).getScelta())
return tavolo.get(0).getScelta();
if(tavolo.get(1).getScelta() == tavolo.get(4).getScelta() &&
tavolo.get(1).getScelta() == tavolo.get(7).getScelta())
return tavolo.get(1).getScelta();
if(tavolo.get(2).getScelta() == tavolo.get(5).getScelta() &&
tavolo.get(2).getScelta() == tavolo.get(8).getScelta())
return tavolo.get(2).getScelta();
//Controllo le diagonali
if(tavolo.get(2).getScelta() == tavolo.get(4).getScelta() &&
tavolo.get(2).getScelta() == tavolo.get(6).getScelta())
return tavolo.get(2).getScelta();
if(tavolo.get(0).getScelta() == tavolo.get(4).getScelta() &&
tavolo.get(0).getScelta() == tavolo.get(8).getScelta())
return tavolo.get(0).getScelta();
return Scelta.Vuota;
}
public void nuovaPartita()
{
for(int i=0; i < this.tavolo.size(); i++)
{
tavolo.get(i).setScelta(Scelta.Vuota);
}
}
public void annullaUltima()
{
if (this.ultimaCarta != -1)
{
this.tavolo.get(ultimaCarta).setScelta(Scelta.Vuota);
}
}
}
Controller
Il controller è l’altra classe interessante che poi gestisce il gioco con le due classi appena viste. Ricordate si impostarlo da SceneBuilder o da file FXML. Il canovaccio dellla classe lo possiamo copiare sempre da SceneBuilder e dal menù view-> Show sample template Skeleton. Ci saranno già attributi e metodi che abbiamo nominato nello scene builder. Il gioco in questo caso non è complesso. Basta scrivere i lcoice per una delle caselle e replicaro in sostanza nelle altre.
Si tratta di controllare se la casella cliccata sia vuota o abbia già un simbolo stampato. Se “vuota” a seconda del turno del giocatore, inserisco o meno il simbolo corrispondente, imposto uno stile grafico gradevole con dimensione e colore, aggiorno il vettore del tavolo che è stato inserito un simbolo e scambio quindi la varibile turno sempre del tavolo. Fatto questo, ad ogni click quindi controllo se c’è un vincitore e vado quindi ad aggiornare l’etichetts del nostro tavolo. Metto anch il valore dell’ultima carta dentro la variabile storico del tavolo.
@FXML
void click0(MouseEvent event)
{
if (this.tavolo.get(0).getScelta() != Scelta.Vuota)
return;
if (this.tavolo.getTurno() == Turno.Giocatore_O)
{
casella0.setText("O");
casella0.setStyle("-fx-text-fill:RED; -fx-font-size: 60;");
this.tavolo.get(0).setScelta(Scelta.O);
this.tavolo.setTurno(Turno.Giocatore_X);
}
else
{
casella0.setText("X");
casella0.setStyle("-fx-text-fill:BLUE; -fx-font-size: 60;");
this.tavolo.get(0).setScelta(Scelta.X);
this.tavolo.setTurno(Turno.Giocatore_O);
}
if (this.tavolo.controllaVincitore())
{
this.lblMessaggio.setText("Giocatore " + this.tavolo.vincitore() + " ha vinto!" );
}
else
this.lblMessaggio.setText("E' il turno di " + this.tavolo.getTurno());
tavolo.setUltimaCarta(0);
}
Gli altri metodi annulla, chiudi, info, nuova partita sono abbastanza intutivi. Il listato completo segue.
package iis.tris;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.MenuItem;
import javafx.scene.input.InputMethodEvent;
import javafx.scene.input.MouseEvent;
import javafx.stage.Stage;
public class Controller {
private Tavolo tavolo;
@FXML
private ResourceBundle resources;
@FXML
private URL location;
@FXML
private MenuItem btnAnnulla;
@FXML
private MenuItem btnInfo;
@FXML
private Label casella0;
@FXML
private Label casella1;
@FXML
private Label casella2;
@FXML
private Label casella3;
@FXML
private Label casella4;
@FXML
private Label casella5;
@FXML
private Label casella6;
@FXML
private Label casella7;
@FXML
private Label casella8;
@FXML
private Label lblMessaggio;
@FXML
void annulla(ActionEvent event) {
int ultima = this.tavolo.getUltimaCarta();
switch(ultima)
{
case 0:
casella0.setText("");
this.tavolo.get(0).setScelta(Scelta.Vuota);
break;
case 1:
casella1.setText("");
this.tavolo.get(1).setScelta(Scelta.Vuota);
break;
case 2:
casella2.setText("");
this.tavolo.get(2).setScelta(Scelta.Vuota);
break;
case 3:
casella3.setText("");
this.tavolo.get(3).setScelta(Scelta.Vuota);
break;
case 4:
casella4.setText("");
this.tavolo.get(4).setScelta(Scelta.Vuota);
break;
case 5:
casella5.setText("");
this.tavolo.get(5).setScelta(Scelta.Vuota);
break;
case 6:
casella6.setText("");
this.tavolo.get(6).setScelta(Scelta.Vuota);
break;
case 7:
casella7.setText("");
this.tavolo.get(7).setScelta(Scelta.Vuota);
break;
case 8:
casella8.setText("");
this.tavolo.get(8).setScelta(Scelta.Vuota);
break;
}
//scambio il turno
if (this.tavolo.getTurno() == Turno.Giocatore_O)
this.tavolo.setTurno(Turno.Giocatore_X);
else
this.tavolo.setTurno(Turno.Giocatore_O);
}
@FXML
void chiudi(ActionEvent event) {
System.exit(0);
}
@FXML
void click0(MouseEvent event)
{
if (this.tavolo.get(0).getScelta() != Scelta.Vuota)
return;
if (this.tavolo.getTurno() == Turno.Giocatore_O)
{
casella0.setText("O");
casella0.setStyle("-fx-text-fill:RED; -fx-font-size: 60;");
this.tavolo.get(0).setScelta(Scelta.O);
this.tavolo.setTurno(Turno.Giocatore_X);
}
else
{
casella0.setText("X");
casella0.setStyle("-fx-text-fill:BLUE; -fx-font-size: 60;");
this.tavolo.get(0).setScelta(Scelta.X);
this.tavolo.setTurno(Turno.Giocatore_O);
}
if (this.tavolo.controllaVincitore())
{
this.lblMessaggio.setText("Giocatore " + this.tavolo.vincitore() + " ha vinto!" );
}
else
this.lblMessaggio.setText("E' il turno di " + this.tavolo.getTurno());
tavolo.setUltimaCarta(0);
}
@FXML
void click1(MouseEvent event)
{
if (this.tavolo.get(1).getScelta() != Scelta.Vuota)
return;
if (this.tavolo.getTurno() == Turno.Giocatore_O)
{
casella1.setText("O");
casella1.setStyle("-fx-text-fill:RED; -fx-font-size: 60;");
this.tavolo.get(1).setScelta(Scelta.O);
this.tavolo.setTurno(Turno.Giocatore_X);
}
else
{
casella1.setText("X");
casella1.setStyle("-fx-text-fill:BLUE; -fx-font-size: 60;");
this.tavolo.get(1).setScelta(Scelta.X);
this.tavolo.setTurno(Turno.Giocatore_O);
}
if (this.tavolo.controllaVincitore())
{
this.lblMessaggio.setText("Giocatore " + this.tavolo.vincitore() + " ha vinto!" );
}
else
this.lblMessaggio.setText("E' il turno di " + this.tavolo.getTurno());
tavolo.setUltimaCarta(1);
}
@FXML
void click2(MouseEvent event)
{
if (this.tavolo.get(2).getScelta() != Scelta.Vuota)
return;
if (this.tavolo.getTurno() == Turno.Giocatore_O)
{
casella2.setText("O");
casella2.setStyle("-fx-text-fill:RED; -fx-font-size: 60;");
this.tavolo.get(2).setScelta(Scelta.O);
this.tavolo.setTurno(Turno.Giocatore_X);
}
else
{
casella2.setText("X");
casella2.setStyle("-fx-text-fill:BLUE; -fx-font-size: 60;");
this.tavolo.get(2).setScelta(Scelta.X);
this.tavolo.setTurno(Turno.Giocatore_O);
}
if (this.tavolo.controllaVincitore())
{
this.lblMessaggio.setText("Giocatore " + this.tavolo.vincitore() + " ha vinto!" );
}
else
this.lblMessaggio.setText("E' il turno di " + this.tavolo.getTurno());
tavolo.setUltimaCarta(2);
}
@FXML
void click3(MouseEvent event)
{
if (this.tavolo.get(3).getScelta() != Scelta.Vuota)
return;
if (this.tavolo.getTurno() == Turno.Giocatore_O)
{
casella3.setText("O");
casella3.setStyle("-fx-text-fill:RED; -fx-font-size: 60;");
this.tavolo.get(3).setScelta(Scelta.O);
this.tavolo.setTurno(Turno.Giocatore_X);
}
else
{
casella3.setText("X");
casella3.setStyle("-fx-text-fill:BLUE; -fx-font-size: 60;");
this.tavolo.get(3).setScelta(Scelta.X);
this.tavolo.setTurno(Turno.Giocatore_O);
}
if (this.tavolo.controllaVincitore())
{
this.lblMessaggio.setText("Giocatore " + this.tavolo.vincitore() + " ha vinto!" );
}
else
this.lblMessaggio.setText("E' il turno di " + this.tavolo.getTurno());
tavolo.setUltimaCarta(3);
}
@FXML
void click4(MouseEvent event)
{
if (this.tavolo.get(4).getScelta() != Scelta.Vuota)
return;
if (this.tavolo.getTurno() == Turno.Giocatore_O)
{
casella4.setText("O");
casella4.setStyle("-fx-text-fill:RED; -fx-font-size: 60;");
this.tavolo.get(4).setScelta(Scelta.O);
this.tavolo.setTurno(Turno.Giocatore_X);
}
else
{
casella4.setText("X");
casella4.setStyle("-fx-text-fill:BLUE; -fx-font-size: 60;");
this.tavolo.get(4).setScelta(Scelta.X);
this.tavolo.setTurno(Turno.Giocatore_O);
}
if (this.tavolo.controllaVincitore())
{
this.lblMessaggio.setText("Giocatore " + this.tavolo.vincitore() + " ha vinto!" );
}
else
this.lblMessaggio.setText("E' il turno di " + this.tavolo.getTurno());
tavolo.setUltimaCarta(4);
}
@FXML
void click5(MouseEvent event)
{
if (this.tavolo.get(5).getScelta() != Scelta.Vuota)
return;
if (this.tavolo.getTurno() == Turno.Giocatore_O)
{
casella5.setText("O");
casella5.setStyle("-fx-text-fill:RED; -fx-font-size: 60;");
this.tavolo.get(5).setScelta(Scelta.O);
this.tavolo.setTurno(Turno.Giocatore_X);
}
else
{
casella5.setText("X");
casella5.setStyle("-fx-text-fill:BLUE; -fx-font-size: 60;");
this.tavolo.get(5).setScelta(Scelta.X);
this.tavolo.setTurno(Turno.Giocatore_O);
}
if (this.tavolo.controllaVincitore())
{
this.lblMessaggio.setText("Giocatore " + this.tavolo.vincitore() + " ha vinto!" );
}
else
this.lblMessaggio.setText("E' il turno di " + this.tavolo.getTurno());
tavolo.setUltimaCarta(5);
}
@FXML
void click6(MouseEvent event)
{
if (this.tavolo.get(6).getScelta() != Scelta.Vuota)
return;
if (this.tavolo.getTurno() == Turno.Giocatore_O)
{
casella6.setText("O");
casella6.setStyle("-fx-text-fill:RED; -fx-font-size: 60;");
this.tavolo.get(6).setScelta(Scelta.O);
this.tavolo.setTurno(Turno.Giocatore_X);
}
else
{
casella6.setText("X");
casella6.setStyle("-fx-text-fill:BLUE; -fx-font-size: 60;");
this.tavolo.get(6).setScelta(Scelta.X);
this.tavolo.setTurno(Turno.Giocatore_O);
}
if (this.tavolo.controllaVincitore())
{
this.lblMessaggio.setText("Giocatore " + this.tavolo.vincitore() + " ha vinto!" );
}
else
this.lblMessaggio.setText("E' il turno di " + this.tavolo.getTurno());
tavolo.setUltimaCarta(6);
}
@FXML
void click7(MouseEvent event)
{
if (this.tavolo.get(7).getScelta() != Scelta.Vuota)
return;
if (this.tavolo.getTurno() == Turno.Giocatore_O)
{
casella7.setText("O");
casella7.setStyle("-fx-text-fill:RED; -fx-font-size: 60;");
this.tavolo.get(7).setScelta(Scelta.O);
this.tavolo.setTurno(Turno.Giocatore_X);
}
else
{
casella7.setText("X");
casella7.setStyle("-fx-text-fill:BLUE; -fx-font-size: 60;");
this.tavolo.get(7).setScelta(Scelta.X);
this.tavolo.setTurno(Turno.Giocatore_O);
}
if (this.tavolo.controllaVincitore())
{
this.lblMessaggio.setText("Giocatore " + this.tavolo.vincitore() + " ha vinto!" );
}
else
this.lblMessaggio.setText("E' il turno di " + this.tavolo.getTurno());
tavolo.setUltimaCarta(7);
}
@FXML
void click8(MouseEvent event)
{
if (this.tavolo.get(8).getScelta() != Scelta.Vuota)
return;
if (this.tavolo.getTurno() == Turno.Giocatore_O)
{
casella8.setText("O");
casella8.setStyle("-fx-text-fill:RED; -fx-font-size: 60;");
this.tavolo.get(8).setScelta(Scelta.O);
this.tavolo.setTurno(Turno.Giocatore_X);
}
else
{
casella8.setText("X");
casella8.setStyle("-fx-text-fill:BLUE; -fx-font-size: 60;");
this.tavolo.get(8).setScelta(Scelta.X);
this.tavolo.setTurno(Turno.Giocatore_O);
}
if (this.tavolo.controllaVincitore())
{
this.lblMessaggio.setText("Giocatore " + this.tavolo.vincitore() + " ha vinto!" );
}
else
this.lblMessaggio.setText("E' il turno di " + this.tavolo.getTurno());
tavolo.setUltimaCarta(8);
}
@FXML
void info(ActionEvent event) throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(TrisApplication.class.getResource("info.fxml"));
Scene scene = new Scene(fxmlLoader.load(), 500 , 200);
Stage stage = new Stage();
stage.setTitle("Info JavaFX");
stage.setScene(scene);
stage.show();
}
@FXML
void nuovapartita(ActionEvent event)
{
this.tavolo.nuovaPartita();
casella0.setText("");
casella1.setText("");
casella2.setText("");
casella3.setText("");
casella4.setText("");
casella5.setText("");
casella6.setText("");
casella7.setText("");
casella8.setText("");
}
@FXML
void initialize() {
assert btnAnnulla != null : "fx:id=\"btnAnnulla\" was not injected: check your FXML file 'tris-view.fxml'.";
assert btnInfo != null : "fx:id=\"btnInfo\" was not injected: check your FXML file 'tris-view.fxml'.";
assert casella0 != null : "fx:id=\"casella0\" was not injected: check your FXML file 'tris-view.fxml'.";
assert casella1 != null : "fx:id=\"casella1\" was not injected: check your FXML file 'tris-view.fxml'.";
assert casella2 != null : "fx:id=\"casella2\" was not injected: check your FXML file 'tris-view.fxml'.";
assert casella3 != null : "fx:id=\"casella3\" was not injected: check your FXML file 'tris-view.fxml'.";
assert casella4 != null : "fx:id=\"casella4\" was not injected: check your FXML file 'tris-view.fxml'.";
assert casella5 != null : "fx:id=\"casella5\" was not injected: check your FXML file 'tris-view.fxml'.";
assert casella6 != null : "fx:id=\"casella6\" was not injected: check your FXML file 'tris-view.fxml'.";
assert casella7 != null : "fx:id=\"casella7\" was not injected: check your FXML file 'tris-view.fxml'.";
assert casella8 != null : "fx:id=\"casella8\" was not injected: check your FXML file 'tris-view.fxml'.";
this.tavolo = new Tavolo();
this.tavolo.inserisci(new Casella(0, Scelta.Vuota));
this.tavolo.inserisci(new Casella(1, Scelta.Vuota));
this.tavolo.inserisci(new Casella(2, Scelta.Vuota));
this.tavolo.inserisci(new Casella(3, Scelta.Vuota));
this.tavolo.inserisci(new Casella(4, Scelta.Vuota));
this.tavolo.inserisci(new Casella(5, Scelta.Vuota));
this.tavolo.inserisci(new Casella(6, Scelta.Vuota));
this.tavolo.inserisci(new Casella(7, Scelta.Vuota));
this.tavolo.inserisci(new Casella(8, Scelta.Vuota));
this.tavolo.setTurno(Turno.Giocatore_O); //TO DO: imposta giocatore iniziale casuale
}
}
Application
Listati ed eseguibile
Trovate i listati completi su GitHub -> qui
Il file JAR eseguibile su ogni piattaforma Win/Linux/mac -> qui
Ultima modifica 26 Maggio 2023