diff --git a/schach/.classpath b/schach/.classpath
new file mode 100644
index 0000000..cf0bcfd
--- /dev/null
+++ b/schach/.classpath
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 ed59b85..33ae675 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
@@ -28,24 +28,22 @@ public class GameController {
private List highlightedFields = new ArrayList<>();
private GameMode gameMode;
- public GameController(GameGui gui, ChessEngine engine, GameEndCallback callback) {
- this.gameMode = null;
- this.gui = gui;
- this.engine = engine;
- this.callback = callback;
- engine.initTimers(gameMode.minutes, gameMode.incrementSeconds);
- time();
- initListeners();
- updateGuiBoard();
- }
-
public GameController(GameGui gui, ChessEngine engine, GameEndCallback callback, GameMode gameMode) {
- this.gameMode = gameMode;
+ this(gui, engine, callback); // ruft anderen Konstruktor auf
+ this.gameMode = gameMode;
+ if (gameMode != null) {
+ engine.initTimers(gameMode.minutes, gameMode.incrementSeconds);
+ time();
+ }
+ }
+
+ // Für Creative/PGN-Mode (ohne Zeit)
+ public GameController(GameGui gui, ChessEngine engine, GameEndCallback callback) {
this.gui = gui;
this.engine = engine;
this.callback = callback;
- engine.initTimers(gameMode.minutes, gameMode.incrementSeconds);
- time();
+ this.gameMode = null;
+ // KEINE Timer initialisieren
initListeners();
updateGuiBoard();
}
@@ -140,7 +138,6 @@ public class GameController {
// --- AUFGEBEN-BUTTON ---
gui.getResignButton().addActionListener(e -> {
if (gameOver) return;
-
int answer = javax.swing.JOptionPane.showConfirmDialog(
null,
"Willst du wirklich aufgeben?",
@@ -151,16 +148,14 @@ public class GameController {
gameOver = true;
String winner = engine.getCurrentPlayer().equals("WHITE") ? "SCHWARZ" : "WEIß";
gui.displayMessage(winner + " gewinnt durch Aufgabe!");
- engine.getWhiteTimer().stop();
- engine.getBlackTimer().stop();
+ if (engine.getWhiteTimer() != null) engine.getWhiteTimer().stop();
+ if (engine.getBlackTimer() != null) engine.getBlackTimer().stop();
askForRestart();
}
});
- // --- PATT-/REMIS-BUTTON ---
gui.getDrawButton().addActionListener(e -> {
if (gameOver) return;
-
int answer = javax.swing.JOptionPane.showConfirmDialog(
null,
"Remis anbieten? (Das Spiel endet sofort unentschieden)",
@@ -170,8 +165,8 @@ public class GameController {
if (answer == javax.swing.JOptionPane.YES_OPTION) {
gameOver = true;
gui.displayMessage("Remis! (durch Einigung)");
- engine.getWhiteTimer().stop();
- engine.getBlackTimer().stop();
+ if (engine.getWhiteTimer() != null) engine.getWhiteTimer().stop();
+ if (engine.getBlackTimer() != null) engine.getBlackTimer().stop();
askForRestart();
}
});
@@ -321,26 +316,26 @@ public class GameController {
}
private void switchTimers() {
- GameMode mode = engine.getGameMode(); // muss Engine speichern
- Timer whiteTimer = engine.getWhiteTimer();
- Timer blackTimer = engine.getBlackTimer();
+ GameMode mode = engine.getGameMode();
+ Timer whiteTimer = engine.getWhiteTimer();
+ Timer blackTimer = engine.getBlackTimer();
- if (engine.getCurrentPlayer().equals("WHITE")) {
- // Der letzte Spieler war Schwarz – ihm ggf. Inkrement geben
- if (mode.incrementSeconds > 0) {
- blackTimer.addSeconds(mode.incrementSeconds);
- }
- blackTimer.stop();
- whiteTimer.start();
- } else {
- // Der letzte Spieler war Weiß – ihm ggf. Inkrement geben
- if (mode.incrementSeconds > 0) {
- whiteTimer.addSeconds(mode.incrementSeconds);
- }
- whiteTimer.stop();
- blackTimer.start();
- }
-
+ // Wenn KEIN Modus (also kein Timer): NICHTS machen!
+ if (mode == null || whiteTimer == null || blackTimer == null) return;
+
+ if (engine.getCurrentPlayer().equals("WHITE")) {
+ if (mode.incrementSeconds > 0) {
+ blackTimer.addSeconds(mode.incrementSeconds);
+ }
+ blackTimer.stop();
+ whiteTimer.start();
+ } else {
+ if (mode.incrementSeconds > 0) {
+ whiteTimer.addSeconds(mode.incrementSeconds);
+ }
+ whiteTimer.stop();
+ blackTimer.start();
+ }
}
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 7224b18..7335839 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
@@ -53,21 +53,22 @@ public class MainController {
new CreativeController(creativegui, engine);
creativegui.setStartGameCallback(fen -> {
+ // 1. Modus-Auswahl-Dialog zeigen!
+ GameMode mode = GameModeSelector.selectGameMode(); // (Dialog, wie beim Normal Mode)
- ChessEngine newEngine = new ChessEngine();
+ if (mode == null) return; // User hat abgebrochen → nichts machen
+
+
+ ChessEngine newEngine = new ChessEngine(mode); // Engine mit Modus (Timer)
newEngine.setPositionFromFEN(fen);
GameGui gameGui = new GameGui();
-
GameEndCallback callback = new GameEndCallback() {
- public void onNewGameRequested() {
- startCreativeMode();
- }
- public void onReturnToMenu() {
- new MainController();
- }
+ public void onNewGameRequested() { startCreativeMode(); }
+ public void onReturnToMenu() { new MainController(); }
};
- new GameController(gameGui, newEngine, callback);
+ new GameController(gameGui, newEngine, callback, mode); // mit Timer/ohne je nach Modus
+ creativegui.close();
});
}
@@ -90,5 +91,6 @@ public class MainController {
JOptionPane.showMessageDialog(null, "Fehler beim Laden der PGN-Datei:\n" + ex.getMessage());
}
}
+ mainGui.close();
}
}
\ No newline at end of file
diff --git a/schach/src/main/java/de/hs_mannheim/informatik/chess/view/CreativeGui.java b/schach/src/main/java/de/hs_mannheim/informatik/chess/view/CreativeGui.java
index d53806c..c8e65f9 100644
--- a/schach/src/main/java/de/hs_mannheim/informatik/chess/view/CreativeGui.java
+++ b/schach/src/main/java/de/hs_mannheim/informatik/chess/view/CreativeGui.java
@@ -19,6 +19,8 @@ public class CreativeGui {
private JButton updateBtn;
private JButton flipBoardButton;
+ private boolean closedByUser = true;
+
private StartGameCallback startGameCallback;
private JButton startGameButton;
@@ -64,7 +66,16 @@ public class CreativeGui {
gbc.insets = new Insets(5, 0, 5, 5);
gbc.fill = GridBagConstraints.BOTH;
mainPanel.add(fenPanel(), gbc);
-
+
+ frame.addWindowListener(new java.awt.event.WindowAdapter() {
+ @Override
+ public void windowClosed(java.awt.event.WindowEvent e) {
+ if (closedByUser) {
+ new de.hs_mannheim.informatik.chess.controller.MainController();
+ }
+ }
+ });
+
frame.setContentPane(mainPanel);
frame.setVisible(true);
}
@@ -207,6 +218,7 @@ public class CreativeGui {
startGameButton.addActionListener(e -> {
if (startGameCallback != null) {
+ setClosedByUser(false);
startGameCallback.onStartGame(getFenText());
}
});
@@ -222,6 +234,9 @@ public class CreativeGui {
public JButton getUpdateButton() { return updateBtn; }
public void setSelectedPiece(String piece) { selectedPiece = piece; }
public String getSelectedPiece() { return selectedPiece; }
+ public void setClosedByUser(boolean b) {
+ this.closedByUser = b;
+ }
public JButton getStartGameButton() { return startGameButton; }
@@ -232,4 +247,8 @@ public class CreativeGui {
public boolean isFlipped() { return isFlipped; }
public void setFlipped(boolean f) { isFlipped = f; }
public JButton getFlipBoardButton() { return flipBoardButton; }
+
+ public void close() {
+ frame.dispose();
+ }
}
diff --git a/schach/src/main/java/de/hs_mannheim/informatik/chess/view/PgnGui.java b/schach/src/main/java/de/hs_mannheim/informatik/chess/view/PgnGui.java
index 11e5840..ef67da5 100644
--- a/schach/src/main/java/de/hs_mannheim/informatik/chess/view/PgnGui.java
+++ b/schach/src/main/java/de/hs_mannheim/informatik/chess/view/PgnGui.java
@@ -58,6 +58,12 @@ public class PgnGui {
frame.setDefaultCloseOperation(2);
frame.setVisible(true);
+ frame.addWindowListener(new java.awt.event.WindowAdapter() {
+ @Override
+ public void windowClosed(java.awt.event.WindowEvent e) {
+ new de.hs_mannheim.informatik.chess.controller.MainController();
+ }
+ });
return frame;
}