diff --git a/src/Scene.fxml b/src/Scene.fxml index 612bd8cbca711e151512e687c11adb4296ba4f54..64dbcd2a1379a315f6e513ba72aeefee7a490b0e 100644 --- a/src/Scene.fxml +++ b/src/Scene.fxml @@ -27,19 +27,19 @@ <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> </rowConstraints> <children> - <Button fx:id="button1" text=" " mnemonicParsing="false" onAction="#handleButtonClick" prefHeight="133.0" prefWidth="142.0" GridPane.halignment="CENTER" GridPane.valignment="CENTER" GridPane.columnIndex="0" GridPane.rowIndex="0"/> - <Button fx:id="button2" text=" " layoutX="10.0" layoutY="10.0" mnemonicParsing="false" onAction="#handleButtonClick" prefHeight="133.0" prefWidth="142.0" GridPane.columnIndex="0" GridPane.rowIndex="1"/> - <Button fx:id="button3" text=" " layoutX="115.0" layoutY="10.0" mnemonicParsing="false" onAction="#handleButtonClick" prefHeight="133.0" prefWidth="142.0" GridPane.columnIndex="0" GridPane.rowIndex="2"/> - <Button fx:id="button4" text=" " layoutX="10.0" layoutY="10.0" mnemonicParsing="false" onAction="#handleButtonClick" prefHeight="133.0" prefWidth="142.0" GridPane.columnIndex="1" GridPane.rowIndex="0" /> - <Button fx:id="button5" text=" " layoutX="10.0" layoutY="10.0" mnemonicParsing="false" onAction="#handleButtonClick" prefHeight="133.0" prefWidth="142.0" GridPane.columnIndex="1" GridPane.rowIndex="1" /> - <Button fx:id="button6" text=" " layoutX="10.0" layoutY="10.0" mnemonicParsing="false" onAction="#handleButtonClick" prefHeight="133.0" prefWidth="142.0" GridPane.columnIndex="1" GridPane.rowIndex="2" /> - <Button fx:id="button7" text=" " layoutX="10.0" layoutY="10.0" mnemonicParsing="false" onAction="#handleButtonClick" prefHeight="133.0" prefWidth="142.0" GridPane.columnIndex="2" GridPane.rowIndex="0" /> - <Button fx:id="button8" text=" " layoutX="10.0" layoutY="10.0" mnemonicParsing="false" onAction="#handleButtonClick" prefHeight="133.0" prefWidth="142.0" GridPane.columnIndex="2" GridPane.rowIndex="1" /> - <Button fx:id="button9" text=" " layoutX="10.0" layoutY="10.0" mnemonicParsing="false" onAction="#handleButtonClick" prefHeight="133.0" prefWidth="142.0" GridPane.columnIndex="2" GridPane.rowIndex="2" /> + <Button fx:id="button1" mnemonicParsing="false" onAction="#handleButtonClick" prefHeight="133.0" prefWidth="142.0" text=" " GridPane.columnIndex="0" GridPane.halignment="CENTER" GridPane.rowIndex="0" GridPane.valignment="CENTER" /> + <Button fx:id="button2" layoutX="10.0" layoutY="10.0" mnemonicParsing="false" onAction="#handleButtonClick" prefHeight="133.0" prefWidth="142.0" text=" " GridPane.columnIndex="0" GridPane.rowIndex="1" /> + <Button fx:id="button3" layoutX="115.0" layoutY="10.0" mnemonicParsing="false" onAction="#handleButtonClick" prefHeight="133.0" prefWidth="142.0" text=" " GridPane.columnIndex="0" GridPane.rowIndex="2" /> + <Button fx:id="button4" layoutX="10.0" layoutY="10.0" mnemonicParsing="false" onAction="#handleButtonClick" prefHeight="133.0" prefWidth="142.0" text=" " GridPane.columnIndex="1" GridPane.rowIndex="0" /> + <Button fx:id="button5" layoutX="10.0" layoutY="10.0" mnemonicParsing="false" onAction="#handleButtonClick" prefHeight="133.0" prefWidth="142.0" text=" " GridPane.columnIndex="1" GridPane.rowIndex="1" /> + <Button fx:id="button6" layoutX="10.0" layoutY="10.0" mnemonicParsing="false" onAction="#handleButtonClick" prefHeight="133.0" prefWidth="142.0" text=" " GridPane.columnIndex="1" GridPane.rowIndex="2" /> + <Button fx:id="button7" layoutX="10.0" layoutY="10.0" mnemonicParsing="false" onAction="#handleButtonClick" prefHeight="133.0" prefWidth="142.0" text=" " GridPane.columnIndex="2" GridPane.rowIndex="0" /> + <Button fx:id="button8" layoutX="10.0" layoutY="10.0" mnemonicParsing="false" onAction="#handleButtonClick" prefHeight="133.0" prefWidth="142.0" text=" " GridPane.columnIndex="2" GridPane.rowIndex="1" /> + <Button fx:id="button9" layoutX="10.0" layoutY="10.0" mnemonicParsing="false" onAction="#handleButtonClick" prefHeight="133.0" prefWidth="142.0" text=" " GridPane.columnIndex="2" GridPane.rowIndex="2" /> </children> </GridPane> <Button layoutX="446.0" layoutY="170.0" mnemonicParsing="false" prefHeight="30.0" prefWidth="82.0" text="Restart" /> - <Label alignment="CENTER" contentDisplay="CENTER" layoutX="409.0" layoutY="263.0" prefHeight="30.0" prefWidth="156.0" text="Your Turn" textAlignment="CENTER"> + <Label fx:id="turnlabel" alignment="CENTER" contentDisplay="CENTER" layoutX="409.0" layoutY="263.0" prefHeight="30.0" prefWidth="156.0" text="Your Turn" textAlignment="CENTER"> <font> <Font name="Ink Free" size="25.0" /> </font> diff --git a/src/SceneController.java b/src/SceneController.java index d875c5c639082e4508a3493657c1c18c0b0154f7..3d67bf7a71f49b128a7a3a1f5efce68a76dd4c43 100644 --- a/src/SceneController.java +++ b/src/SceneController.java @@ -1,26 +1,64 @@ import javafx.fxml.FXML; import javafx.scene.control.Button; import javafx.event.ActionEvent; +import javafx.scene.control.Label; import javafx.scene.layout.GridPane; import logic.*; +import java.util.ArrayList; +import java.util.List; + public class SceneController { private Board board; private Actor player; private Actor enemy; + public boolean playerTurn = true; + public void initData(Board board, Actor player, Actor enemy) { this.board = board; this.player = player; this.enemy = enemy; } + public void playerTurn(){ + this.playerTurn = true; + turnlabel.setText("Your Turn"); + } + @FXML private GridPane gridPane; + @FXML + private Label turnlabel; + @FXML private Button button1, button2, button3, button4, button5, button6, button7, button8, button9; + @FXML + private List<Button> buttonList; + + @FXML + public void initialize() { + // Liste der Buttons erstellen und Buttons hinzufügen + buttonList = new ArrayList<>(); + buttonList.add(button1); + buttonList.add(button2); + buttonList.add(button3); + buttonList.add(button4); + buttonList.add(button5); + buttonList.add(button6); + buttonList.add(button7); + buttonList.add(button8); + buttonList.add(button9); + } + + public void aiTurn(int col, int row){ + initialize(); + buttonList.get(col + row).setText("o"); + playerTurn(); + } + // Diese Funktion wird beim Button-Click aufgerufen @FXML @@ -33,11 +71,15 @@ public class SceneController { int row = GridPane.getRowIndex(pressedButton); // Zeilen-Koordinate int col = GridPane.getColumnIndex(pressedButton); // Spalten-Koordinate - if(buttonText.equals(" ")) { + if(buttonText.equals(" ") && playerTurn) { // Setze X pressedButton.setText("X"); player.makeMove(board, col, row); + + // AI's Turn + playerTurn = false; + turnlabel.setText("AI's Turn"); } } diff --git a/src/TicTacToe.java b/src/TicTacToe.java index ae69f16b230533eadf0c2a3fcf5c19bc670a3f8c..0e6bd068002ae61e4744119dfb13c9a22381a997 100644 --- a/src/TicTacToe.java +++ b/src/TicTacToe.java @@ -10,6 +10,7 @@ public class TicTacToe extends Application { private static Board board; private static final Actor player = new Player(); private static final Actor enemy = new Enemy(); + private static SceneController sceneController; public void startGame(){ board = new Board(); @@ -24,8 +25,8 @@ public class TicTacToe extends Application { Parent root = loader.load(); // Controller-Instanz holen und initialisieren - SceneController controller = loader.getController(); - controller.initData(board, player, enemy); // Übergabe der Logik-Klassen + sceneController = loader.getController(); + sceneController.initData(board, player, enemy); // Übergabe der Logik-Klassen Scene scene = new Scene(root, 800, 600); primaryStage.setTitle("Tic Tac Toe"); @@ -35,13 +36,23 @@ public class TicTacToe extends Application { public static void main (String[] args) { - launch(args); TicTacToe game = new TicTacToe(); game.startGame(); + launch(args); + while (!board.checkForWin()){ + if (sceneController.playerTurn) { + // TODO Spieler ist am Zug + continue; + + } else { + // TODO Gegner ist am Zug + + + } // TODO Spielablauf } @@ -51,5 +62,6 @@ public class TicTacToe extends Application { // TODO Gewinner verkünden // TODO Option zum Neustart + } } diff --git a/src/logic/Actor.java b/src/logic/Actor.java index b8d643b52114b69ce690160affe99cc6c4518ad9..ded26e333faffc6c585e6c89129a791716b64175 100644 --- a/src/logic/Actor.java +++ b/src/logic/Actor.java @@ -1,14 +1,11 @@ package logic; +import java.util.Random; + public interface Actor { char symbol = '?'; public char getSymbol(); public void setSymbol(char symbol); - // Methode, um den nächsten Zug des Akteurs zu machen - default boolean makeMove(Board board, int x, int y) { - return board.placeToken(x, y, symbol); - } - } diff --git a/src/logic/Enemy.java b/src/logic/Enemy.java index 76a8ec0dd354caf19459aa36de0fe7cc5f7a6c06..215d22acb597b28c49eef8d0530dfbd771408d17 100644 --- a/src/logic/Enemy.java +++ b/src/logic/Enemy.java @@ -1,5 +1,7 @@ package logic; +import java.util.Random; + public class Enemy implements Actor { public char symbol; public Enemy() { @@ -16,5 +18,16 @@ public class Enemy implements Actor { this.symbol = symbol; } + // Methode, um den nächsten Zug des Akteurs zu machen + public boolean makeMove(Board board) { + Random random = new Random(); + int x; + int y; + do { + x = random.nextInt(3); + y = random.nextInt(3); + } while (!board.placeToken(x, y, symbol)); + return true; + } } diff --git a/src/logic/Player.java b/src/logic/Player.java index 2f0696484dd961f809662f8099df8e56d3af9ba6..1c5bf77e745029a2c80f14ededd6d56d0a0f7659 100644 --- a/src/logic/Player.java +++ b/src/logic/Player.java @@ -16,6 +16,10 @@ public class Player implements Actor { this.symbol = symbol; } + // Methode, um den nächsten Zug des Akteurs zu machen + public boolean makeMove(Board board, int x, int y) { + return board.placeToken(x, y, symbol); + } }