package com.example.tictactoe_game; import javafx.application.Application; import javafx.event.EventHandler; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.GridPane; import javafx.scene.layout.VBox; import javafx.scene.text.Text; import javafx.stage.Modality; import javafx.stage.Stage; public class TicTacToeFX extends Application { private final Button[][] buttons = new Button[3][3]; private boolean isXTurn = true; private boolean isGameOver = false; private Text currentPlayer; private Text turnCounter; private int currentTurn = 0; @Override public void start(Stage primaryStage) { EventHandler<GameEvent> gameEventHandler = gameEvent -> { String currentPlayer = this.isXTurn ? "X" : "O"; // Dialogfenster erstellen final Stage dialog = new Stage(); dialog.initModality(Modality.APPLICATION_MODAL); dialog.initOwner(primaryStage); VBox dialogVbox = new VBox(20); dialogVbox.setAlignment(Pos.CENTER); // Dialogtexte if (gameEvent.getEventType() == GameEvent.VICTORY_EVENT) { dialogVbox.getChildren().add(new Text("This is a victory for player " + currentPlayer + " in turn " + this.currentTurn + "!")); } else if (gameEvent.getEventType() == GameEvent.DRAW_EVENT) { dialogVbox.getChildren().add(new Text("This is a Draw!")); } // Schaltfläche "Schließen" Button closeButton = new Button("Close"); closeButton.setOnAction(event -> primaryStage.close()); dialogVbox.getChildren().add(closeButton); //Schaltfläche "Restart" Button restartButton = new Button("Restart"); restartButton.setOnAction(event -> { restartGame(); dialog.close(); }); dialogVbox.getChildren().add(restartButton); Scene dialogScene = new Scene(dialogVbox, 300, 200); dialog.setScene(dialogScene); dialog.show(); }; // Spielbrett erstellen GridPane grid = new GridPane(); // 3x3 Buttons hinzufügen for (int row = 0; row < 3; row++) { for (int col = 0; col < 3; col++) { Button button = new Button(); button.setPrefSize(100, 100); grid.add(button, col, row); buttons[row][col] = button; button.setOnAction(event -> handleButtonClick(button)); } } // Ereignisse für Sieg und Unentschieden hinzufügen grid.addEventHandler(GameEvent.VICTORY_EVENT, gameEventHandler); grid.addEventHandler(GameEvent.DRAW_EVENT, gameEventHandler); // Texte für aktuellen Spieler und Züge currentPlayer = new Text("Current Player: " + (isXTurn ? "X" : "O")); turnCounter = new Text("Current Turn: " + currentTurn); // Elemente dem Spielfeld hinzufügen Button restartButton = new Button("Restart"); restartButton.setOnAction(event -> restartGame()); VBox vbox = new VBox(10); vbox.setAlignment(Pos.CENTER); vbox.getChildren().addAll(grid, currentPlayer, turnCounter, restartButton); // Szene und Stage erstellen Scene scene1 = new Scene(vbox, 300, 400); primaryStage.setTitle("Tic-Tac-Toe"); primaryStage.setScene(scene1); primaryStage.show(); } private void restartGame(){ isXTurn = true; isGameOver = false; currentTurn = 0; currentPlayer.setText("Current Player: X"); turnCounter.setText("Current Turn: 0"); for(int i = 0; i < 3; i++){ for(int j = 0; j < 3; j++){ buttons[i][j].setText(""); } } } private void handleButtonClick(Button button) { if (button.getText().isEmpty() && !this.isGameOver) { if (this.isXTurn) { button.setText("X"); this.currentTurn++; } else { button.setText("O"); } turnCounter.setText("Current Turn: " + currentTurn); if (checkForWin()) { this.isGameOver = true; button.fireEvent(new GameEvent(GameEvent.VICTORY_EVENT)); } else if (checkForDraw()) { this.isGameOver = true; button.fireEvent(new GameEvent(GameEvent.DRAW_EVENT)); } this.isXTurn = !this.isXTurn; currentPlayer.setText("Current Player: " + (isXTurn ? "X" : "O")); } } private boolean checkForWin() { for (int row = 0; row < 3; row++) { String text1 = buttons[row][0].getText(); String text2 = buttons[row][1].getText(); String text3 = buttons[row][2].getText(); if (!text1.isEmpty() && text1.equals(text2) && text1.equals(text3)) { return true; } } for (int col = 0; col < 3; col++) { String text1 = buttons[0][col].getText(); String text2 = buttons[1][col].getText(); String text3 = buttons[2][col].getText(); if (!text1.isEmpty() && text1.equals(text2) && text1.equals(text3)) { return true; } } String upperLeftCorner = buttons[0][0].getText(); String center = buttons[1][1].getText(); String lowerRightCorner = buttons[2][2].getText(); String upperRightCorner = buttons[0][2].getText(); String lowerLeftCorner = buttons[2][0].getText(); if (!upperLeftCorner.isEmpty() && upperLeftCorner.equals(center) && upperLeftCorner.equals(lowerRightCorner)) { return true; } if (!upperRightCorner.isEmpty() && upperRightCorner.equals(center) && upperRightCorner.equals(lowerLeftCorner)) { return true; } return false; } private boolean checkForDraw() { for (int row = 0; row < 3; row++) { for (int col = 0; col < 3; col++) { if (buttons[row][col].getText().isEmpty()) { return false; } } } return true; } public static void main(String[] args) { launch(args); } }