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 963e154..953e759 100644 --- a/src/main/java/de/mannheim/th/chess/domain/Game.java +++ b/src/main/java/de/mannheim/th/chess/domain/Game.java @@ -24,109 +24,105 @@ import de.mannheim.th.chess.utl.Clock; * Steuerung davon. */ public class Game { - - private static final Logger logger = LogManager.getLogger(App.class); - private Board board; - private Clock clock; - private SpielFrame sp; - private String modus; - private boolean rotieren, zuruecknahme; + private static final Logger logger = LogManager.getLogger(App.class); - private MoveList movelist; - - public Game() { - - this.board = new Board(); - this.movelist = new MoveList(); - clock = new Clock("blitz"); - clock.start(); - } + private Board board; + private Clock clock; + private SpielFrame sp; + private String modus; + private boolean rotieren, zuruecknahme; - /** - * Conststructs a new standard GameBoard. - */ - public Game(String modus, boolean rotieren, boolean zuruecknahme, String fen) { - this.modus = modus; - this.rotieren = rotieren; - this.zuruecknahme = zuruecknahme; - - this.board = new Board(); - - if(fen == null) fen = board.getFen(); - - this.board.loadFromFen(fen); + private MoveList movelist; - this.movelist = new MoveList(); - - clock = new Clock(modus); - - sp = new SpielFrame(this); + public Game() { - } + this.board = new Board(); + this.movelist = new MoveList(); + clock = new Clock("blitz"); + clock.start(); + } - /** - * Constructs a new standard GameBoard and applies the provides moves. - * - * @param movelist The list of moves that get played. - */ - public Game(MoveList movelist) { - this.board = new Board(); + /** + * Conststructs a new standard GameBoard. + */ + public Game(String modus, boolean rotieren, boolean zuruecknahme, String fen) { + this.modus = modus; + this.rotieren = rotieren; + this.zuruecknahme = zuruecknahme; - this.movelist = movelist; + this.board = new Board(); - for (Move move : movelist) { - this.board.doMove(move); - } + if (fen == null) + fen = board.getFen(); - // this.clockPlayer1 = new Clock(); - // this.clockPlayer2 = new Clock(); - } + this.board.loadFromFen(fen); - /** - * Constructs a new GameBoard with the provided fen String as the positions. - * - * @param fen The fen String that provides the customs formation. - */ - public Game(String fen) { - this.board = new Board(); - this.board.loadFromFen(fen); + this.movelist = new MoveList(); - this.movelist = new MoveList(); - //this.sp = new SpielFrame(); + clock = new Clock(modus); - // this.clockPlayer1 = new Clock(); - // this.clockPlayer2 = new Clock(); - } + sp = new SpielFrame(this); - /** - * Plays the move on the board and adds it to the movelist - * - * @param move the move to be played - */ - public void playMove(Move move) { - this.board.doMove(move); - this.movelist.add(move); - clock.pressClock(); - } + } - /** - * Plays the move on the board and adds it to the movelist - * - * @param origin The square from wich it moves from. - * @param desination The square where it will move to. - */ - public void playMove(Square origin, Square desination) { - Move move = new Move(origin, desination); - this.board.doMove(move); - this.movelist.add(move); + /** + * Constructs a new standard GameBoard and applies the provides moves. + * + * @param movelist The list of moves that get played. + */ + public Game(MoveList movelist) { + this.board = new Board(); + + this.movelist = movelist; + + for (Move move : movelist) { + this.board.doMove(move); + } + + // this.clockPlayer1 = new Clock(); + // this.clockPlayer2 = new Clock(); + } + + /** + * Constructs a new GameBoard with the provided fen String as the positions. + * + * @param fen The fen String that provides the customs formation. + */ + public Game(String fen) { + this.board = new Board(); + this.board.loadFromFen(fen); + + this.movelist = new MoveList(); + // this.sp = new SpielFrame(); + + // this.clockPlayer1 = new Clock(); + // this.clockPlayer2 = new Clock(); + } + + /** + * Plays the move on the board and adds it to the movelist + * + * @param move the move to be played + */ + public void playMove(Move move) { + this.board.doMove(move); + this.movelist.add(move); + clock.pressClock(); + } + + /** + * Plays the move on the board and adds it to the movelist + * + * @param origin The square from wich it moves from. + * @param desination The square where it will move to. + */ + + public void undo() { + this.board.undoMove(); + this.movelist.removeLast(); + } - } - - public void undo() { - this.board.undoMove(); - this.movelist.removeLast(); - } /** * Plays the move on the board and adds it to the movelist * @@ -155,30 +151,15 @@ public class Game { return 2; } - public boolean isMate() { - return board.isMated(); - } - - public boolean isDraw() { - return board.isDraw(); - } - - public int getActivePlayer() { - if (board.getSideToMove() == Side.WHITE) { - return 1; - } - return 2; - } - - /** - * Retrieves a list of legal moves originating from the specified square. - * - * @param square The square from which to retrieve legal moves. - * - * @return A list of legal moves that originate from the specified square. - */ - public List getLegalMoves(Square square) { - return this.board.legalMoves().stream().filter(move -> move.getFrom() == square).collect(Collectors.toList()); + /** + * Retrieves a list of legal moves originating from the specified square. + * + * @param square The square from which to retrieve legal moves. + * + * @return A list of legal moves that originate from the specified square. + */ + public List getLegalMoves(Square square) { + return this.board.legalMoves().stream().filter(move -> move.getFrom() == square).collect(Collectors.toList()); } @@ -191,14 +172,14 @@ public class Game { (board.getPiece(move.getFrom()) == Piece.BLACK_PAWN || board.getPiece(move.getFrom()) == Piece.WHITE_PAWN)); } - /** - * Retrieves a list of all legal moveable squares from the current board state. - * - * @return a List of Square objects representing all legal moveable squares. - */ - public List getAllLegalMoveableSquares() { - return this.board.legalMoves().stream().map(move -> move.getFrom()).distinct().collect(Collectors.toList()); - } + /** + * Retrieves a list of all legal moveable squares from the current board state. + * + * @return a List of Square objects representing all legal moveable squares. + */ + public List getAllLegalMoveableSquares() { + return this.board.legalMoves().stream().map(move -> move.getFrom()).distinct().collect(Collectors.toList()); + } /** * Retrieves a list of legal moveable squares for a given square. @@ -249,47 +230,43 @@ public class Game { playMove(promotionMove); } - public String toFEN() { - //board.toString(); - return board.getFen(); - } + public void setModus(String modus) { + this.modus = modus; + } - public void setModus(String modus) { - this.modus = modus; - } + public Clock getClock() { + return this.clock; + } - public Clock getClock() { - return this.clock; - } + public boolean isZuruecknahme() { + return zuruecknahme; + } - public boolean isZuruecknahme() { - return zuruecknahme; - } - - public boolean movesNotNull() { - if(movelist.getLast() != null) { - return true; - } - return false; - } - - public String getFen() { - return this.board.getFen(); - } - - public Move getLastMove() { - logger.info(this.movelist.getLast().toString()); - return this.movelist.getLast(); - } - - public MoveList getMoveList() { - return this.movelist; - } + public boolean movesNotNull() { + if (movelist.getLast() != null) { + return true; + } + return false; + } + + public String getFen() { + return this.board.getFen(); + } + + public Move getLastMove() { + logger.info(this.movelist.getLast().toString()); + return this.movelist.getLast(); + } + + public MoveList getMoveList() { + return this.movelist; + } + + public Board getBoard() { + // TODO Auto-generated method stub + return this.board; + } - public Board getBoard() { - // TODO Auto-generated method stub - return this.board; - } public String toFEN() { board.toString(); return board.getFen(); @@ -298,4 +275,8 @@ public class Game { public Square getSelectedSquare() { return this.getSelectedSquare(); } + + public String getUnicodeFromMove(Move move) { + return board.getPiece(move.getTo()).getFanSymbol().toUpperCase(); + } } 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 1f25c89..c433e5a 100644 --- a/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java +++ b/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java @@ -42,201 +42,200 @@ import java.util.HashMap; import java.util.List; import java.awt.GridLayout; - public class SpielFrame extends JFrame { - private static final Logger logger = LogManager.getLogger(App.class); + private static final Logger logger = LogManager.getLogger(App.class); - private static final long serialVersionUID = 1L; - private ArrayList buttons = new ArrayList<>(); - private HashMap belegungen = new HashMap<>(); - private JPanel panelLinks, panelRechts, contentPane; - private JButton undo, undo2; - private JTextArea ausgabe; - private Game game; - private Clock clock; + private static final long serialVersionUID = 1L; + private ArrayList buttons = new ArrayList<>(); + private HashMap belegungen = new HashMap<>(); + private JPanel panelLinks, panelRechts, contentPane; + private JButton undo, undo2; + private JTextArea ausgabe; + private Game game; + private Clock clock; - private BoardMode mode; - private Square selectedSquare; + private BoardMode mode; + private Square selectedSquare; - public enum BoardMode { - normal, pieceSelected, finished - } + public enum BoardMode { + normal, pieceSelected, finished + } - /** - * Create the frame. - */ - public SpielFrame(Game game) { + /** + * Create the frame. + */ + public SpielFrame(Game game) { - this.game = game; - this.clock = game.getClock(); - this.clock.start(); + this.game = game; + this.clock = game.getClock(); + this.clock.start(); - mode = BoardMode.normal; + mode = BoardMode.normal; - setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); - setBounds(100, 100, 1920, 1080); - setTitle("Schach"); - setAlwaysOnTop(true); + setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + setBounds(100, 100, 1920, 1080); + setTitle("Schach"); + setAlwaysOnTop(true); - contentPane = new JPanel(); - contentPane.setLayout(new BorderLayout()); - setContentPane(contentPane); + contentPane = new JPanel(); + contentPane.setLayout(new BorderLayout()); + setContentPane(contentPane); - // Linkes Panel mit GridLayout 8x8 für Schachbrett - panelLinks = new JPanel(new GridLayout(8, 8)); + // Linkes Panel mit GridLayout 8x8 für Schachbrett + panelLinks = new JPanel(new GridLayout(8, 8)); - erstelleBrett(); + erstelleBrett(); - // Rechtes Panel für Steuerung oder zusätzliche Eingaben - panelRechts = new JPanel(); - panelRechts.setBackground(new Color(90, 90, 90)); - panelRechts.setLayout(new BoxLayout(panelRechts, BoxLayout.Y_AXIS)); + // Rechtes Panel für Steuerung oder zusätzliche Eingaben + panelRechts = new JPanel(); + panelRechts.setBackground(new Color(90, 90, 90)); + panelRechts.setLayout(new BoxLayout(panelRechts, BoxLayout.Y_AXIS)); - // Panel für alle Eingaben von Player 2 - panelRechts.add(getUiPlayerTwo()); + // Panel für alle Eingaben von Player 2 + panelRechts.add(getUiPlayerTwo()); - // Panel für Statistikanzeigen - panelRechts.add(getUiStatistik()); + // Panel für Statistikanzeigen + panelRechts.add(getUiStatistik()); - // Panel für alle Eingaben von Player 1 - panelRechts.add(getUiPlayerOne()); + // 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); - splitPane.setBackground(Color.BLACK); - splitPane.setDividerSize(1); - splitPane.setEnabled(false); + // JSplitPane horizontal (linke und rechte Hälfte) + JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, panelLinks, panelRechts); + splitPane.setResizeWeight(0.75); + splitPane.setBackground(Color.BLACK); + splitPane.setDividerSize(1); + splitPane.setEnabled(false); - contentPane.add(splitPane, BorderLayout.CENTER); + contentPane.add(splitPane, BorderLayout.CENTER); - setVisible(true); - } + setVisible(true); + } - /** - * Erstellt alle Buttons und fügt sie dem Frame hinzu. - */ - public void erstelleBrett() { + /** + * Erstellt alle Buttons und fügt sie dem Frame hinzu. + */ + public void erstelleBrett() { - this.clearButtons(); - this.setDefaultBackground(); - this.setButtonsActions(); + this.clearButtons(); + this.setDefaultBackground(); + this.setButtonsActions(); - ladeBrett(); + ladeBrett(); - panelLinks.revalidate(); - panelLinks.repaint(); + panelLinks.revalidate(); + panelLinks.repaint(); - } + } - private int mirrowedGrid(int i) { - return 63 - (((i / 8) * 8) + (7 - i % 8)); - } + private int mirrowedGrid(int i) { + return 63 - (((i / 8) * 8) + (7 - i % 8)); + } - /** - * holt sich FEN-Zeichenkette und extrahiert daraus die Positionen der Figuren - */ - private void ladeBrett() { - // System.out.println(game.toFEN()); + /** + * holt sich FEN-Zeichenkette und extrahiert daraus die Positionen der Figuren + */ + private void ladeBrett() { + // System.out.println(game.toFEN()); - char[] fen = game.toFEN().replaceAll("/", "").split(" ")[0].toCharArray(); - int i = 0; - for (int j = 0; j < fen.length; j++) { - if (Character.isDigit(fen[j])) { - int leerfelder = Character.getNumericValue(fen[j]); - for (int k = 0; k < leerfelder; k++) { - belegungen.put(buttons.get(i), "n-n"); - // buttons.get(i).setEnabled(false); // erstmal deaktivieren, weil leere Felder - // nicht ckickbar sein sollten. - i++; - } - continue; - } else if (fen[j] >= 65 && fen[j] <= 90) { // ein Großbuchstabe, also - belegungen.put(buttons.get(i), "w-" + fen[j]); - } else if (fen[j] >= 97 && fen[j] <= 122) { // ein Kleinbuchstabe, also - belegungen.put(buttons.get(i), "b-" + fen[j]); - // buttons.get(i).setEnabled(false); // erstmal deaktivieren, damit weiß - // beginnen kann - } - buttons.get(i).setIcon(new ImageIcon("src/main/resources/" + (int) fen[j] + ".png")); - buttons.get(i).setDisabledIcon(new ImageIcon("src/main/resources/" + (int) fen[j] + ".png")); + char[] fen = game.toFEN().replaceAll("/", "").split(" ")[0].toCharArray(); + int i = 0; + for (int j = 0; j < fen.length; j++) { + if (Character.isDigit(fen[j])) { + int leerfelder = Character.getNumericValue(fen[j]); + for (int k = 0; k < leerfelder; k++) { + belegungen.put(buttons.get(i), "n-n"); + // buttons.get(i).setEnabled(false); // erstmal deaktivieren, weil leere Felder + // nicht ckickbar sein sollten. + i++; + } + continue; + } else if (fen[j] >= 65 && fen[j] <= 90) { // ein Großbuchstabe, also + belegungen.put(buttons.get(i), "w-" + fen[j]); + } else if (fen[j] >= 97 && fen[j] <= 122) { // ein Kleinbuchstabe, also + belegungen.put(buttons.get(i), "b-" + fen[j]); + // buttons.get(i).setEnabled(false); // erstmal deaktivieren, damit weiß + // beginnen kann + } + buttons.get(i).setIcon(new ImageIcon("src/main/resources/" + (int) fen[j] + ".png")); + buttons.get(i).setDisabledIcon(new ImageIcon("src/main/resources/" + (int) fen[j] + ".png")); - i++; + i++; - } - } + } + } - /** - * Clears the existing buttons from the button list, panellinks and fills them - * with new blank ones. - */ - private void clearButtons() { + /** + * Clears the existing buttons from the button list, panellinks and fills them + * with new blank ones. + */ + private void clearButtons() { - buttons.clear(); - panelLinks.removeAll(); + buttons.clear(); + panelLinks.removeAll(); - for (int i = 0; i < 64; i++) { - JButton b = new JButton(); + for (int i = 0; i < 64; i++) { + JButton b = new JButton(); - b.setEnabled(false); + b.setEnabled(false); - // style - b.setFocusPainted(false); - b.setFont(new Font("Arial", Font.PLAIN, 30)); - b.setForeground(Color.WHITE); - b.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1)); - b.setName(i + ""); + // style + b.setFocusPainted(false); + b.setFont(new Font("Arial", Font.PLAIN, 30)); + b.setForeground(Color.WHITE); + b.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1)); + b.setName(i + ""); - buttons.add(b); - } - } + buttons.add(b); + } + } - /** - * Sets the default background color for the buttons in the grid. - */ - private void setDefaultBackground() { - for (int i = 0; i < 64; i++) { - JButton b = buttons.get(i); - if ((i / 8 + i % 8) % 2 == 0) { - // logger.info("Helles Feld erstellt." + i); - b.setBackground(new Color(90, 90, 90)); - } else { - // logger.info("Dunkles Feld erstellt." + i); - b.setBackground(new Color(65, 65, 65)); - } - } - } + /** + * Sets the default background color for the buttons in the grid. + */ + private void setDefaultBackground() { + for (int i = 0; i < 64; i++) { + JButton b = buttons.get(i); + if ((i / 8 + i % 8) % 2 == 0) { + // logger.info("Helles Feld erstellt." + i); + b.setBackground(new Color(90, 90, 90)); + } else { + // logger.info("Dunkles Feld erstellt." + i); + b.setBackground(new Color(65, 65, 65)); + } + } + } - /* - * Switches the button actions depending on the boardmode - */ - private void setButtonsActions() { + /* + * Switches the button actions depending on the boardmode + */ + private void setButtonsActions() { - List selectables; + List selectables; - switch (this.mode) { - case BoardMode.normal: + switch (this.mode) { + case BoardMode.normal: - selectables = game.getAllLegalMoveableSquares(); + selectables = game.getAllLegalMoveableSquares(); - for (Square square : selectables) { - JButton b = buttons.get(mirrowedGrid(square.ordinal())); - b.setEnabled(true); - // b.setBackground(Color.green); - b.addActionListener(new ButtonSelectPieceListener(this, square)); - } + for (Square square : selectables) { + JButton b = buttons.get(mirrowedGrid(square.ordinal())); + b.setEnabled(true); + // b.setBackground(Color.green); + b.addActionListener(new ButtonSelectPieceListener(this, square)); + } - break; + break; - case BoardMode.pieceSelected: + case BoardMode.pieceSelected: - JButton s = buttons.get(mirrowedGrid(selectedSquare.ordinal())); - s.setEnabled(true); - s.setBackground(new Color(165, 42, 42)); - s.addActionListener(new ButtonToNormalListener(this)); + JButton s = buttons.get(mirrowedGrid(selectedSquare.ordinal())); + s.setEnabled(true); + s.setBackground(new Color(165, 42, 42)); + s.addActionListener(new ButtonToNormalListener(this)); - selectables = game.getLegalMoveableSquares(selectedSquare); + selectables = game.getLegalMoveableSquares(selectedSquare); for (Square square : selectables) { JButton b = buttons.get(mirrowedGrid(square.ordinal())); @@ -252,47 +251,46 @@ public class SpielFrame extends JFrame { default: break; - } + } - for (JButton b : buttons) { - panelLinks.add(b); - } - } + for (JButton b : buttons) { + panelLinks.add(b); + } + } - public void showDraw() { - JFrame frame = new JFrame("Result"); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setSize(300, 150); - frame.setLayout(null); + public void showDraw() { + JFrame frame = new JFrame("Result"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setSize(300, 150); + frame.setLayout(null); - JLabel jl = new JLabel("1/2 - 1/2"); - jl.setBounds(50, 30, 200, 25); - jl.setFont(new Font("Tahoma", Font.BOLD, 20)); - frame.add(jl); - frame.setVisible(true); + JLabel jl = new JLabel("1/2 - 1/2"); + jl.setBounds(50, 30, 200, 25); + jl.setFont(new Font("Tahoma", Font.BOLD, 20)); + frame.add(jl); + frame.setVisible(true); - } + } - public void showWin(int player) { - JFrame frame = new JFrame("Result"); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setSize(300, 150); - frame.setLayout(null); + public void showWin(int player) { + JFrame frame = new JFrame("Result"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setSize(300, 150); + frame.setLayout(null); - JLabel jl = new JLabel(String.format("%d - %d", player / 2, player % 2)); - jl.setBounds(50, 30, 200, 25); - jl.setFont(new Font("Tahoma", Font.BOLD, 20)); - frame.add(jl); - frame.setVisible(true); - } - - private int showPromotion() { - final int[] result = {-1}; + JLabel jl = new JLabel(String.format("%d - %d", player / 2, player % 2)); + jl.setBounds(50, 30, 200, 25); + jl.setFont(new Font("Tahoma", Font.BOLD, 20)); + frame.add(jl); + frame.setVisible(true); + } - - JDialog dialog = new JDialog(this, "Wähle eine Figur", true); - dialog.setLayout(new GridLayout(2, 2)); - dialog.setSize(300, 200); + public int showPromotion() { + final int[] result = { -1 }; + + JDialog dialog = new JDialog(this, "Wähle eine Figur", true); + dialog.setLayout(new GridLayout(2, 2)); + dialog.setSize(300, 200); int[] pictures = { 81, 82, 66, 78, 113, 114, 98, 110 }; @@ -312,224 +310,223 @@ public class SpielFrame extends JFrame { dialog.setLocationRelativeTo(null); dialog.setVisible(true); - return result[0]; - } - + return result[0]; + } - private JPanel getUiPlayerTwo() { + private JPanel getUiPlayerTwo() { - JPanel playerTwo = new JPanel(); - playerTwo.setBackground(new Color(90, 90, 90)); - playerTwo.setLayout(new BoxLayout(playerTwo, BoxLayout.Y_AXIS)); + JPanel playerTwo = new JPanel(); + playerTwo.setBackground(new Color(90, 90, 90)); + playerTwo.setLayout(new BoxLayout(playerTwo, BoxLayout.Y_AXIS)); - playerTwo.add(Box.createVerticalStrut(15)); + playerTwo.add(Box.createVerticalStrut(15)); - JLabel pl2 = new JLabel("Player 2:"); - pl2.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 0)); - pl2.setFont(new Font("Calibri", Font.BOLD, 35)); - pl2.setForeground(Color.BLACK); - pl2.setAlignmentX(Component.CENTER_ALIGNMENT); - playerTwo.add(pl2); + JLabel pl2 = new JLabel("Player 2:"); + pl2.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 0)); + pl2.setFont(new Font("Calibri", Font.BOLD, 35)); + pl2.setForeground(Color.BLACK); + pl2.setAlignmentX(Component.CENTER_ALIGNMENT); + playerTwo.add(pl2); - playerTwo.add(Box.createVerticalStrut(10)); + playerTwo.add(Box.createVerticalStrut(10)); - JLabel clock1 = clock.getClock2(); - playerTwo.add(clock1); + JLabel clock1 = clock.getClock2(); + playerTwo.add(clock1); - playerTwo.add(Box.createVerticalStrut(10)); + playerTwo.add(Box.createVerticalStrut(10)); - // Button zurücknahme und aufgeben für Player 2 - JPanel aufgebenUndo = new JPanel(); - aufgebenUndo.setBackground(new Color(90, 90, 90)); - aufgebenUndo.setLayout(new BoxLayout(aufgebenUndo, BoxLayout.X_AXIS)); + // Button zurücknahme und aufgeben für Player 2 + JPanel aufgebenUndo = new JPanel(); + aufgebenUndo.setBackground(new Color(90, 90, 90)); + aufgebenUndo.setLayout(new BoxLayout(aufgebenUndo, BoxLayout.X_AXIS)); - if (game.isZuruecknahme()) { - 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); + if (game.isZuruecknahme()) { + 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); - // Button-Listener - undo.addActionListener(new ButtonUndoMoveListener(this, this.game)); - } + // Button-Listener + undo.addActionListener(new ButtonUndoMoveListener(this, this.game)); + } - aufgebenUndo.add(Box.createHorizontalStrut(10)); + aufgebenUndo.add(Box.createHorizontalStrut(10)); - JButton aufgeben = new JButton("Aufgeben"); - aufgeben.setBackground(Color.LIGHT_GRAY); - aufgeben.setForeground(Color.BLACK); - aufgeben.setFont(new Font("Tahoma", Font.BOLD, 16)); - aufgeben.setAlignmentX(Component.CENTER_ALIGNMENT); - aufgebenUndo.add(aufgeben); + JButton aufgeben = new JButton("Aufgeben"); + aufgeben.setBackground(Color.LIGHT_GRAY); + aufgeben.setForeground(Color.BLACK); + aufgeben.setFont(new Font("Tahoma", Font.BOLD, 16)); + aufgeben.setAlignmentX(Component.CENTER_ALIGNMENT); + aufgebenUndo.add(aufgeben); - // Button-Listener - aufgeben.addActionListener(new ButtonAufgebenListener()); + // Button-Listener + aufgeben.addActionListener(new ButtonAufgebenListener()); - aufgebenUndo.add(Box.createHorizontalStrut(10)); + aufgebenUndo.add(Box.createHorizontalStrut(10)); - JButton safe = new JButton("Spielstand sichern"); - safe.setBackground(Color.LIGHT_GRAY); - safe.setForeground(Color.BLACK); - safe.setFont(new Font("Tahoma", Font.BOLD, 16)); - safe.setAlignmentX(Component.CENTER_ALIGNMENT); - aufgebenUndo.add(safe); + JButton safe = new JButton("Spielstand sichern"); + safe.setBackground(Color.LIGHT_GRAY); + safe.setForeground(Color.BLACK); + safe.setFont(new Font("Tahoma", Font.BOLD, 16)); + safe.setAlignmentX(Component.CENTER_ALIGNMENT); + aufgebenUndo.add(safe); - // Button-Listener - safe.addActionListener(new ButtonFileSaverListener(this, this.game)); + // Button-Listener + safe.addActionListener(new ButtonFileSaverListener(this, this.game)); - playerTwo.add(aufgebenUndo); + playerTwo.add(aufgebenUndo); - playerTwo.add(Box.createVerticalStrut(10)); + playerTwo.add(Box.createVerticalStrut(10)); - return playerTwo; - } + return playerTwo; + } - private JPanel getUiStatistik() { + private JPanel getUiStatistik() { - JPanel statistik = new JPanel(); - statistik.setBackground(new Color(90, 90, 90)); - statistik.setLayout(new BoxLayout(statistik, BoxLayout.Y_AXIS)); + JPanel statistik = new JPanel(); + statistik.setBackground(new Color(90, 90, 90)); + statistik.setLayout(new BoxLayout(statistik, BoxLayout.Y_AXIS)); - ausgabe = new JTextArea(); - ausgabe.setEditable(false); - ausgabe.setBackground(new Color(75, 75, 75)); - ausgabe.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1)); - ausgabe.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 20)); - ausgabe.setForeground(Color.BLACK); - ausgabe.setText("\n Bisherige Züge:\n"); + ausgabe = new JTextArea(); + ausgabe.setEditable(false); + ausgabe.setBackground(new Color(75, 75, 75)); + ausgabe.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1)); + ausgabe.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 20)); + ausgabe.setForeground(Color.BLACK); + ausgabe.setText("\n Bisherige Züge:\n"); - JScrollPane scrollPane = new JScrollPane(ausgabe); - scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); + JScrollPane scrollPane = new JScrollPane(ausgabe); + scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); - statistik.add(scrollPane); + statistik.add(scrollPane); - return statistik; - } + return statistik; + } - public void aktualisiereAusgabe() { - StringBuilder sb = new StringBuilder(); - sb.append("\n Bisherige Züge:\n"); + public void aktualisiereAusgabe() { + StringBuilder sb = new StringBuilder(); + sb.append("\n Bisherige Züge:\n"); - MoveList l = game.getMoveList(); - for (Move m: l) { - sb.append(" "+game.getUnicodeFromMove(m)+": "+m.toString()+"\n"); - } + MoveList l = game.getMoveList(); + for (Move m : l) { + sb.append(" " + game.getUnicodeFromMove(m) + ": " + m.toString() + "\n"); + } - ausgabe.setText(sb.toString()); - } + ausgabe.setText(sb.toString()); + } + public void deleteLastAusgabe() { + String[] zeilen = ausgabe.getText().split("\n"); - public void deleteLastAusgabe() { - String[] zeilen = ausgabe.getText().split("\n"); + // es müssen immer mind 5 Zeilen existieren, dass also 1 Zug löschbar ist + if (zeilen.length <= 2) + return; - //es müssen immer mind 5 Zeilen existieren, dass also 1 Zug löschbar ist - if (zeilen.length <= 2) return; + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < zeilen.length - 1; i++) { + sb.append(zeilen[i]).append("\n"); + } - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < zeilen.length - 1; i++) { - sb.append(zeilen[i]).append("\n"); - } + ausgabe.setText(sb.toString()); + } - ausgabe.setText(sb.toString()); - } + private JPanel getUiPlayerOne() { - private JPanel getUiPlayerOne() { + JPanel playerOne = new JPanel(); + playerOne.setBackground(new Color(90, 90, 90)); + playerOne.setLayout(new BoxLayout(playerOne, BoxLayout.Y_AXIS)); - JPanel playerOne = new JPanel(); - playerOne.setBackground(new Color(90, 90, 90)); - playerOne.setLayout(new BoxLayout(playerOne, BoxLayout.Y_AXIS)); + playerOne.add(Box.createVerticalStrut(10)); - playerOne.add(Box.createVerticalStrut(10)); + // Button zurücknahme und aufgeben für Player 1 + JPanel aufgebenUndo = new JPanel(); + aufgebenUndo.setBackground(new Color(90, 90, 90)); + aufgebenUndo.setLayout(new BoxLayout(aufgebenUndo, BoxLayout.X_AXIS)); - // Button zurücknahme und aufgeben für Player 1 - JPanel aufgebenUndo = new JPanel(); - aufgebenUndo.setBackground(new Color(90, 90, 90)); - aufgebenUndo.setLayout(new BoxLayout(aufgebenUndo, BoxLayout.X_AXIS)); + if (game.isZuruecknahme()) { + 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); - if (game.isZuruecknahme()) { - 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 + undo2.addActionListener(new ButtonUndoMoveListener(this, this.game)); - // Button-Listener - undo2.addActionListener(new ButtonUndoMoveListener(this, this.game)); + } - } + aufgebenUndo.add(Box.createHorizontalStrut(10)); - aufgebenUndo.add(Box.createHorizontalStrut(10)); + JButton aufgeben = new JButton("Aufgeben"); + aufgeben.setBackground(Color.LIGHT_GRAY); + aufgeben.setForeground(Color.BLACK); + aufgeben.setFont(new Font("Tahoma", Font.BOLD, 16)); + aufgeben.setAlignmentX(Component.CENTER_ALIGNMENT); + aufgebenUndo.add(aufgeben); - JButton aufgeben = new JButton("Aufgeben"); - aufgeben.setBackground(Color.LIGHT_GRAY); - aufgeben.setForeground(Color.BLACK); - aufgeben.setFont(new Font("Tahoma", Font.BOLD, 16)); - aufgeben.setAlignmentX(Component.CENTER_ALIGNMENT); - aufgebenUndo.add(aufgeben); + // Button-Listener + aufgeben.addActionListener(new ButtonAufgebenListener()); - // Button-Listener - aufgeben.addActionListener(new ButtonAufgebenListener()); + aufgebenUndo.add(Box.createHorizontalStrut(10)); - aufgebenUndo.add(Box.createHorizontalStrut(10)); + JButton safe = new JButton("Spielstand sichern"); + safe.setBackground(Color.LIGHT_GRAY); + safe.setForeground(Color.BLACK); + safe.setFont(new Font("Tahoma", Font.BOLD, 16)); + safe.setAlignmentX(Component.CENTER_ALIGNMENT); + aufgebenUndo.add(safe); - JButton safe = new JButton("Spielstand sichern"); - safe.setBackground(Color.LIGHT_GRAY); - safe.setForeground(Color.BLACK); - safe.setFont(new Font("Tahoma", Font.BOLD, 16)); - safe.setAlignmentX(Component.CENTER_ALIGNMENT); - aufgebenUndo.add(safe); + // Button-Listener + safe.addActionListener(new ButtonFileSaverListener(this, this.game)); - // Button-Listener - safe.addActionListener(new ButtonFileSaverListener(this, this.game)); + playerOne.add(aufgebenUndo); - playerOne.add(aufgebenUndo); + playerOne.add(Box.createVerticalStrut(15)); - playerOne.add(Box.createVerticalStrut(15)); + JLabel clock1 = clock.getClock1(); + playerOne.add(clock1); - JLabel clock1 = clock.getClock1(); - playerOne.add(clock1); + playerOne.add(Box.createVerticalStrut(10)); - playerOne.add(Box.createVerticalStrut(10)); + JLabel pl2 = new JLabel("Player 1:"); + pl2.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 0)); + pl2.setFont(new Font("Calibri", Font.BOLD, 35)); + pl2.setForeground(Color.BLACK); + pl2.setAlignmentX(Component.CENTER_ALIGNMENT); + playerOne.add(pl2); - JLabel pl2 = new JLabel("Player 1:"); - pl2.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 0)); - pl2.setFont(new Font("Calibri", Font.BOLD, 35)); - pl2.setForeground(Color.BLACK); - pl2.setAlignmentX(Component.CENTER_ALIGNMENT); - playerOne.add(pl2); + return playerOne; + } - return playerOne; - } + public void setBoardMode(BoardMode bm) { + this.mode = bm; + } - public void setBoardMode(BoardMode bm) { - this.mode = bm; - } + public void setSelectedSquare(Square sq) { + this.selectedSquare = sq; + } - public void setSelectedSquare(Square sq) { - this.selectedSquare = sq; - } + public HashMap getBelegung() { + return this.belegungen; + } - public HashMap getBelegung() { - return this.belegungen; - } + public JButton getUndo() { + return undo; + } - public JButton getUndo() { - return undo; - } + public JButton getUndo2() { + return undo2; + } - public JButton getUndo2() { - return undo2; - } + public BoardMode getMode() { + return mode; + } - public BoardMode getMode() { - return mode; - } - - public Clock getClock() { - return clock; - } + public Clock getClock() { + return clock; + } }