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 c42bc2d..ed59b85 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 @@ -11,11 +11,12 @@ import javax.swing.BorderFactory; import com.github.bhlangonijr.chesslib.game.Game; import de.hs_mannheim.informatik.chess.model.ChessEngine; +import de.hs_mannheim.informatik.chess.model.GameMode; import de.hs_mannheim.informatik.chess.model.MoveDTO; import de.hs_mannheim.informatik.chess.model.PieceDTO; +import de.hs_mannheim.informatik.chess.model.Timer; import de.hs_mannheim.informatik.chess.model.BoardDTO; import de.hs_mannheim.informatik.chess.view.GameGui; -import de.hs_mannheim.informatik.chess.view.MainGui; public class GameController { GameGui gui; @@ -25,12 +26,25 @@ public class GameController { private boolean gameOver = false; private int selectedRow = -1, selectedCol = -1; 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(3, 0); + engine.initTimers(gameMode.minutes, gameMode.incrementSeconds); + time(); + initListeners(); + updateGuiBoard(); + } + + public GameController(GameGui gui, ChessEngine engine, GameEndCallback callback, GameMode gameMode) { + this.gameMode = gameMode; + this.gui = gui; + this.engine = engine; + this.callback = callback; + engine.initTimers(gameMode.minutes, gameMode.incrementSeconds); time(); initListeners(); updateGuiBoard(); @@ -279,6 +293,8 @@ public class GameController { updateGuiBoard(); gui.updateMoveList(engine.getMoveListStringsGrouped()); + + // ---- HIER ist die Matt/Patt/Remis-Prüfung ---- if (engine.isMated()) { @@ -305,13 +321,26 @@ public class GameController { } private void switchTimers() { - if (engine.getCurrentPlayer().equals("WHITE")) { - engine.getBlackTimer().stop(); - engine.getWhiteTimer().start(); - } else { - engine.getWhiteTimer().stop(); - engine.getBlackTimer().start(); - } + GameMode mode = engine.getGameMode(); // muss Engine speichern + 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(); + } + } 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 dfd1c1c..7224b18 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 @@ -5,6 +5,7 @@ import de.hs_mannheim.informatik.chess.view.PgnGui; import de.hs_mannheim.informatik.chess.view.PgnSelectionGui; import de.hs_mannheim.informatik.chess.view.CreativeGui; import de.hs_mannheim.informatik.chess.view.GameGui; +import de.hs_mannheim.informatik.chess.view.GameModeSelector; import java.io.IOException; import java.util.List; @@ -15,6 +16,7 @@ import javax.swing.JOptionPane; import com.github.bhlangonijr.chesslib.game.Game; import de.hs_mannheim.informatik.chess.model.ChessEngine; +import de.hs_mannheim.informatik.chess.model.GameMode; public class MainController { private MainGui mainGui; @@ -28,9 +30,11 @@ public class MainController { } private void startNormalMode() { + + GameMode mode = GameModeSelector.selectGameMode(); mainGui.close(); GameGui gameGui = new GameGui(); - ChessEngine engine = new ChessEngine(); + ChessEngine engine = new ChessEngine(mode); GameEndCallback callback = new GameEndCallback() { public void onNewGameRequested() { startNormalMode(); @@ -39,7 +43,7 @@ public class MainController { new MainController(); } }; - new GameController(gameGui, engine, callback); + new GameController(gameGui, engine, callback,mode); } private void startCreativeMode() { 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 cda73b5..d4ee964 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 @@ -31,13 +31,24 @@ public class ChessEngine { private int currentMoveIndex = 0; private Timer whiteTimer; private Timer blackTimer; + private final GameMode mode; + private Opening detectedOpening = null; - public ChessEngine() { + public ChessEngine() { + this.mode = null; logging(); board = new Board(); } + + public ChessEngine(GameMode mode) { + this.mode = mode; + whiteTimer = new Timer(mode.minutes, mode.seconds); + blackTimer = new Timer(mode.minutes, mode.seconds); + logging(); + board = new Board(); + } public boolean move(MoveDTO move) { String from = "" + (char)('A' + move.getFromCol()) + (8 - move.getFromRow()); String to = "" + (char)('A' + move.getToCol()) + (8 - move.getToRow()); @@ -412,6 +423,17 @@ public class ChessEngine { } public Timer getWhiteTimer() { return whiteTimer; } + public Timer getBlackTimer() { return blackTimer; } + + + public GameMode getGameMode() { + // TODO Auto-generated method stub + return mode; + } + } + + + diff --git a/schach/src/main/java/de/hs_mannheim/informatik/chess/model/GameMode.java b/schach/src/main/java/de/hs_mannheim/informatik/chess/model/GameMode.java new file mode 100644 index 0000000..5857b11 --- /dev/null +++ b/schach/src/main/java/de/hs_mannheim/informatik/chess/model/GameMode.java @@ -0,0 +1,26 @@ +package de.hs_mannheim.informatik.chess.model; + +public enum GameMode { + CLASSIC(3, 0, 0), + RAPID(5, 0, 0), + BULLET(1, 0, 10); // 1 Minute + 10 Sek Inkrement + + public final int minutes; + public final int seconds; + public final int incrementSeconds; + + GameMode(int minutes, int seconds, int incrementSeconds) { + this.minutes = minutes; + this.seconds = seconds; + this.incrementSeconds = incrementSeconds; + } + + @Override + public String toString() { + return switch (this) { + case CLASSIC -> "3 Minuten (klassisch)"; + case RAPID -> "5 Minuten (rapid)"; + case BULLET -> "1 Minute + 10 Sek Inkrement"; + }; + } +} diff --git a/schach/src/main/java/de/hs_mannheim/informatik/chess/model/Timer.java b/schach/src/main/java/de/hs_mannheim/informatik/chess/model/Timer.java index 19441d6..6a26896 100644 --- a/schach/src/main/java/de/hs_mannheim/informatik/chess/model/Timer.java +++ b/schach/src/main/java/de/hs_mannheim/informatik/chess/model/Timer.java @@ -56,6 +56,10 @@ public class Timer { public int getSecondsLeft() { return secondsLeft; } + + public void addSeconds(int seconds) { + this.secondsLeft += seconds; + } } diff --git a/schach/src/main/java/de/hs_mannheim/informatik/chess/view/GameGui.java b/schach/src/main/java/de/hs_mannheim/informatik/chess/view/GameGui.java index f0b6a33..36e8893 100644 --- a/schach/src/main/java/de/hs_mannheim/informatik/chess/view/GameGui.java +++ b/schach/src/main/java/de/hs_mannheim/informatik/chess/view/GameGui.java @@ -254,8 +254,8 @@ public class GameGui { JPanel panel = new JPanel(new GridLayout(2, 1)); panel.setBackground(new Color(0x0d1b2a)); - whiteTimerLabel = new JLabel("Weiß: 03:00", SwingConstants.CENTER); - blackTimerLabel = new JLabel("Schwarz: 03:00", SwingConstants.CENTER); + whiteTimerLabel = new JLabel("Weiß: --:--", SwingConstants.CENTER); + blackTimerLabel = new JLabel("Schwarz: --:--", SwingConstants.CENTER); whiteTimerLabel.setFont(new Font("SansSerif", Font.BOLD, 24)); whiteTimerLabel.setForeground(Color.WHITE); diff --git a/schach/src/main/java/de/hs_mannheim/informatik/chess/view/GameModeSelector.java b/schach/src/main/java/de/hs_mannheim/informatik/chess/view/GameModeSelector.java new file mode 100644 index 0000000..3d71c5b --- /dev/null +++ b/schach/src/main/java/de/hs_mannheim/informatik/chess/view/GameModeSelector.java @@ -0,0 +1,23 @@ +package de.hs_mannheim.informatik.chess.view; + +import javax.swing.*; + +import de.hs_mannheim.informatik.chess.model.GameMode; + +public class GameModeSelector { + + public static GameMode selectGameMode() { + GameMode[] options = GameMode.values(); + GameMode selected = (GameMode) JOptionPane.showInputDialog( + null, + "Wähle den Spielmodus:", + "Spielmodus auswählen", + JOptionPane.QUESTION_MESSAGE, + null, + options, + GameMode.CLASSIC + ); + + return selected != null ? selected : GameMode.CLASSIC; + } +} \ No newline at end of file