From 0a46fc763f532d7c114238d61097db8073e0d10c Mon Sep 17 00:00:00 2001 From: Matias <3020772@tud.hs-mannheim.de> Date: Sat, 21 Jun 2025 12:14:05 +0200 Subject: [PATCH] =?UTF-8?q?Zug=20zur=C3=BCcknahme=20erstellt=20und=20in=20?= =?UTF-8?q?externe=20ButtonListener=20Klasse=20ausgelagert.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ButtonMovePieceListener.java | 4 + .../controller/ButtonUndoMoveListener.java | 68 ++++++++++ .../de/mannheim/th/chess/domain/Game.java | 12 ++ .../de/mannheim/th/chess/ui/SpielFrame.java | 125 ++++++++++++------ .../java/de/mannheim/th/chess/utl/Clock.java | 8 +- 5 files changed, 173 insertions(+), 44 deletions(-) create mode 100644 src/main/java/de/mannheim/th/chess/controller/ButtonUndoMoveListener.java diff --git a/src/main/java/de/mannheim/th/chess/controller/ButtonMovePieceListener.java b/src/main/java/de/mannheim/th/chess/controller/ButtonMovePieceListener.java index 402fad5..6a80e19 100644 --- a/src/main/java/de/mannheim/th/chess/controller/ButtonMovePieceListener.java +++ b/src/main/java/de/mannheim/th/chess/controller/ButtonMovePieceListener.java @@ -1,5 +1,6 @@ package de.mannheim.th.chess.controller; +import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -23,6 +24,9 @@ public class ButtonMovePieceListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { this.game.playMove(this.mv); + sf.getUndo().setText("Zug zurücknehmen"); + sf.getUndo2().setText("Zug zurücknehmen"); + if (this.game.isDraw()) { this.game.stopClock(); this.sf.setBoardMode(BoardMode.finished); diff --git a/src/main/java/de/mannheim/th/chess/controller/ButtonUndoMoveListener.java b/src/main/java/de/mannheim/th/chess/controller/ButtonUndoMoveListener.java new file mode 100644 index 0000000..f99fae3 --- /dev/null +++ b/src/main/java/de/mannheim/th/chess/controller/ButtonUndoMoveListener.java @@ -0,0 +1,68 @@ +package de.mannheim.th.chess.controller; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import de.mannheim.th.chess.App; +import de.mannheim.th.chess.domain.Game; +import de.mannheim.th.chess.ui.SpielFrame; +import de.mannheim.th.chess.ui.SpielFrame.BoardMode; + +public class ButtonUndoMoveListener implements ActionListener { + + private static final Logger logger = LogManager.getLogger(App.class); + + private SpielFrame sf; + private Game game; + + public ButtonUndoMoveListener(SpielFrame sf, Game game) { + this.sf = sf; + this.game = game; + } + + @Override + public void actionPerformed(ActionEvent e) { + // TODO Auto-generated method stub + + Object source = e.getSource(); + + if (sf.getMode() != BoardMode.normal || !game.movesNotNull()) { + return; + } + + if (source == sf.getUndo()) { // Spieler 2 drückt seinen Button + if (sf.getUndo().getText().equals("Zug zurücknehmen") && game.getActivePlayer() == 1) { + sf.getUndo2().setText("Zurücknahme genehmigen?"); + sf.getUndo2().setEnabled(true); + logger.info("Spieler 2 hat zurücknahme angefordert."); + } else if (sf.getUndo().getText().equals("Zurücknahme genehmigen?")) { + logger.info("Zug zurücknehmen wurde von Spieler 2 genehmigt."); + sf.getUndo().setText("Zug zurücknehmen"); + sf.getUndo2().setText("Zug zurücknehmen"); + sf.getUndo2().setEnabled(false); + game.undo(); + sf.getClock().switchClock(); + sf.erstelleBrett(); + } + } else if (source == sf.getUndo2()) { // Spieler 1 drückt seinen Button + if (sf.getUndo2().getText().equals("Zug zurücknehmen") && game.getActivePlayer() == 2) { + sf.getUndo().setText("Zurücknahme genehmigen?"); + sf.getUndo().setEnabled(true); + logger.info("Spieler 1 hat zurücknahme angefordert."); + } else if (sf.getUndo2().getText().equals("Zurücknahme genehmigen?")) { + logger.info("Zug zurücknehmen wurde von Spieler 1 genehmigt."); + sf.getUndo2().setText("Zug zurücknehmen"); + sf.getUndo().setText("Zug zurücknehmen"); + sf.getUndo().setEnabled(false); + game.undo(); + sf.getClock().switchClock(); + sf.erstelleBrett(); + } + } + + } + +} diff --git a/src/main/java/de/mannheim/th/chess/domain/Game.java b/src/main/java/de/mannheim/th/chess/domain/Game.java index 754160c..edef36f 100644 --- a/src/main/java/de/mannheim/th/chess/domain/Game.java +++ b/src/main/java/de/mannheim/th/chess/domain/Game.java @@ -105,6 +105,11 @@ public class Game { this.movelist.add(move); } + + public void undo() { + this.board.undoMove(); + this.movelist.removeLast(); + } public boolean isMate() { return board.isMated(); @@ -174,4 +179,11 @@ public class Game { public boolean isZuruecknahme() { return zuruecknahme; } + + public boolean movesNotNull() { + if(movelist.getLast() != null) { + return true; + } + return false; + } } diff --git a/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java b/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java index 793fcfd..414f061 100644 --- a/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java +++ b/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java @@ -12,6 +12,7 @@ import de.mannheim.th.chess.utl.Clock; import de.mannheim.th.chess.controller.ButtonMovePieceListener; import de.mannheim.th.chess.controller.ButtonSelectPieceListener; import de.mannheim.th.chess.controller.ButtonToNormalListener; +import de.mannheim.th.chess.controller.ButtonUndoMoveListener; import java.awt.Font; @@ -46,15 +47,21 @@ public class SpielFrame extends JFrame { private ArrayList buttons = new ArrayList<>(); private HashMap belegungen = new HashMap<>(); private JPanel panelLinks, panelRechts, contentPane; + private JButton undo, undo2; private Game game; private Clock clock; private BoardMode mode; + private Zuruecknahme undoMove; private Square selectedSquare; public enum BoardMode { normal, pieceSelected, finished } + + public enum Zuruecknahme { + white, black, nobody + } /** * Create the frame. @@ -88,13 +95,13 @@ public class SpielFrame extends JFrame { // Panel für alle Eingaben von Player 2 panelRechts.add(getUiPlayerTwo()); - + // Panel für Statistikanzeigen panelRechts.add(getUiStatistik()); - //Panel für alle Eingaben von Player 1 + // Panel für alle Eingaben von Player 1 panelRechts.add(getUiPlayerOne()); - + // JSplitPane horizontal (linke und rechte Hälfte) JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, panelLinks, panelRechts); splitPane.setResizeWeight(0.75); @@ -104,21 +111,10 @@ public class SpielFrame extends JFrame { contentPane.add(splitPane, BorderLayout.CENTER); + setVisible(true); } - public void setBoardMode(BoardMode bm) { - this.mode = bm; - } - - public void setSelectedSquare(Square sq) { - this.selectedSquare = sq; - } - - public HashMap getBelegung() { - return this.belegungen; - } - /** * Erstellt alle Buttons und fügt sie dem Frame hinzu. */ @@ -177,6 +173,7 @@ public class SpielFrame extends JFrame { * with new blank ones. */ private void clearButtons() { + buttons.clear(); panelLinks.removeAll(); @@ -221,6 +218,7 @@ public class SpielFrame extends JFrame { switch (this.mode) { case BoardMode.normal: + selectables = game.getAllLegalMoveableSquares(); for (Square square : selectables) { @@ -321,7 +319,7 @@ public class SpielFrame extends JFrame { aufgebenUndo.setLayout(new BoxLayout(aufgebenUndo, BoxLayout.X_AXIS)); if (game.isZuruecknahme()) { - JButton undo = new JButton("Zug zurücknehmen"); + undo = new JButton("Zug zurücknehmen"); undo.setBackground(Color.LIGHT_GRAY); undo.setForeground(Color.BLACK); undo.setFont(new Font("Tahoma", Font.BOLD, 16)); @@ -329,13 +327,9 @@ public class SpielFrame extends JFrame { aufgebenUndo.add(undo); // Button-Listener - undo.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - - } - }); - } + undo.addActionListener(new ButtonUndoMoveListener(this, this.game)); + } + aufgebenUndo.add(Box.createHorizontalStrut(10)); @@ -377,18 +371,18 @@ public class SpielFrame extends JFrame { return playerTwo; } - + private JPanel getUiStatistik() { - + JPanel statistik = new JPanel(); statistik.setBackground(new Color(90, 90, 90)); statistik.setLayout(new BoxLayout(statistik, BoxLayout.Y_AXIS)); - + JTextArea ausgabe = new JTextArea(); ausgabe.setEditable(false); - ausgabe.setBackground(new Color(75,75,75)); + ausgabe.setBackground(new Color(75, 75, 75)); ausgabe.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1)); - + statistik.add(ausgabe); return statistik; } @@ -407,20 +401,16 @@ public class SpielFrame extends JFrame { aufgebenUndo.setLayout(new BoxLayout(aufgebenUndo, BoxLayout.X_AXIS)); if (game.isZuruecknahme()) { - JButton undo = new JButton("Zug zurücknehmen"); - undo.setBackground(Color.LIGHT_GRAY); - undo.setForeground(Color.BLACK); - undo.setFont(new Font("Tahoma", Font.BOLD, 16)); - undo.setAlignmentX(Component.CENTER_ALIGNMENT); - aufgebenUndo.add(undo); + undo2 = new JButton("Zug zurücknehmen"); + undo2.setBackground(Color.LIGHT_GRAY); + undo2.setForeground(Color.BLACK); + undo2.setFont(new Font("Tahoma", Font.BOLD, 16)); + undo2.setAlignmentX(Component.CENTER_ALIGNMENT); + aufgebenUndo.add(undo2); // Button-Listener - undo.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - - } - }); + undo2.addActionListener(new ButtonUndoMoveListener(this, this.game)); + } aufgebenUndo.add(Box.createHorizontalStrut(10)); @@ -456,10 +446,10 @@ public class SpielFrame extends JFrame { } }); - + playerOne.add(aufgebenUndo); - playerOne.add(Box.createVerticalStrut(10)); + playerOne.add(Box.createVerticalStrut(15)); JLabel clock1 = clock.getClock1(); playerOne.add(clock1); @@ -475,5 +465,56 @@ public class SpielFrame extends JFrame { return playerOne; } + + public void undoMove() { + + switch(this.undoMove) { + + case white: + + break; + + case black: + break; + + case nobody: + break; + + default: + break; + } + } + + public void setBoardMode(BoardMode bm) { + this.mode = bm; + } + + public void setSelectedSquare(Square sq) { + this.selectedSquare = sq; + } + + public HashMap getBelegung() { + return this.belegungen; + } + + public void setZuruecknahme(Zuruecknahme z) { + this.undoMove = z; + } + + public JButton getUndo() { + return undo; + } + + public JButton getUndo2() { + return undo2; + } + + public BoardMode getMode() { + return mode; + } + + public Clock getClock() { + return clock; + } } diff --git a/src/main/java/de/mannheim/th/chess/utl/Clock.java b/src/main/java/de/mannheim/th/chess/utl/Clock.java index 13bb9f6..80ea3df 100644 --- a/src/main/java/de/mannheim/th/chess/utl/Clock.java +++ b/src/main/java/de/mannheim/th/chess/utl/Clock.java @@ -59,13 +59,13 @@ public class Clock extends Thread implements Runnable { clock1 = new JLabel("" + minutes + ":00 "); clock1.setBorder(BorderFactory.createEmptyBorder(0, 40, 0, 0)); clock1.setForeground(Color.BLACK); - clock1.setFont(new Font("Calibri", Font.BOLD, 35)); + clock1.setFont(new Font("Calibri", Font.BOLD, 40)); clock1.setAlignmentX(Component.CENTER_ALIGNMENT); clock2 = new JLabel("" + minutes + ":00 "); clock2.setBorder(BorderFactory.createEmptyBorder(0, 40, 0, 0)); clock2.setForeground(Color.BLACK); - clock2.setFont(new Font("Calibri", Font.BOLD, 35)); + clock2.setFont(new Font("Calibri", Font.BOLD, 40)); clock2.setAlignmentX(Component.CENTER_ALIGNMENT); // player1Panel.add(clock1); // player2Panel.add(clock2); @@ -141,6 +141,10 @@ public class Clock extends Thread implements Runnable { break; } } + + public void switchClock() { + whiteToMove = !whiteToMove; + } public JLabel getClock1() {