From 0bc99a18bef3f3b004c115f9a7c61173eb05032c Mon Sep 17 00:00:00 2001 From: Justin Date: Sun, 22 Jun 2025 01:28:37 +0200 Subject: [PATCH 01/10] Getter for undo-buttons --- .../informatik/chess/view/GameGui.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) 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 1abb531..76f4b97 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 @@ -28,6 +28,11 @@ public class GameGui { private JButton flipBoardButton; private boolean isFlipped = false; + JButton btnFirst = new JButton("|<"); + JButton btnPrev = new JButton("<"); + JButton btnNext = new JButton(">"); + JButton btnLast = new JButton(">|"); + private JPanel moveListPanel; private JScrollPane moveListScroll; @@ -166,10 +171,7 @@ public class GameGui { buttonPanel.setBackground(new Color(0x0d1b2a)); // Grid oder Flow – je nach Geschmack buttonPanel.setLayout(new GridLayout(1, 4, 10, 0)); - JButton btnFirst = new JButton("|<"); - JButton btnPrev = new JButton("<"); - JButton btnNext = new JButton(">"); - JButton btnLast = new JButton(">|"); + // Style (optional) btnFirst.setBackground(new Color(0x212529)); btnFirst.setForeground(Color.WHITE); btnPrev.setBackground(new Color(0x212529)); btnPrev.setForeground(Color.WHITE); @@ -217,6 +219,11 @@ public class GameGui { this.isFlipped = flipped; } + public JButton getBtnFirst() { return btnFirst; } + public JButton getBtnPrev() { return btnPrev; } + public JButton getBtnNext() { return btnNext; } + public JButton getBtnLast() { return btnLast; } + public void updateBoard(BoardDTO boardDTO) { PieceDTO[][] board = boardDTO.getBoard(); if (!isFlipped) { From 745bf05fd3d50a2ae6e65c8f97fce1538162beee Mon Sep 17 00:00:00 2001 From: Justin Date: Sun, 22 Jun 2025 01:30:21 +0200 Subject: [PATCH 02/10] New method setPositionToMoveIndex for undo move feature in ChessEngine --- .../informatik/chess/model/ChessEngine.java | 11 +++++++++++ 1 file changed, 11 insertions(+) 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 90be5aa..efdcdfd 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 @@ -11,6 +11,8 @@ public class ChessEngine { private Board board; private List moves = new ArrayList<>(); + private int currentMoveIndex = 0; + public ChessEngine() { board = new Board(); } @@ -91,6 +93,15 @@ public class ChessEngine { } } + public void setPositionToMoveIndex(int idx) { + // Neues Board erzeugen + board = new Board(); + for (int i = 0; i < idx; i++) { + board.doMove(moves.get(i)); + } + currentMoveIndex = idx; + } + private PieceDTO convertPieceToDTO(Piece piece) { if (piece == null || piece.equals(Piece.NONE)) return null; String color = piece.name().startsWith("WHITE") ? "WHITE" : "BLACK"; From 572e7b113102b49be336a147ab8a35bb2506b74a Mon Sep 17 00:00:00 2001 From: Justin Date: Sun, 22 Jun 2025 01:31:18 +0200 Subject: [PATCH 03/10] New method getCurrentMoveIndex in ChessEngine --- .../java/de/hs_mannheim/informatik/chess/model/ChessEngine.java | 2 ++ 1 file changed, 2 insertions(+) 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 efdcdfd..0d16615 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 @@ -102,6 +102,8 @@ public class ChessEngine { currentMoveIndex = idx; } + public int getCurrentMoveIndex() { return currentMoveIndex; } + private PieceDTO convertPieceToDTO(Piece piece) { if (piece == null || piece.equals(Piece.NONE)) return null; String color = piece.name().startsWith("WHITE") ? "WHITE" : "BLACK"; From 3335dc75cfc1dcf9dbe9378c9d31fc860735704c Mon Sep 17 00:00:00 2001 From: Justin Date: Sun, 22 Jun 2025 01:32:23 +0200 Subject: [PATCH 04/10] New method getMoveListSize in ChessEngine --- .../java/de/hs_mannheim/informatik/chess/model/ChessEngine.java | 2 ++ 1 file changed, 2 insertions(+) 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 0d16615..88e4ae7 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 @@ -104,6 +104,8 @@ public class ChessEngine { public int getCurrentMoveIndex() { return currentMoveIndex; } + public int getMoveListSize() { return moves.size(); } + private PieceDTO convertPieceToDTO(Piece piece) { if (piece == null || piece.equals(Piece.NONE)) return null; String color = piece.name().startsWith("WHITE") ? "WHITE" : "BLACK"; From 7e4ac22e51df4cb8adc72033f97eb6a3beacc2d0 Mon Sep 17 00:00:00 2001 From: Justin Date: Sun, 22 Jun 2025 01:41:45 +0200 Subject: [PATCH 05/10] Added button-listener to Controller --- .../chess/controller/Controller.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) 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 b59d3fe..5a7a95b 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 @@ -46,6 +46,30 @@ public class Controller { } } + // Erster Zug + gui.getBtnFirst().addActionListener(e -> { + engine.setPositionToMoveIndex(0); + updateGuiBoard(); + }); + // Ein Zug zurück + gui.getBtnPrev().addActionListener(e -> { + int idx = Math.max(0, engine.getCurrentMoveIndex() - 1); + engine.setPositionToMoveIndex(idx); + updateGuiBoard(); + }); + // Ein Zug vor + gui.getBtnNext().addActionListener(e -> { + int idx = Math.min(engine.getMoveListSize(), engine.getCurrentMoveIndex() + 1); + engine.setPositionToMoveIndex(idx); + updateGuiBoard(); + }); + // Letzter Zug + gui.getBtnLast().addActionListener(e -> { + engine.setPositionToMoveIndex(engine.getMoveListSize()); + updateGuiBoard(); + }); + + gui.getFlipBoardButton().addActionListener(e -> { //ALLE Highlights und Borders zurücksetzen for (int row = 0; row < 8; row++) { From 3bad46f9eaef381ea1c8c6bbf0c79dd7e8da7d8d Mon Sep 17 00:00:00 2001 From: Justin Date: Sun, 22 Jun 2025 01:58:47 +0200 Subject: [PATCH 06/10] Fixed undoMove feature in ChessEngine --- .../hs_mannheim/informatik/chess/model/ChessEngine.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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 88e4ae7..3c69b6c 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 @@ -23,7 +23,13 @@ public class ChessEngine { Move libMove = new Move(Square.valueOf(from), Square.valueOf(to)); if (board.legalMoves().contains(libMove)) { board.doMove(libMove); - moves.add(libMove); // <-- hier merken! + + //Replay? Dann abschneiden + if (currentMoveIndex < moves.size()) { + moves = new ArrayList<>(moves.subList(0, currentMoveIndex)); + } + moves.add(libMove); + currentMoveIndex++; return true; } return false; From e0d14e081115f29973053211be6bc7dc77b136c5 Mon Sep 17 00:00:00 2001 From: Justin Date: Sun, 22 Jun 2025 02:24:26 +0200 Subject: [PATCH 07/10] Reworked methods and added a logger to ChessEngine --- .../informatik/chess/model/ChessEngine.java | 58 ++++++++++++++----- 1 file changed, 44 insertions(+), 14 deletions(-) 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 3c69b6c..b8dc5a3 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 @@ -1,6 +1,7 @@ package de.hs_mannheim.informatik.chess.model; import java.util.ArrayList; import java.util.List; +import java.util.logging.Logger; import com.github.bhlangonijr.chesslib.Board; import com.github.bhlangonijr.chesslib.Piece; @@ -10,11 +11,13 @@ import com.github.bhlangonijr.chesslib.move.Move; public class ChessEngine { private Board board; private List moves = new ArrayList<>(); + private static final Logger logger = Logger.getLogger(ChessEngine.class.getName()); private int currentMoveIndex = 0; public ChessEngine() { board = new Board(); + logger.info("Neues ChessEngine-Objekt erstellt."); } public boolean move(MoveDTO move) { @@ -26,31 +29,41 @@ public class ChessEngine { //Replay? Dann abschneiden if (currentMoveIndex < moves.size()) { + logger.info("Replay-Modus: Züge nach " + currentMoveIndex + " werden entfernt."); moves = new ArrayList<>(moves.subList(0, currentMoveIndex)); } moves.add(libMove); currentMoveIndex++; + logger.info("Zug erfolgreich durchgeführt: " + libMove); return true; } + logger.warning("Ungültiger Zug: " + libMove); return false; } public List getLegalDestinations(String from) { + logger.info("Hole legale Züge von: " + from); List destinations = new ArrayList<>(); - Square fromSq = Square.valueOf(from.toUpperCase()); - for (Move move : board.legalMoves()) { - if (move.getFrom().equals(fromSq)) { - int fromRow = 8 - fromSq.getRank().ordinal() - 1; - int fromCol = fromSq.getFile().ordinal(); - int toRow = 8 - move.getTo().getRank().ordinal() - 1; - int toCol = move.getTo().getFile().ordinal();; - destinations.add(new MoveDTO(fromRow, fromCol, toRow, toCol)); + try { + Square fromSq = Square.valueOf(from.toUpperCase()); + for (Move move : board.legalMoves()) { + if (move.getFrom().equals(fromSq)) { + int fromRow = 8 - fromSq.getRank().ordinal() - 1; + int fromCol = fromSq.getFile().ordinal(); + int toRow = 8 - move.getTo().getRank().ordinal() - 1; + int toCol = move.getTo().getFile().ordinal(); + destinations.add(new MoveDTO(fromRow, fromCol, toRow, toCol)); + } } + logger.info("Es wurden " + destinations.size() + " Ziele gefunden."); + } catch (Exception e) { + logger.severe("Fehler beim Holen der legalen Ziele: " + e.getMessage()); } return destinations; } public List getMoveListStringsGrouped() { + logger.info("Gruppiere Züge für Anzeige."); List result = new ArrayList<>(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < moves.size(); i++) { @@ -65,11 +78,13 @@ public class ChessEngine { } public PieceDTO getPieceAt(String square) { + logger.info("Hole Figur an Feld: " + square); Piece piece = board.getPiece(Square.valueOf(square.toUpperCase())); return convertPieceToDTO(piece); } public BoardDTO getBoardAsDTO() { + logger.info("Erstelle DTO-Abbild des Boards"); PieceDTO[][] dtoBoard = new PieceDTO[8][8]; for (int rank = 8; rank >= 1; rank--) { for (int file = 0; file < 8; file++) { @@ -101,6 +116,7 @@ public class ChessEngine { public void setPositionToMoveIndex(int idx) { // Neues Board erzeugen + logger.info("Setze Board auf Zug-Index: " + idx); board = new Board(); for (int i = 0; i < idx; i++) { board.doMove(moves.get(i)); @@ -108,9 +124,15 @@ public class ChessEngine { currentMoveIndex = idx; } - public int getCurrentMoveIndex() { return currentMoveIndex; } + public int getCurrentMoveIndex() { + logger.info("Hole aktuellen Zug-Index: " + currentMoveIndex); + return currentMoveIndex; + } - public int getMoveListSize() { return moves.size(); } + public int getMoveListSize() { + logger.info("Hole Anzahl gespielter Züge: " + moves.size()); + return moves.size(); + } private PieceDTO convertPieceToDTO(Piece piece) { if (piece == null || piece.equals(Piece.NONE)) return null; @@ -121,19 +143,27 @@ public class ChessEngine { } public boolean isMated() { - return board.isMated(); + boolean mated = board.isMated(); + logger.info("isMated() = " + mated); + return mated; } public boolean isStalemate() { - return board.isStaleMate(); + boolean stale = board.isStaleMate(); + logger.info("isStalemate() = " + stale); + return stale; } public boolean isDraw() { - return board.isDraw(); + boolean draw = board.isDraw(); + logger.info("isDraw() = " + draw); + return draw; } public String getCurrentPlayer() { - return board.getSideToMove().toString(); // "WHITE" oder "BLACK" + String player = board.getSideToMove().toString(); + logger.info("Am Zug: " + player); + return player; } } From 0d899a762a929efccb35cc54aea83e81fcac4366 Mon Sep 17 00:00:00 2001 From: Justin Date: Sun, 22 Jun 2025 02:36:55 +0200 Subject: [PATCH 08/10] New method logging with customized logging in ChessEngine --- .../informatik/chess/model/ChessEngine.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) 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 b8dc5a3..e7d3c9f 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 @@ -1,7 +1,11 @@ package de.hs_mannheim.informatik.chess.model; import java.util.ArrayList; import java.util.List; +import java.util.logging.ConsoleHandler; +import java.util.logging.Level; +import java.util.logging.LogRecord; import java.util.logging.Logger; +import java.util.logging.SimpleFormatter; import com.github.bhlangonijr.chesslib.Board; import com.github.bhlangonijr.chesslib.Piece; @@ -16,8 +20,8 @@ public class ChessEngine { private int currentMoveIndex = 0; public ChessEngine() { + logging(); board = new Board(); - logger.info("Neues ChessEngine-Objekt erstellt."); } public boolean move(MoveDTO move) { @@ -166,4 +170,21 @@ public class ChessEngine { return player; } + public void logging() { + + // Eigener Handler nur für diese Klasse + ConsoleHandler handler = new ConsoleHandler(); + handler.setLevel(Level.ALL); + handler.setFormatter(new SimpleFormatter() { + @Override + public synchronized String format(LogRecord lr) { + return String.format("[%s] %s%n%n", lr.getLevel().getLocalizedName(), lr.getMessage()); + } + }); + logger.setUseParentHandlers(false); + logger.addHandler(handler); + + logger.info("ChessEngine wurde initialisiert."); + } + } From 1232345b000161cff1bf64ecda5dac2450e03f4f Mon Sep 17 00:00:00 2001 From: Justin Date: Sun, 22 Jun 2025 03:06:44 +0200 Subject: [PATCH 09/10] Changed code comments in Controller --- .../de/hs_mannheim/informatik/chess/controller/Controller.java | 3 +-- 1 file changed, 1 insertion(+), 2 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 5a7a95b..162df94 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 @@ -158,7 +158,7 @@ public class Controller { public void updateGuiBoard() { BoardDTO board = engine.getBoardAsDTO(); - gui.updateBoard(board); // Passe die GUI an + gui.updateBoard(board); } // Hilfsmethode, um von Koordinaten (row/col) auf z.B. "E2" zu kommen @@ -169,7 +169,6 @@ public class Controller { } - // ... resetFieldBackground wie gehabt ... private void resetFieldBackground(int row, int col) { if ((row + col) % 2 == 0) { gui.getField(row, col).setBackground(new Color(0x778da9)); From 3e1a7701768f84c19cc3a2d7b27f59aa5196d2fe Mon Sep 17 00:00:00 2001 From: Justin Date: Sun, 22 Jun 2025 03:12:07 +0200 Subject: [PATCH 10/10] New buttons in MainGui "Creative Mode" and "Load Game(PGN)" --- .../de/hs_mannheim/informatik/chess/view/MainGui.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/schach/src/main/java/de/hs_mannheim/informatik/chess/view/MainGui.java b/schach/src/main/java/de/hs_mannheim/informatik/chess/view/MainGui.java index 2995c80..f770a47 100644 --- a/schach/src/main/java/de/hs_mannheim/informatik/chess/view/MainGui.java +++ b/schach/src/main/java/de/hs_mannheim/informatik/chess/view/MainGui.java @@ -42,10 +42,14 @@ public class MainGui { JButton btnMode1 = new JButton("Normal Mode"); JButton btnMode2 = new JButton("Mode 2 (coming soon)"); JButton btnMode3 = new JButton("Mode 3 (coming soon)"); + JButton btnCreative = new JButton("Creative Mode"); + JButton btnLoadGame = new JButton("Load Game (PGN)"); styleButton(btnMode1); styleButton(btnMode2); styleButton(btnMode3); + styleButton(btnCreative); + styleButton(btnLoadGame); gbc.gridy = 2; gbc.ipady = 25; mainPanel.add(btnMode1, gbc); @@ -55,6 +59,12 @@ public class MainGui { gbc.gridy = 4; mainPanel.add(btnMode3, gbc); + + gbc.gridy = 5; + mainPanel.add(btnCreative, gbc); + + gbc.gridy = 6; + mainPanel.add(btnLoadGame, gbc); frame.add(mainPanel); frame.setVisible(true);