Skip to content
Snippets Groups Projects
TicTacToeFX.java 6.31 KiB
Newer Older
jan-schw's avatar
jan-schw committed
package com.example.tictactoe_game;

Marc Daginnus's avatar
Marc Daginnus committed
import javafx.application.Application;
import javafx.event.EventHandler;
jan-schw's avatar
jan-schw committed
import javafx.geometry.Pos;
Marc Daginnus's avatar
Marc Daginnus committed
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;
Marc Daginnus's avatar
Marc Daginnus committed
import javafx.stage.Stage;

public class TicTacToeFX extends Application {

jan-schw's avatar
jan-schw committed
    private final Button[][] buttons = new Button[3][3];

    private boolean isXTurn = true;

jan-schw's avatar
jan-schw committed
    private boolean isGameOver = false;

    private Text currentPlayer;

    private Text turnCounter;

    private int currentTurn = 0;

Marc Daginnus's avatar
Marc Daginnus committed
    @Override
    public void start(Stage primaryStage) {
jan-schw's avatar
jan-schw committed
        EventHandler<GameEvent> gameEventHandler = gameEvent -> {
jan-schw's avatar
jan-schw committed
            String currentPlayer = this.isXTurn ? "X" : "O";

            // Dialogfenster erstellen
jan-schw's avatar
jan-schw committed
            final Stage dialog = new Stage();
            dialog.initModality(Modality.APPLICATION_MODAL);
            dialog.initOwner(primaryStage);
jan-schw's avatar
jan-schw committed
            VBox dialogVbox = new VBox(20);
            dialogVbox.setAlignment(Pos.CENTER);
            if (gameEvent.getEventType() == GameEvent.VICTORY_EVENT) {
jan-schw's avatar
jan-schw committed
                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
Marc Daginnus's avatar
Marc Daginnus committed
        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));
Marc Daginnus's avatar
Marc Daginnus committed
            }
        }

        // Ereignisse für Sieg und Unentschieden hinzufügen
        grid.addEventHandler(GameEvent.VICTORY_EVENT, gameEventHandler);
        grid.addEventHandler(GameEvent.DRAW_EVENT, gameEventHandler);
Marc Daginnus's avatar
Marc Daginnus committed

        // 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);

Marc Daginnus's avatar
Marc Daginnus committed
        // Szene und Stage erstellen
jan-schw's avatar
jan-schw committed
        Scene scene1 = new Scene(vbox, 300, 400);
Marc Daginnus's avatar
Marc Daginnus committed
        primaryStage.setTitle("Tic-Tac-Toe");
        primaryStage.setScene(scene1);
Marc Daginnus's avatar
Marc Daginnus committed
        primaryStage.show();
Marc Daginnus's avatar
Marc Daginnus committed
    }

    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) {
jan-schw's avatar
jan-schw committed
        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()) {
jan-schw's avatar
jan-schw committed
                this.isGameOver = true;
                button.fireEvent(new GameEvent(GameEvent.VICTORY_EVENT));
jan-schw's avatar
jan-schw committed
            } else if (checkForDraw()) {
jan-schw's avatar
jan-schw committed
                this.isGameOver = true;
                button.fireEvent(new GameEvent(GameEvent.DRAW_EVENT));

            this.isXTurn = !this.isXTurn;
            currentPlayer.setText("Current Player: " + (isXTurn ? "X" : "O"));

jan-schw's avatar
jan-schw committed
    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();
jan-schw's avatar
jan-schw committed
            if (!text1.isEmpty() && text1.equals(text2) && text1.equals(text3)) {
jan-schw's avatar
jan-schw committed
        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();
jan-schw's avatar
jan-schw committed
            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();

jan-schw's avatar
jan-schw committed
        if (!upperLeftCorner.isEmpty() && upperLeftCorner.equals(center) && upperLeftCorner.equals(lowerRightCorner)) {
            return true;
        }

jan-schw's avatar
jan-schw committed
        if (!upperRightCorner.isEmpty() && upperRightCorner.equals(center) && upperRightCorner.equals(lowerLeftCorner)) {
            return true;
        }

        return false;
    }

jan-schw's avatar
jan-schw committed
    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;
    }

Marc Daginnus's avatar
Marc Daginnus committed
    public static void main(String[] args) {
        launch(args);
    }
}