From 94bb556288a460b03320e5fd58a2c2f3f98bad7e Mon Sep 17 00:00:00 2001 From: thomasmuller Date: Mon, 23 Jun 2025 16:43:03 +0200 Subject: [PATCH] Timer implementiert und in der gui anzeigbar --- .../chess/controller/Controller.java | 19 +++++++- .../informatik/chess/model/ChessEngine.java | 46 ++++++++++++++----- 2 files changed, 53 insertions(+), 12 deletions(-) diff --git a/schach/src/main/java/de/hs_mannheim/informatik/chess/controller/Controller.java b/schach/src/main/java/de/hs_mannheim/informatik/chess/controller/Controller.java index 8e62a78..50f40e0 100644 --- a/schach/src/main/java/de/hs_mannheim/informatik/chess/controller/Controller.java +++ b/schach/src/main/java/de/hs_mannheim/informatik/chess/controller/Controller.java @@ -20,12 +20,18 @@ public class Controller { private int selectedRow = -1, selectedCol = -1; private List highlightedFields = new ArrayList<>(); + private boolean gameOver = false; + + + public Controller(GameGui gui, ChessEngine engine) { this.gui = gui; this.engine = engine; + this.engine.setTimeoutListener(this::handleTimeout); // Lamda-Verknüpfung initListeners(); updateGuiBoard(); } + private int flipRow(int row) { return gui.isFlipped() ? 7 - row : row; @@ -95,6 +101,8 @@ public class Controller { private void handleClick(int guiRow, int guiCol) { int modelRow = flipRow(guiRow); int modelCol = flipCol(guiCol); + + if (gameOver) return; //Figur am Feld BoardDTO boardDTO = engine.getBoardAsDTO(); @@ -183,7 +191,16 @@ public class Controller { } - //Time is Up Methode um zu steuern was Passiert wenn einer der Spieler die Zeit überschritten hat + + //Time is Up Methode um zu steuern was Passiert wenn einer der Spieler die Zeit überschritten hat + private void handleTimeout(String player) { + if (gameOver) return; + + gameOver = true; + + String winner = player.equals("WHITE") ? "SCHWARZ" : "WEIß"; + gui.displayMessage(winner + " hat gewonnen (Zeitüberschreitung)!"); + } } diff --git a/schach/src/main/java/de/hs_mannheim/informatik/chess/model/ChessEngine.java b/schach/src/main/java/de/hs_mannheim/informatik/chess/model/ChessEngine.java index 60c29e3..5d19ed3 100644 --- a/schach/src/main/java/de/hs_mannheim/informatik/chess/model/ChessEngine.java +++ b/schach/src/main/java/de/hs_mannheim/informatik/chess/model/ChessEngine.java @@ -17,6 +17,11 @@ import de.hs_mannheim.informatik.chess.controller.CountdownTimer; import de.hs_mannheim.informatik.chess.view.*; public class ChessEngine { + + public interface TimeoutListener { + void onTimeout(String player); + } + private Board board; private List moves = new ArrayList<>(); private static final Logger logger = Logger.getLogger(ChessEngine.class.getName()); @@ -25,6 +30,8 @@ public class ChessEngine { private CountdownTimer whiteTimer = new CountdownTimer(1,0); private CountdownTimer blackTimer = new CountdownTimer(3,0); + + private TimeoutListener timeoutListener; @@ -34,7 +41,12 @@ public class ChessEngine { logging(); board = new Board(); whiteTimer.start(); + + if (timeoutListener != null) { + timeoutListener.onTimeout("WHITE"); // oder "BLACK" + } } + public void setGui(GameGui gui) { @@ -206,9 +218,11 @@ public class ChessEngine { public void onTimeout(String player) { String winner = player.equals("WHITE") ? "SCHWARZ" : "WEIß"; - gameGui.displayMessage(winner + " hat gewonnen (Zeitüberschreitung)!"); - whiteTimer.stop(); - blackTimer.stop(); + if (gameGui != null) { + gameGui.displayMessage(winner + " hat gewonnen (Zeitüberschreitung)!"); + } else { + System.err.println("Fehler: GameGui ist null beim Timeout von " + player); + } } @@ -227,11 +241,6 @@ public class ChessEngine { } - - - - - public void logging() { // Eigener Handler nur für diese Klasse @@ -248,9 +257,24 @@ public class ChessEngine { logger.info("ChessEngine wurde initialisiert."); } - - - + public void setTimeoutListener(TimeoutListener listener) { + this.timeoutListener = listener; + + whiteTimer.setOnTimeout(() -> { + if (timeoutListener != null) timeoutListener.onTimeout("WHITE"); + }); + + blackTimer.setOnTimeout(() -> { + if (timeoutListener != null) timeoutListener.onTimeout("BLACK"); + }); + } + + + + } + + +