diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000000000000000000000000000000000000..2520c752367f7ad06a2838ab1d048b1380296e6f --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,8 @@ +<component name="InspectionProjectProfileManager"> + <profile version="1.0"> + <option name="myName" value="Project Default" /> + <inspection_tool class="TrivialIf" enabled="true" level="WARNING" enabled_by_default="true"> + <option name="ignoreChainedIf" value="true" /> + </inspection_tool> + </profile> +</component> \ No newline at end of file diff --git a/src/main/java/com/example/tictactoe_game/GameEvent.java b/src/main/java/com/example/tictactoe_game/GameEvent.java new file mode 100644 index 0000000000000000000000000000000000000000..188dab95950a6a25b90d612a3a71c478ad8fe9c9 --- /dev/null +++ b/src/main/java/com/example/tictactoe_game/GameEvent.java @@ -0,0 +1,13 @@ +package com.example.tictactoe_game; + +import javafx.event.Event; +import javafx.event.EventType; + +public class GameEvent extends Event { + public static final EventType<GameEvent> VICTORY_EVENT = new EventType<>("VICTORY_EVENT"); + public static final EventType<GameEvent> DRAW_EVENT = new EventType<>("DRAW_EVENT"); + + public GameEvent(EventType<? extends Event> eventType) { + super(eventType); + } +} diff --git a/src/main/java/com/example/tictactoe_game/TicTacToeFX.java b/src/main/java/com/example/tictactoe_game/TicTacToeFX.java index 8683ae6c05b341b058f0e4360bb5876a9d6e33aa..541023a671656b878999b91e74471650867d20c4 100644 --- a/src/main/java/com/example/tictactoe_game/TicTacToeFX.java +++ b/src/main/java/com/example/tictactoe_game/TicTacToeFX.java @@ -1,32 +1,194 @@ 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) { - // Erstelle das Spielfeld + + 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); // Größe der Buttons - grid.add(button, col, row); // Hinzufügen zum Grid + 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 scene = new Scene(grid, 300, 300); // Größe der Szene + Scene scene1 = new Scene(vbox, 300, 400); primaryStage.setTitle("Tic-Tac-Toe"); - primaryStage.setScene(scene); + 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) {