Skip to content
Snippets Groups Projects
Commit fa55b4a5 authored by Jan Peter Schweers's avatar Jan Peter Schweers
Browse files

Merge branch 'develop' into 'main'

Add final version of the game to main branch

See merge request !6
parents 645370e0 4fbe1fbe
No related branches found
No related tags found
2 merge requests!6Add final version of the game to main branch,!3Draft: Basic tic tac toe
<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
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);
}
}
package com.example.tictactoe_game;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.io.IOException;
public class HelloApplication extends Application {
@Override
public void start(Stage stage) throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(HelloApplication.class.getResource("hello-view.fxml"));
Scene scene = new Scene(fxmlLoader.load(), 320, 240);
stage.setTitle("Hello!");
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch();
}
}
\ No newline at end of file
package com.example.tictactoe_game;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
public class HelloController {
@FXML
private Label welcomeText;
@FXML
protected void onHelloButtonClick() {
welcomeText.setText("Welcome to JavaFX Application!");
}
}
\ No newline at end of file
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);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Button?>
<VBox alignment="CENTER" spacing="20.0" xmlns:fx="http://javafx.com/fxml"
fx:controller="com.example.tictactoe_game.HelloController">
<padding>
<Insets bottom="20.0" left="20.0" right="20.0" top="20.0"/>
</padding>
<Label fx:id="welcomeText"/>
<Button text="Hello!" onAction="#onHelloButtonClick"/>
</VBox>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment