From 59233efccad67357e4f7d65c84743afd188b4ac4 Mon Sep 17 00:00:00 2001 From: Justin Date: Tue, 24 Jun 2025 05:31:27 +0200 Subject: [PATCH] Last changes for quicksave --- .../chess/controller/GameController.java | 70 +++++++++++++------ .../chess/controller/MainController.java | 51 ++++++++------ .../informatik/chess/model/ChessEngine.java | 19 ++++- 3 files changed, 96 insertions(+), 44 deletions(-) diff --git a/schach/src/main/java/de/hs_mannheim/informatik/chess/controller/GameController.java b/schach/src/main/java/de/hs_mannheim/informatik/chess/controller/GameController.java index 57f7351..a30cccd 100644 --- a/schach/src/main/java/de/hs_mannheim/informatik/chess/controller/GameController.java +++ b/schach/src/main/java/de/hs_mannheim/informatik/chess/controller/GameController.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.List; import javax.swing.BorderFactory; +import javax.swing.JOptionPane; import com.github.bhlangonijr.chesslib.game.Game; @@ -26,6 +27,7 @@ public class GameController { private boolean gameOver = false; private int selectedRow = -1, selectedCol = -1; private List highlightedFields = new ArrayList<>(); + private boolean gameWasResignedOrDrawn = false; private GameMode gameMode; public GameController(GameGui gui, ChessEngine engine, GameEndCallback callback, GameMode gameMode) { @@ -33,7 +35,7 @@ public class GameController { this.gameMode = gameMode; if (gameMode != null) { engine.initTimers(gameMode.minutes, gameMode.incrementSeconds); - time(); + setupAndStartTimers(); } addWindowCloseListener(); } @@ -49,13 +51,31 @@ public class GameController { initListeners(); updateGuiBoard(); } - private void time() { - engine.getWhiteTimer().setOnTick(secs -> gui.updateWhiteTimerLabel(secs)); - engine.getBlackTimer().setOnTick(secs -> gui.updateBlackTimerLabel(secs)); - engine.getWhiteTimer().setOnTimeout(() -> onTimeout("WHITE")); - engine.getBlackTimer().setOnTimeout(() -> onTimeout("BLACK")); - engine.getWhiteTimer().start(); + + private void setupAndStartTimers() { + if (engine.getWhiteTimer() != null) { + engine.getWhiteTimer().setOnTick(secs -> gui.updateWhiteTimerLabel(secs)); + engine.getWhiteTimer().setOnTimeout(() -> onTimeout("WHITE")); + engine.getWhiteTimer().stop(); // <-- WICHTIG! + } + if (engine.getBlackTimer() != null) { + engine.getBlackTimer().setOnTick(secs -> gui.updateBlackTimerLabel(secs)); + engine.getBlackTimer().setOnTimeout(() -> onTimeout("BLACK")); + engine.getBlackTimer().stop(); // <-- WICHTIG! + } + // Timer-Labels initial setzen + if (engine.getWhiteTimer() != null) gui.updateWhiteTimerLabel(engine.getWhiteTimer().getSecondsLeft()); + if (engine.getBlackTimer() != null) gui.updateBlackTimerLabel(engine.getBlackTimer().getSecondsLeft()); + + // Aktuellen Spieler-Timer starten: + if (engine.getCurrentPlayer().equals("WHITE")) { + engine.getWhiteTimer().start(); + } else { + engine.getBlackTimer().start(); + } } + + private int flipRow(int row) { return gui.isFlipped() ? 7 - row : row; } @@ -153,16 +173,16 @@ public class GameController { // --- AUFGEBEN-BUTTON --- gui.getResignButton().addActionListener(e -> { - engine.clearQuicksave(); if (gameOver) return; - int answer = javax.swing.JOptionPane.showConfirmDialog( + int answer = JOptionPane.showConfirmDialog( null, "Willst du wirklich aufgeben?", "Aufgeben", - javax.swing.JOptionPane.YES_NO_OPTION + JOptionPane.YES_NO_OPTION ); - if (answer == javax.swing.JOptionPane.YES_OPTION) { + if (answer == JOptionPane.YES_OPTION) { gameOver = true; + gameWasResignedOrDrawn = true; // <<<<<< String winner = engine.getCurrentPlayer().equals("WHITE") ? "SCHWARZ" : "WEIß"; gui.displayMessage(winner + " gewinnt durch Aufgabe!"); if (engine.getWhiteTimer() != null) engine.getWhiteTimer().stop(); @@ -172,22 +192,23 @@ public class GameController { }); gui.getDrawButton().addActionListener(e -> { - engine.clearQuicksave(); if (gameOver) return; - int answer = javax.swing.JOptionPane.showConfirmDialog( + int answer = JOptionPane.showConfirmDialog( null, "Remis anbieten? (Das Spiel endet sofort unentschieden)", "Remis", - javax.swing.JOptionPane.YES_NO_OPTION + JOptionPane.YES_NO_OPTION ); - if (answer == javax.swing.JOptionPane.YES_OPTION) { + if (answer == JOptionPane.YES_OPTION) { gameOver = true; + gameWasResignedOrDrawn = true; // <<<<<< gui.displayMessage("Remis! (durch Einigung)"); if (engine.getWhiteTimer() != null) engine.getWhiteTimer().stop(); if (engine.getBlackTimer() != null) engine.getBlackTimer().stop(); askForRestart(); } }); + gui.getUndoButton().addActionListener(e -> { // Wer ist am Zug? (Das ist der, der gefragt wird) @@ -377,22 +398,29 @@ public class GameController { } private void askForRestart() { - int answer = javax.swing.JOptionPane.showConfirmDialog( + int answer = JOptionPane.showConfirmDialog( null, "Neue Partie starten?", "Spiel beendet", - javax.swing.JOptionPane.YES_NO_OPTION + JOptionPane.YES_NO_OPTION ); javax.swing.SwingUtilities.getWindowAncestor(gui.getField(0, 0)).dispose(); - if (answer == javax.swing.JOptionPane.YES_OPTION) { - engine.clearQuicksave(); // Quicksave löschen! + if (answer == JOptionPane.YES_OPTION) { + engine.clearQuicksave(); MainController.engineRAM = null; callback.onNewGameRequested(); } else { - engine.quicksave(); // Im RAM speichern! - MainController.engineRAM = engine; // Referenz für das nächste Mal + // HIER: QuickSave **NUR** falls das Spiel NICHT durch Aufgabe/Remis/Patt beendet wurde! + if (!gameWasResignedOrDrawn) { + engine.quicksave(); + MainController.engineRAM = engine; + } else { + engine.clearQuicksave(); + MainController.engineRAM = null; + } callback.onReturnToMenu(); } + gameWasResignedOrDrawn = false; // Reset für nächstes Spiel } diff --git a/schach/src/main/java/de/hs_mannheim/informatik/chess/controller/MainController.java b/schach/src/main/java/de/hs_mannheim/informatik/chess/controller/MainController.java index 3000378..7165287 100644 --- a/schach/src/main/java/de/hs_mannheim/informatik/chess/controller/MainController.java +++ b/schach/src/main/java/de/hs_mannheim/informatik/chess/controller/MainController.java @@ -32,27 +32,36 @@ public class MainController { private void startNormalMode() { // Prüfe, ob es im RAM ein Quicksave gibt: - if (engineRAM != null && engineRAM.quickload()) { - int choice = JOptionPane.showConfirmDialog( - null, - "Letzte Partie fortsetzen?", - "Quicksave gefunden", - JOptionPane.YES_NO_OPTION - ); - if (choice == JOptionPane.YES_OPTION) { - GameGui gameGui = new GameGui(); - GameEndCallback callback = new GameEndCallback() { - public void onNewGameRequested() { startNormalMode(); } - public void onReturnToMenu() { new MainController(); } - }; - new GameController(gameGui, engineRAM, callback); - mainGui.close(); - return; // Fertig! - } else { - engineRAM.clearQuicksave(); - engineRAM = null; - } - } + if (engineRAM != null && engineRAM.quickload()) { + int choice = JOptionPane.showConfirmDialog( + null, + "Letzte Partie fortsetzen?", + "Quicksave gefunden", + JOptionPane.YES_NO_OPTION + ); + if (choice == JOptionPane.YES_OPTION) { + GameGui gameGui = new GameGui(); + GameEndCallback callback = new GameEndCallback() { + public void onNewGameRequested() { startNormalMode(); } + public void onReturnToMenu() { new MainController(); } + }; + new GameController(gameGui, engineRAM, callback); // KEIN initTimers, KEIN neuer Engine! + // --- Timerlabels aktualisieren + gameGui.updateWhiteTimerLabel(engineRAM.getWhiteTimer().getSecondsLeft()); + gameGui.updateBlackTimerLabel(engineRAM.getBlackTimer().getSecondsLeft()); + // --- Timer des aktuellen Spielers starten + if (engineRAM.getCurrentPlayer().equals("WHITE")) { + engineRAM.getWhiteTimer().start(); + } else { + engineRAM.getBlackTimer().start(); + } + mainGui.close(); + return; // Fertig! + } else { + engineRAM.clearQuicksave(); + engineRAM = null; + } + } // Neues Spiel normal starten: GameMode mode = GameModeSelector.selectGameMode(); 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 c198508..91f3e98 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 @@ -323,8 +323,23 @@ public class ChessEngine { } public void initTimers(int min, int sec) { - whiteTimer = new Timer(min, sec); - blackTimer = new Timer(min, sec); + if (whiteTimer == null) { + whiteTimer = new Timer(min, sec); + } else if (quicksaveWhiteTimeLeft != -1) { + whiteTimer = new Timer(min, sec); + whiteTimer.setSecondsLeft(quicksaveWhiteTimeLeft); + } else { + whiteTimer = new Timer(min, sec); + } + + if (blackTimer == null) { + blackTimer = new Timer(min, sec); + } else if (quicksaveBlackTimeLeft != -1) { + blackTimer = new Timer(min, sec); + blackTimer.setSecondsLeft(quicksaveBlackTimeLeft); + } else { + blackTimer = new Timer(min, sec); + } } public void saveAsPgn(Game game, String path, String dateiname) {