Last changes for quicksave

PMD-Korrektur
Justin 2025-06-24 05:31:27 +02:00
parent aebfb7e38b
commit 59233efcca
3 changed files with 96 additions and 44 deletions

View File

@ -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<int[]> 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,16 +192,16 @@ 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();
@ -189,6 +209,7 @@ public class GameController {
}
});
gui.getUndoButton().addActionListener(e -> {
// Wer ist am Zug? (Das ist der, der gefragt wird)
String currentPlayer = engine.getCurrentPlayer(); // "WHITE" oder "BLACK"
@ -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
}

View File

@ -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();

View File

@ -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) {