From bffb1ff60fec8b8b15c89dd3036f5fbc74b9c634 Mon Sep 17 00:00:00 2001 From: stuckd Date: Tue, 17 Jun 2025 14:54:11 +0200 Subject: [PATCH 01/15] refactor move highlighting --- .classpath | 19 +- .project | 13 +- .../de/mannheim/th/chess/domain/Game.java | 15 + .../de/mannheim/th/chess/ui/SpielFrame.java | 399 +++++++++++------- 4 files changed, 291 insertions(+), 155 deletions(-) diff --git a/.classpath b/.classpath index e571fe4..4e7f670 100644 --- a/.classpath +++ b/.classpath @@ -36,7 +36,22 @@ - - + + + + + + + + + + + + + + + + + diff --git a/.project b/.project index a2ac3b0..c614d18 100644 --- a/.project +++ b/.project @@ -1,6 +1,6 @@ - Schach + SchachMVN @@ -20,4 +20,15 @@ org.eclipse.jdt.core.javanature org.eclipse.m2e.core.maven2Nature + + + 1750157105125 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + 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 f880fa8..63e9bf5 100644 --- a/src/main/java/de/mannheim/th/chess/domain/Game.java +++ b/src/main/java/de/mannheim/th/chess/domain/Game.java @@ -7,6 +7,7 @@ import com.github.bhlangonijr.chesslib.Board; import com.github.bhlangonijr.chesslib.Square; import com.github.bhlangonijr.chesslib.move.Move; import com.github.bhlangonijr.chesslib.move.MoveList; +import com.github.bhlangonijr.chesslib.pgn.PgnHolder; import de.mannheim.th.chess.utl.Clock; @@ -104,7 +105,21 @@ public class Game { } + public List getAllLegalMoveableSquares() { + return this.board.legalMoves().stream() + .map(move -> move.getFrom()) + .collect(Collectors.toList()); + } + + public List getLegalMoveableSquares(Square square) { + return this.board.legalMoves().stream() + .filter(move -> move.getFrom() == square) + .map(move -> move.getTo()) + .collect(Collectors.toList()); + } + public String toFEN() { + board.toString(); return board.getFen(); } } 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 e4ed32d..ce041d6 100644 --- a/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java +++ b/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java @@ -2,6 +2,7 @@ package de.mannheim.th.chess.ui; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.core.pattern.AbstractStyleNameConverter.Red; import com.github.bhlangonijr.chesslib.Board; import com.github.bhlangonijr.chesslib.File; @@ -53,6 +54,14 @@ public class SpielFrame extends JFrame { private boolean playerWhite = true; private boolean moveFinished = false; + private BoardMode mode; + private Square selectedSquare; + + enum BoardMode { + normal, + pieceSelected, + } + /** * Launch the application. Die Main-Methode für den WindowBuilder. */ @@ -75,6 +84,7 @@ public class SpielFrame extends JFrame { public SpielFrame() { game = new Game(); + mode = BoardMode.normal; setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 1920, 1080); @@ -108,168 +118,217 @@ public class SpielFrame extends JFrame { * Erstellt alle Buttons und fügt sie dem Frame hinzu. */ private void erstelleBrett() { - for (int i = 0; i < 64; i++) { - JButton b = new JButton(); - b.setFocusPainted(false); - b.setFont(new Font("Arial", Font.PLAIN, 30)); - 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)); - } + clearButtons(); + setDefaultBackground(); - b.setForeground(Color.WHITE); - b.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1)); - b.addActionListener(new ActionListener() { + List selectables; - @Override - public void actionPerformed(ActionEvent e) { + switch (this.mode) { + case BoardMode.normal: + selectables = game.getAllLegalMoveableSquares(); - // setzt alle Roten Felder zurück - for (JButton b : farben.keySet()) { + System.out.println(selectables); - if (b.getBackground().equals(new Color(230, 100, 100))) { - - b.setBackground(farben.get(b)); + for (Square square : selectables) { + final Square currentSquare = square; // ActionListener need it to be final + JButton b = buttons.get(63 - square.ordinal()); + b.setEnabled(true); + b.setBackground(Color.green); + b.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + System.out.println("switch to selected"); + mode = BoardMode.pieceSelected; + selectedSquare = currentSquare; + erstelleBrett(); } - } - - // wenn weiß dran - if (playerWhite) { - - // wenn gerade Figur ausgewählt wird... - buttonChoosed = (JButton) e.getSource(); - symbolChoosed = belegungen.get(buttonChoosed); - - // setzt cursor auf spielfigur für die animation - String pfad = "src/main/resources/" + (int) symbolChoosed.toCharArray()[2] + ".png"; - - // Bild laden und Cursor im gesamten Frame setzen - Image image = Toolkit.getDefaultToolkit().getImage(pfad); - Image scaled = image.getScaledInstance(32, 32, Image.SCALE_SMOOTH); - Cursor figurCursor = Toolkit.getDefaultToolkit().createCustomCursor(scaled, new Point(0, 0), - "figurCursor"); - setCursor(figurCursor); - - // filtert möglichen Züge heraus - int position = positions.get(buttonChoosed); - - clickableButtons = game - .getLegalMoves( - Square.encode(Rank.allRanks[7 - position / 8], File.allFiles[position % 8])) - .stream().peek(System.out::println).map(m -> m.getTo()).peek(System.out::println) - .map(s -> 56 - s.getRank().ordinal() * 8 + s.getFile().ordinal()) - .collect(Collectors.toList()); - - // filtert mögliche Züge und nicht mögliche Züge in eine Map aus Listen - Map> buttonsSeperated = buttons.stream() - .collect(Collectors.partitioningBy(b -> clickableButtons.contains(buttons.indexOf(b)))); - - for (Boolean list : buttonsSeperated.keySet()) { - - if (list) { - // alle möglichen felder rot markieren - for (JButton b : positions.keySet()) { - // wenn button ein möglicher zug ist - if (clickableButtons.contains(positions.get(b))) { - farben.put(b, b.getBackground()); // damit sich gemerkt werden kann welches feld welche farbe vorher - // hatte - b.setBackground(new Color(230, 100, 100)); - - } - } - - } else { - // den rest der buttons ausser die möglichen züge deaktivieren - List andere = buttonsSeperated.get(list); - - for (JButton b : andere) { - if (!belegungen.get(b).split("-")[0].equals("w")) { - b.setEnabled(false); - } - } - } - } - - // alle weisen squares deaktivieren, damit dannach klar ist wer dran ist - for (JButton b : belegungen.keySet()) { - if (belegungen.get(b).split("-")[0].equals("b")) { - b.setEnabled(false); - } - } - - } else { - - // wenn gerade Figur ausgewählt wird... - buttonChoosed = (JButton) e.getSource(); - symbolChoosed = belegungen.get(buttonChoosed); - // System.out.println(symbolChoosed+" wurde gewählt."); - // setzt cursor auf spielfigur für die animation - String pfad = "src/main/resources/" + (int) symbolChoosed.toCharArray()[2] + ".png"; - - // Bild laden und Cursor im gesamten Frame setzen - Image image = Toolkit.getDefaultToolkit().getImage(pfad); - Image scaled = image.getScaledInstance(32, 32, Image.SCALE_SMOOTH); - Cursor figurCursor = Toolkit.getDefaultToolkit().createCustomCursor(scaled, new Point(0, 0), - "figurCursor"); - setCursor(figurCursor); - - // filtert möglichen Züge heraus - int position = positions.get(buttonChoosed); - List clickableButtons = new ArrayList<>(); - clickableButtons = game - .getLegalMoves( - Square.encode(Rank.allRanks[7 - position / 8], File.allFiles[position % 8])) - .stream().peek(System.out::println).map(m -> m.getTo()).peek(System.out::println) - .map(s -> 56 - s.getRank().ordinal() * 8 + s.getFile().ordinal()) - .collect(Collectors.toList()); - - for (JButton b : positions.keySet()) { - // wenn button ein möglicher zug ist - if (clickableButtons.contains(positions.get(b))) { - b.setBackground(new Color(230, 100, 100)); - } - } - - // alle schwarzen squares deaktivieren, damit dannach klar ist wer dran ist - for (JButton b : belegungen.keySet()) { - if (belegungen.get(b).split("-")[0].equals("w")) { - b.setEnabled(false); - } - } - - } - - // alle anderen Buttons nicht ckickbar zu machen - - // Button Icon zurücksetzen - - // Buttonposition merken (in MoveListe oder so) - - // wenn Button platzierd werden soll... - - // neuen Button in Moveliste eintragen - - // Icon ändern - - // Modus auf auswählen setzen und spielerwechsel markieren - - // spielerwechsel - if (moveFinished) - playerWhite = !playerWhite; - + }); } - }); - panelLinks.add(b); - buttons.add(b); - positions.put(b, i); + break; + + case BoardMode.pieceSelected: + JButton s = buttons.get(63 - selectedSquare.ordinal()); + s.setEnabled(true); + s.setBackground(Color.orange); + s.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + mode = BoardMode.normal; + selectedSquare = null; + erstelleBrett(); + } + }); // cancel action + + selectables = game.getLegalMoveableSquares(selectedSquare); + + for (Square square : selectables) { + JButton b = buttons.get(63 - square.ordinal()); + b.setEnabled(true); + b.setBackground(Color.RED); + b.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + System.out.println("switch to normal"); + mode = BoardMode.normal; + erstelleBrett(); + } + }); + } + + break; + default: + break; } + for (JButton b : this.buttons) { + panelLinks.add(b); + } + + // int i = 0;i<64;i++) + // { + // + // // wenn gerade Figur ausgewählt wird... + // buttonChoosed = (JButton) e.getSource(); + // symbolChoosed = belegungen.get(buttonChoosed); + // + // // setzt cursor auf spielfigur für die animation + // String pfad = "src/main/resources/" + (int) symbolChoosed.toCharArray()[2] + + // ".png"; + // + // // Bild laden und Cursor im gesamten Frame setzen + // Image image = Toolkit.getDefaultToolkit().getImage(pfad); + // Image scaled = image.getScaledInstance(32, 32, Image.SCALE_SMOOTH); + // Cursor figurCursor = Toolkit.getDefaultToolkit().createCustomCursor(scaled, + // new Point(0, 0), + // "figurCursor"); + // setCursor(figurCursor); + // + // // filtert möglichen Züge heraus + // int position = positions.get(buttonChoosed); + // + // clickableButtons = game + // .getLegalMoves( + // Square.encode(Rank.allRanks[7 - position / 8], File.allFiles[position % 8])) + // .stream().peek(System.out::println).map(m -> + // m.getTo()).peek(System.out::println) + // .map(s -> 56 - s.getRank().ordinal() * 8 + s.getFile().ordinal()) + // .collect(Collectors.toList()); + // + // // filtert mögliche Züge und nicht mögliche Züge in eine Map aus Listen + // Map> buttonsSeperated = buttons.stream() + // .collect(Collectors.partitioningBy(b -> + // clickableButtons.contains(buttons.indexOf(b)))); + // + // for (Boolean list : buttonsSeperated.keySet()) { + // + // if (list) { + // // alle möglichen felder rot markieren + // for (JButton b : positions.keySet()) { + // // wenn button ein möglicher zug ist + // if (clickableButtons.contains(positions.get(b))) { + // farben.put(b, b.getBackground()); // damit sich gemerkt werden kann welches + // feld welche farbe vorher + // // hatte + // b.setBackground(new Color(230, 100, 100)); + // + // } + // } + // + // } else { + // // den rest der buttons ausser die möglichen züge deaktivieren + // List andere = buttonsSeperated.get(list); + // + // for (JButton b : andere) { + // if (!belegungen.get(b).split("-")[0].equals("w")) { + // b.setEnabled(false); + // } + // } + // } + // } + // + // // alle weisen squares deaktivieren, damit dannach klar ist wer dran ist + // for (JButton b : belegungen.keySet()) { + // if (belegungen.get(b).split("-")[0].equals("b")) { + // b.setEnabled(false); + // } + // } + // + // }else + // { + // + // // wenn gerade Figur ausgewählt wird... + // buttonChoosed = (JButton) e.getSource(); + // symbolChoosed = belegungen.get(buttonChoosed); + // // System.out.println(symbolChoosed+" wurde gewählt."); + // // setzt cursor auf spielfigur für die animation + // String pfad = "src/main/resources/" + (int) symbolChoosed.toCharArray()[2] + + // ".png"; + // + // // Bild laden und Cursor im gesamten Frame setzen + // Image image = Toolkit.getDefaultToolkit().getImage(pfad); + // Image scaled = image.getScaledInstance(32, 32, Image.SCALE_SMOOTH); + // Cursor figurCursor = Toolkit.getDefaultToolkit().createCustomCursor(scaled, + // new Point(0, 0), + // "figurCursor"); + // setCursor(figurCursor); + // + // // filtert möglichen Züge heraus + // int position = positions.get(buttonChoosed); + // List clickableButtons = new ArrayList<>(); + // clickableButtons = game + // .getLegalMoves( + // Square.encode(Rank.allRanks[7 - position / 8], File.allFiles[position % 8])) + // .stream().peek(System.out::println).map(m -> + // m.getTo()).peek(System.out::println) + // .map(s -> 56 - s.getRank().ordinal() * 8 + s.getFile().ordinal()) + // .collect(Collectors.toList()); + // + // for (JButton b : positions.keySet()) { + // // wenn button ein möglicher zug ist + // if (clickableButtons.contains(positions.get(b))) { + // b.setBackground(new Color(230, 100, 100)); + // } + // } + // + // // alle schwarzen squares deaktivieren, damit dannach klar ist wer dran ist + // for (JButton b : belegungen.keySet()) { + // if (belegungen.get(b).split("-")[0].equals("w")) { + // b.setEnabled(false); + // } + // } + // + // } + // + // // alle anderen Buttons nicht ckickbar zu machen + // + // // Button Icon zurücksetzen + // + // // Buttonposition merken (in MoveListe oder so) + // + // // wenn Button platzierd werden soll... + // + // // neuen Button in Moveliste eintragen + // + // // Icon ändern + // + // // Modus auf auswählen setzen und spielerwechsel markieren + // + // // spielerwechsel + // if(moveFinished)playerWhite=!playerWhite; + // + // } + // + // }); + + // panelLinks.add(b); + // buttons.add(b); + // positions.put(b, i); + // + // } + ladeBrett(); } @@ -287,7 +346,8 @@ public class SpielFrame extends JFrame { 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. + // buttons.get(i).setEnabled(false); // erstmal deaktivieren, weil leere Felder + // nicht ckickbar sein sollten. i++; } continue; @@ -303,4 +363,39 @@ public class SpielFrame extends JFrame { } } + + private void clearButtons() { + buttons.clear(); + panelLinks.removeAll(); + + for (int i = 0; i < 64; i++) { + JButton b = new JButton(); + + 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 + ""); + + buttons.add(b); + } + } + + 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)); + } + } + } + } -- 2.43.0 From 96e5648833d41f711b2abca1647627940ddf8160 Mon Sep 17 00:00:00 2001 From: stuckd Date: Tue, 17 Jun 2025 16:15:54 +0200 Subject: [PATCH 02/15] add playablility --- .../de/mannheim/th/chess/ui/SpielFrame.java | 150 ++++++++++-------- 1 file changed, 83 insertions(+), 67 deletions(-) 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 ce041d6..a55af04 100644 --- a/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java +++ b/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java @@ -8,6 +8,7 @@ import com.github.bhlangonijr.chesslib.Board; import com.github.bhlangonijr.chesslib.File; import com.github.bhlangonijr.chesslib.Rank; import com.github.bhlangonijr.chesslib.Square; +import com.github.bhlangonijr.chesslib.move.Move; import de.mannheim.th.chess.App; import de.mannheim.th.chess.domain.Game; @@ -119,73 +120,14 @@ public class SpielFrame extends JFrame { */ private void erstelleBrett() { - clearButtons(); - setDefaultBackground(); + this.clearButtons(); + this.setDefaultBackground(); + this.setButtonsActions(); - List selectables; + ladeBrett(); - switch (this.mode) { - case BoardMode.normal: - selectables = game.getAllLegalMoveableSquares(); - - System.out.println(selectables); - - for (Square square : selectables) { - final Square currentSquare = square; // ActionListener need it to be final - JButton b = buttons.get(63 - square.ordinal()); - b.setEnabled(true); - b.setBackground(Color.green); - b.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - System.out.println("switch to selected"); - mode = BoardMode.pieceSelected; - selectedSquare = currentSquare; - erstelleBrett(); - } - }); - } - - break; - - case BoardMode.pieceSelected: - JButton s = buttons.get(63 - selectedSquare.ordinal()); - s.setEnabled(true); - s.setBackground(Color.orange); - s.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - mode = BoardMode.normal; - selectedSquare = null; - erstelleBrett(); - } - }); // cancel action - - selectables = game.getLegalMoveableSquares(selectedSquare); - - for (Square square : selectables) { - JButton b = buttons.get(63 - square.ordinal()); - b.setEnabled(true); - b.setBackground(Color.RED); - b.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - System.out.println("switch to normal"); - mode = BoardMode.normal; - erstelleBrett(); - } - }); - } - - break; - default: - break; - - } - - for (JButton b : this.buttons) { - panelLinks.add(b); - } + panelLinks.revalidate(); + panelLinks.repaint(); // int i = 0;i<64;i++) // { @@ -329,8 +271,10 @@ public class SpielFrame extends JFrame { // // } - ladeBrett(); + } + private int mirrowedGrid(int i) { + return 63 - (((i / 8) * 8) + (7 - i % 8)); } /** @@ -355,7 +299,8 @@ public class SpielFrame extends JFrame { 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).setEnabled(false); // erstmal deaktivieren, damit weiß + // beginnen kann } buttons.get(i).setIcon(new ImageIcon("src/main/resources/" + (int) fen[j] + ".png")); @@ -383,6 +328,10 @@ public class SpielFrame extends JFrame { buttons.add(b); } + + for (int i = 0; i < buttons.size(); i++) { + buttons.get(i).setText(String.valueOf(i)); // Update button text to its index + } } private void setDefaultBackground() { @@ -398,4 +347,71 @@ public class SpielFrame extends JFrame { } } + private void setButtonsActions() { + + List selectables; + + switch (this.mode) { + case BoardMode.normal: + selectables = game.getAllLegalMoveableSquares(); + + for (Square square : selectables) { + final Square currentSquare = square; // ActionListener need it to be final + JButton b = buttons.get(mirrowedGrid(square.ordinal())); + b.setEnabled(true); + b.setBackground(Color.green); + b.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + mode = BoardMode.pieceSelected; + selectedSquare = currentSquare; + erstelleBrett(); + } + }); + } + + break; + + case BoardMode.pieceSelected: + JButton s = buttons.get(mirrowedGrid(selectedSquare.ordinal())); + s.setEnabled(true); + s.setBackground(Color.orange); + s.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + mode = BoardMode.normal; + selectedSquare = null; + erstelleBrett(); + } + }); // cancel action + + selectables = game.getLegalMoveableSquares(selectedSquare); + + for (Square square : selectables) { + JButton b = buttons.get(mirrowedGrid(square.ordinal())); + final Move move = new Move(selectedSquare, square); + b.setEnabled(true); + b.setBackground(Color.RED); + b.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + game.playMove(move); + mode = BoardMode.normal; + erstelleBrett(); + } + }); + } + + break; + default: + break; + + } + + // Add reversed buttons to the panel + for (JButton b : buttons) { + panelLinks.add(b); + } + } + } -- 2.43.0 From a536482dbf92ed0037e699f1e00afaad98194802 Mon Sep 17 00:00:00 2001 From: dstuck Date: Tue, 17 Jun 2025 16:47:36 +0200 Subject: [PATCH 03/15] fix icon rendering --- src/main/java/de/mannheim/th/chess/ui/SpielFrame.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) 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 a55af04..13a7feb 100644 --- a/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java +++ b/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java @@ -303,6 +303,7 @@ public class SpielFrame extends JFrame { // 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++; @@ -328,10 +329,6 @@ public class SpielFrame extends JFrame { buttons.add(b); } - - for (int i = 0; i < buttons.size(); i++) { - buttons.get(i).setText(String.valueOf(i)); // Update button text to its index - } } private void setDefaultBackground() { @@ -408,7 +405,6 @@ public class SpielFrame extends JFrame { } - // Add reversed buttons to the panel for (JButton b : buttons) { panelLinks.add(b); } -- 2.43.0 From 7fcf514d7a0d1d9aaf27a1a58f651c4b427d91b6 Mon Sep 17 00:00:00 2001 From: dstuck Date: Wed, 18 Jun 2025 04:41:53 +0200 Subject: [PATCH 04/15] add tests --- .../de/mannheim/th/chess/domain/GameTest.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/test/java/de/mannheim/th/chess/domain/GameTest.java b/src/test/java/de/mannheim/th/chess/domain/GameTest.java index 4242264..cdf123e 100644 --- a/src/test/java/de/mannheim/th/chess/domain/GameTest.java +++ b/src/test/java/de/mannheim/th/chess/domain/GameTest.java @@ -2,6 +2,7 @@ package de.mannheim.th.chess.domain; import static org.junit.jupiter.api.Assertions.assertEquals; +import java.util.Arrays; import java.util.List; import org.junit.jupiter.api.Test; @@ -24,4 +25,31 @@ public class GameTest { assertEquals("a2a4", list.getLast().toString()); } + + @Test + void getLegalMoveableSquaresTest() { + Game game = new Game(); + Square square = Square.A2; + + List controllList = Arrays.asList(Square.A3, Square.A4); + assertEquals(controllList, game.getLegalMoveableSquares(square)); + + game = new Game("k7/8/8/8/8/8/8/K6N w - - 0 1"); + square = Square.H1; + controllList = Arrays.asList(Square.F2, Square.G3); + assertEquals(controllList, game.getLegalMoveableSquares(square)); + } + + @Test + void getAllLegalMoveableSquaresTest() { + Game game = new Game(); + + List controllList = Arrays.asList(Square.A2, Square.B2, Square.C2, Square.D2, Square.E2, Square.F2, + Square.G2, Square.H2, Square.B1, Square.G1); + assertEquals(controllList, game.getAllLegalMoveableSquares()); + + game = new Game("k7/8/8/8/8/8/8/K6N w - - 0 1"); + controllList = Arrays.asList(Square.H1, Square.A1); + assertEquals(controllList, game.getAllLegalMoveableSquares()); + } } -- 2.43.0 From 3cf3ad2159d0c8c6bfd378cc8eaaf657455a02cc Mon Sep 17 00:00:00 2001 From: dstuck Date: Wed, 18 Jun 2025 04:42:46 +0200 Subject: [PATCH 05/15] fix duplicates bug --- src/main/java/de/mannheim/th/chess/domain/Game.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) 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 63e9bf5..0375307 100644 --- a/src/main/java/de/mannheim/th/chess/domain/Game.java +++ b/src/main/java/de/mannheim/th/chess/domain/Game.java @@ -105,12 +105,25 @@ public class Game { } + /** + * 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. + * + * @param square the Square from which to retrieve legal moveable squares + * @return a List of Square objects representing the legal moveable squares + * from the specified square. + */ public List getLegalMoveableSquares(Square square) { return this.board.legalMoves().stream() .filter(move -> move.getFrom() == square) -- 2.43.0 From 8fddab12c323d33a8003ab1b93ebed45d67c61a9 Mon Sep 17 00:00:00 2001 From: dstuck Date: Wed, 18 Jun 2025 04:43:01 +0200 Subject: [PATCH 06/15] cleanup --- .../de/mannheim/th/chess/ui/SpielFrame.java | 155 +++--------------- 1 file changed, 26 insertions(+), 129 deletions(-) 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 13a7feb..2e5ad9a 100644 --- a/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java +++ b/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java @@ -2,11 +2,7 @@ package de.mannheim.th.chess.ui; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.core.pattern.AbstractStyleNameConverter.Red; -import com.github.bhlangonijr.chesslib.Board; -import com.github.bhlangonijr.chesslib.File; -import com.github.bhlangonijr.chesslib.Rank; import com.github.bhlangonijr.chesslib.Square; import com.github.bhlangonijr.chesslib.move.Move; @@ -44,16 +40,9 @@ public class SpielFrame extends JFrame { private static final long serialVersionUID = 1L; private JPanel contentPane; private ArrayList buttons = new ArrayList<>(); - private List clickableButtons = new ArrayList<>(); - private HashMap positions = new HashMap<>(); private HashMap belegungen = new HashMap<>(); - private HashMap farben = new HashMap<>(); private JPanel panelLinks, panelRechts; private Game game; - private String symbolChoosed; - private JButton buttonChoosed; - private boolean playerWhite = true; - private boolean moveFinished = false; private BoardMode mode; private Square selectedSquare; @@ -129,17 +118,6 @@ public class SpielFrame extends JFrame { panelLinks.revalidate(); panelLinks.repaint(); - // int i = 0;i<64;i++) - // { - // - // // wenn gerade Figur ausgewählt wird... - // buttonChoosed = (JButton) e.getSource(); - // symbolChoosed = belegungen.get(buttonChoosed); - // - // // setzt cursor auf spielfigur für die animation - // String pfad = "src/main/resources/" + (int) symbolChoosed.toCharArray()[2] + - // ".png"; - // // // Bild laden und Cursor im gesamten Frame setzen // Image image = Toolkit.getDefaultToolkit().getImage(pfad); // Image scaled = image.getScaledInstance(32, 32, Image.SCALE_SMOOTH); @@ -147,57 +125,7 @@ public class SpielFrame extends JFrame { // new Point(0, 0), // "figurCursor"); // setCursor(figurCursor); - // - // // filtert möglichen Züge heraus - // int position = positions.get(buttonChoosed); - // - // clickableButtons = game - // .getLegalMoves( - // Square.encode(Rank.allRanks[7 - position / 8], File.allFiles[position % 8])) - // .stream().peek(System.out::println).map(m -> - // m.getTo()).peek(System.out::println) - // .map(s -> 56 - s.getRank().ordinal() * 8 + s.getFile().ordinal()) - // .collect(Collectors.toList()); - // - // // filtert mögliche Züge und nicht mögliche Züge in eine Map aus Listen - // Map> buttonsSeperated = buttons.stream() - // .collect(Collectors.partitioningBy(b -> - // clickableButtons.contains(buttons.indexOf(b)))); - // - // for (Boolean list : buttonsSeperated.keySet()) { - // - // if (list) { - // // alle möglichen felder rot markieren - // for (JButton b : positions.keySet()) { - // // wenn button ein möglicher zug ist - // if (clickableButtons.contains(positions.get(b))) { - // farben.put(b, b.getBackground()); // damit sich gemerkt werden kann welches - // feld welche farbe vorher - // // hatte - // b.setBackground(new Color(230, 100, 100)); - // - // } - // } - // - // } else { - // // den rest der buttons ausser die möglichen züge deaktivieren - // List andere = buttonsSeperated.get(list); - // - // for (JButton b : andere) { - // if (!belegungen.get(b).split("-")[0].equals("w")) { - // b.setEnabled(false); - // } - // } - // } - // } - // - // // alle weisen squares deaktivieren, damit dannach klar ist wer dran ist - // for (JButton b : belegungen.keySet()) { - // if (belegungen.get(b).split("-")[0].equals("b")) { - // b.setEnabled(false); - // } - // } - // + // }else // { // @@ -216,61 +144,6 @@ public class SpielFrame extends JFrame { // new Point(0, 0), // "figurCursor"); // setCursor(figurCursor); - // - // // filtert möglichen Züge heraus - // int position = positions.get(buttonChoosed); - // List clickableButtons = new ArrayList<>(); - // clickableButtons = game - // .getLegalMoves( - // Square.encode(Rank.allRanks[7 - position / 8], File.allFiles[position % 8])) - // .stream().peek(System.out::println).map(m -> - // m.getTo()).peek(System.out::println) - // .map(s -> 56 - s.getRank().ordinal() * 8 + s.getFile().ordinal()) - // .collect(Collectors.toList()); - // - // for (JButton b : positions.keySet()) { - // // wenn button ein möglicher zug ist - // if (clickableButtons.contains(positions.get(b))) { - // b.setBackground(new Color(230, 100, 100)); - // } - // } - // - // // alle schwarzen squares deaktivieren, damit dannach klar ist wer dran ist - // for (JButton b : belegungen.keySet()) { - // if (belegungen.get(b).split("-")[0].equals("w")) { - // b.setEnabled(false); - // } - // } - // - // } - // - // // alle anderen Buttons nicht ckickbar zu machen - // - // // Button Icon zurücksetzen - // - // // Buttonposition merken (in MoveListe oder so) - // - // // wenn Button platzierd werden soll... - // - // // neuen Button in Moveliste eintragen - // - // // Icon ändern - // - // // Modus auf auswählen setzen und spielerwechsel markieren - // - // // spielerwechsel - // if(moveFinished)playerWhite=!playerWhite; - // - // } - // - // }); - - // panelLinks.add(b); - // buttons.add(b); - // positions.put(b, i); - // - // } - } private int mirrowedGrid(int i) { @@ -310,6 +183,10 @@ public class SpielFrame extends JFrame { } } + /** + * Clears the existing buttons from the button list, panellinks and fills them + * with new blank ones. + */ private void clearButtons() { buttons.clear(); panelLinks.removeAll(); @@ -322,7 +199,6 @@ public class SpielFrame extends JFrame { // 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 + ""); @@ -331,6 +207,9 @@ public class SpielFrame extends JFrame { } } + /** + * 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); @@ -344,6 +223,9 @@ public class SpielFrame extends JFrame { } } + /* + * Switches the button actions depending on the boardmode + */ private void setButtonsActions() { List selectables; @@ -363,6 +245,21 @@ public class SpielFrame extends JFrame { mode = BoardMode.pieceSelected; selectedSquare = currentSquare; erstelleBrett(); + + // buttonChoosed = (JButton) e.getSource(); + // symbolChoosed = belegungen.get(buttonChoosed); + // + // // setzt cursor auf spielfigur für die animation + // String pfad = "src/main/resources/" + (int) symbolChoosed.toCharArray()[2] + + // ".png"; + // + // // Bild laden und Cursor im gesamten Frame setzen + // Image image = Toolkit.getDefaultToolkit().getImage(pfad); + // Image scaled = image.getScaledInstance(32, 32, Image.SCALE_SMOOTH); + // Cursor figurCursor = Toolkit.getDefaultToolkit().createCustomCursor(scaled, + // new Point(0, 0), + // "figurCursor"); + // setCursor(figurCursor); } }); } -- 2.43.0 From 96778e589ca4a3c301fe524203cced446fc3b3fe Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 18 Jun 2025 12:04:09 +0200 Subject: [PATCH 07/15] Cursor setzen repariert. --- .../de/mannheim/th/chess/ui/SpielFrame.java | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) 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 2e5ad9a..5b621a0 100644 --- a/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java +++ b/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java @@ -43,6 +43,7 @@ public class SpielFrame extends JFrame { private HashMap belegungen = new HashMap<>(); private JPanel panelLinks, panelRechts; private Game game; + private String symbolChoosed; private BoardMode mode; private Square selectedSquare; @@ -238,28 +239,28 @@ public class SpielFrame extends JFrame { final Square currentSquare = square; // ActionListener need it to be final JButton b = buttons.get(mirrowedGrid(square.ordinal())); b.setEnabled(true); - b.setBackground(Color.green); + //b.setBackground(Color.green); b.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { mode = BoardMode.pieceSelected; selectedSquare = currentSquare; + + symbolChoosed = belegungen.get(b); + + // setzt cursor auf spielfigur für die animation + String pfad = "src/main/resources/" + (int) symbolChoosed.toCharArray()[2] + + ".png"; + + // Bild laden und Cursor im gesamten Frame setzen + Image image = Toolkit.getDefaultToolkit().getImage(pfad); + Image scaled = image.getScaledInstance(32, 32, Image.SCALE_SMOOTH); + Cursor figurCursor = Toolkit.getDefaultToolkit().createCustomCursor(scaled, + new Point(0, 0), + "figurCursor"); + setCursor(figurCursor); + erstelleBrett(); - - // buttonChoosed = (JButton) e.getSource(); - // symbolChoosed = belegungen.get(buttonChoosed); - // - // // setzt cursor auf spielfigur für die animation - // String pfad = "src/main/resources/" + (int) symbolChoosed.toCharArray()[2] + - // ".png"; - // - // // Bild laden und Cursor im gesamten Frame setzen - // Image image = Toolkit.getDefaultToolkit().getImage(pfad); - // Image scaled = image.getScaledInstance(32, 32, Image.SCALE_SMOOTH); - // Cursor figurCursor = Toolkit.getDefaultToolkit().createCustomCursor(scaled, - // new Point(0, 0), - // "figurCursor"); - // setCursor(figurCursor); } }); } @@ -267,6 +268,7 @@ public class SpielFrame extends JFrame { break; case BoardMode.pieceSelected: + JButton s = buttons.get(mirrowedGrid(selectedSquare.ordinal())); s.setEnabled(true); s.setBackground(Color.orange); @@ -275,6 +277,7 @@ public class SpielFrame extends JFrame { public void actionPerformed(ActionEvent e) { mode = BoardMode.normal; selectedSquare = null; + setCursor(null); erstelleBrett(); } }); // cancel action @@ -291,6 +294,7 @@ public class SpielFrame extends JFrame { public void actionPerformed(ActionEvent e) { game.playMove(move); mode = BoardMode.normal; + setCursor(null); erstelleBrett(); } }); -- 2.43.0 From e709659e45a5768a74799efc333b21a15867559e Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 18 Jun 2025 12:10:49 +0200 Subject: [PATCH 08/15] =?UTF-8?q?Cursor=20setzen=20repariert=20und=20Butto?= =?UTF-8?q?nfarben=20ver=C3=A4ndert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../de/mannheim/th/chess/ui/SpielFrame.java | 465 +++++++++--------- 1 file changed, 231 insertions(+), 234 deletions(-) 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 5b621a0..4f41945 100644 --- a/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java +++ b/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java @@ -35,280 +35,277 @@ import java.awt.event.ActionListener; 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 JPanel contentPane; - private ArrayList buttons = new ArrayList<>(); - private HashMap belegungen = new HashMap<>(); - private JPanel panelLinks, panelRechts; - private Game game; - private String symbolChoosed; + private static final long serialVersionUID = 1L; + private JPanel contentPane; + private ArrayList buttons = new ArrayList<>(); + private HashMap belegungen = new HashMap<>(); + private JPanel panelLinks, panelRechts; + private Game game; + private String symbolChoosed; - private BoardMode mode; - private Square selectedSquare; + private BoardMode mode; + private Square selectedSquare; - enum BoardMode { - normal, - pieceSelected, - } + enum BoardMode { + normal, pieceSelected, + } - /** - * Launch the application. Die Main-Methode für den WindowBuilder. - */ - public static void main(String[] args) { - EventQueue.invokeLater(new Runnable() { - public void run() { - try { - SpielFrame frame = new SpielFrame(); - frame.setVisible(true); - } catch (Exception e) { - e.printStackTrace(); - } - } - }); - } + /** + * Launch the application. Die Main-Methode für den WindowBuilder. + */ + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + SpielFrame frame = new SpielFrame(); + frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } - /** - * Create the frame. - */ - public SpielFrame() { + /** + * Create the frame. + */ + public SpielFrame() { - game = new Game(); - mode = BoardMode.normal; + game = new Game(); + mode = BoardMode.normal; - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - setBounds(100, 100, 1920, 1080); - setTitle("Schach"); - setAlwaysOnTop(true); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setBounds(100, 100, 1920, 1080); + setTitle("Schach"); + setAlwaysOnTop(true); - JPanel contentPane = new JPanel(); - contentPane.setLayout(new BorderLayout()); - setContentPane(contentPane); + JPanel 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(Color.LIGHT_GRAY); + // Rechtes Panel für Steuerung oder zusätzliche Eingaben + panelRechts = new JPanel(); + panelRechts.setBackground(Color.LIGHT_GRAY); - // JSplitPane horizontal (linke und rechte Hälfte) - JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, panelLinks, panelRechts); - splitPane.setResizeWeight(0.70); - splitPane.setDividerSize(5); - splitPane.setEnabled(false); + // JSplitPane horizontal (linke und rechte Hälfte) + JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, panelLinks, panelRechts); + splitPane.setResizeWeight(0.70); + splitPane.setDividerSize(5); + splitPane.setEnabled(false); - contentPane.add(splitPane, BorderLayout.CENTER); - setVisible(true); - } + contentPane.add(splitPane, BorderLayout.CENTER); + setVisible(true); + } - /** - * Erstellt alle Buttons und fügt sie dem Frame hinzu. - */ - private void erstelleBrett() { + /** + * Erstellt alle Buttons und fügt sie dem Frame hinzu. + */ + private void erstelleBrett() { - this.clearButtons(); - this.setDefaultBackground(); - this.setButtonsActions(); + this.clearButtons(); + this.setDefaultBackground(); + this.setButtonsActions(); - ladeBrett(); + ladeBrett(); - panelLinks.revalidate(); - panelLinks.repaint(); + panelLinks.revalidate(); + panelLinks.repaint(); - // // Bild laden und Cursor im gesamten Frame setzen - // Image image = Toolkit.getDefaultToolkit().getImage(pfad); - // Image scaled = image.getScaledInstance(32, 32, Image.SCALE_SMOOTH); - // Cursor figurCursor = Toolkit.getDefaultToolkit().createCustomCursor(scaled, - // new Point(0, 0), - // "figurCursor"); - // setCursor(figurCursor); + // // Bild laden und Cursor im gesamten Frame setzen + // Image image = Toolkit.getDefaultToolkit().getImage(pfad); + // Image scaled = image.getScaledInstance(32, 32, Image.SCALE_SMOOTH); + // Cursor figurCursor = Toolkit.getDefaultToolkit().createCustomCursor(scaled, + // new Point(0, 0), + // "figurCursor"); + // setCursor(figurCursor); - // }else - // { - // - // // wenn gerade Figur ausgewählt wird... - // buttonChoosed = (JButton) e.getSource(); - // symbolChoosed = belegungen.get(buttonChoosed); - // // System.out.println(symbolChoosed+" wurde gewählt."); - // // setzt cursor auf spielfigur für die animation - // String pfad = "src/main/resources/" + (int) symbolChoosed.toCharArray()[2] + - // ".png"; - // - // // Bild laden und Cursor im gesamten Frame setzen - // Image image = Toolkit.getDefaultToolkit().getImage(pfad); - // Image scaled = image.getScaledInstance(32, 32, Image.SCALE_SMOOTH); - // Cursor figurCursor = Toolkit.getDefaultToolkit().createCustomCursor(scaled, - // new Point(0, 0), - // "figurCursor"); - // setCursor(figurCursor); - } + // }else + // { + // + // // wenn gerade Figur ausgewählt wird... + // buttonChoosed = (JButton) e.getSource(); + // symbolChoosed = belegungen.get(buttonChoosed); + // // System.out.println(symbolChoosed+" wurde gewählt."); + // // setzt cursor auf spielfigur für die animation + // String pfad = "src/main/resources/" + (int) symbolChoosed.toCharArray()[2] + + // ".png"; + // + // // Bild laden und Cursor im gesamten Frame setzen + // Image image = Toolkit.getDefaultToolkit().getImage(pfad); + // Image scaled = image.getScaledInstance(32, 32, Image.SCALE_SMOOTH); + // Cursor figurCursor = Toolkit.getDefaultToolkit().createCustomCursor(scaled, + // new Point(0, 0), + // "figurCursor"); + // setCursor(figurCursor); + } - 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() { - buttons.clear(); - panelLinks.removeAll(); + /** + * Clears the existing buttons from the button list, panellinks and fills them + * with new blank ones. + */ + private void clearButtons() { + 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: - selectables = game.getAllLegalMoveableSquares(); + switch (this.mode) { + case BoardMode.normal: + selectables = game.getAllLegalMoveableSquares(); - for (Square square : selectables) { - final Square currentSquare = square; // ActionListener need it to be final - JButton b = buttons.get(mirrowedGrid(square.ordinal())); - b.setEnabled(true); - //b.setBackground(Color.green); - b.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - mode = BoardMode.pieceSelected; - selectedSquare = currentSquare; - - symbolChoosed = belegungen.get(b); - - // setzt cursor auf spielfigur für die animation - String pfad = "src/main/resources/" + (int) symbolChoosed.toCharArray()[2] + - ".png"; - - // Bild laden und Cursor im gesamten Frame setzen - Image image = Toolkit.getDefaultToolkit().getImage(pfad); - Image scaled = image.getScaledInstance(32, 32, Image.SCALE_SMOOTH); - Cursor figurCursor = Toolkit.getDefaultToolkit().createCustomCursor(scaled, - new Point(0, 0), - "figurCursor"); - setCursor(figurCursor); - - erstelleBrett(); - } - }); - } + for (Square square : selectables) { + final Square currentSquare = square; // ActionListener need it to be final + JButton b = buttons.get(mirrowedGrid(square.ordinal())); + b.setEnabled(true); + // b.setBackground(Color.green); + b.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + mode = BoardMode.pieceSelected; + selectedSquare = currentSquare; - break; + symbolChoosed = belegungen.get(b); - case BoardMode.pieceSelected: - - JButton s = buttons.get(mirrowedGrid(selectedSquare.ordinal())); - s.setEnabled(true); - s.setBackground(Color.orange); - s.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - mode = BoardMode.normal; - selectedSquare = null; - setCursor(null); - erstelleBrett(); - } - }); // cancel action + // setzt cursor auf spielfigur für die animation + String pfad = "src/main/resources/" + (int) symbolChoosed.toCharArray()[2] + ".png"; - selectables = game.getLegalMoveableSquares(selectedSquare); + // Bild laden und Cursor im gesamten Frame setzen + Image image = Toolkit.getDefaultToolkit().getImage(pfad); + Image scaled = image.getScaledInstance(32, 32, Image.SCALE_SMOOTH); + Cursor figurCursor = Toolkit.getDefaultToolkit().createCustomCursor(scaled, new Point(0, 0), + "figurCursor"); + setCursor(figurCursor); - for (Square square : selectables) { - JButton b = buttons.get(mirrowedGrid(square.ordinal())); - final Move move = new Move(selectedSquare, square); - b.setEnabled(true); - b.setBackground(Color.RED); - b.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - game.playMove(move); - mode = BoardMode.normal; - setCursor(null); - erstelleBrett(); - } - }); - } + erstelleBrett(); + } + }); + } - break; - default: - break; + break; - } + case BoardMode.pieceSelected: - for (JButton b : buttons) { - panelLinks.add(b); - } - } + JButton s = buttons.get(mirrowedGrid(selectedSquare.ordinal())); + s.setEnabled(true); + s.setBackground(new Color(165, 42, 42)); + s.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + mode = BoardMode.normal; + selectedSquare = null; + setCursor(null); + erstelleBrett(); + } + }); // cancel action + + selectables = game.getLegalMoveableSquares(selectedSquare); + + for (Square square : selectables) { + JButton b = buttons.get(mirrowedGrid(square.ordinal())); + final Move move = new Move(selectedSquare, square); + b.setEnabled(true); + b.setBackground(new Color(230, 100, 100)); + b.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + game.playMove(move); + mode = BoardMode.normal; + setCursor(null); + erstelleBrett(); + } + }); + } + + break; + default: + break; + + } + + for (JButton b : buttons) { + panelLinks.add(b); + } + } } -- 2.43.0 From 392d70472936c12fc5af1634b00e46037d40822b Mon Sep 17 00:00:00 2001 From: <3020511@stud.hs-mannheim.de> Date: Wed, 18 Jun 2025 17:37:04 +0200 Subject: [PATCH 09/15] =?UTF-8?q?Uhr=20eingebunden=20und=20Ergebnisanzeige?= =?UTF-8?q?=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../de/mannheim/th/chess/domain/Game.java | 29 +++++++++-- .../de/mannheim/th/chess/ui/SpielFrame.java | 49 ++++++++++++++++++- 2 files changed, 73 insertions(+), 5 deletions(-) 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 0375307..a375d29 100644 --- a/src/main/java/de/mannheim/th/chess/domain/Game.java +++ b/src/main/java/de/mannheim/th/chess/domain/Game.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.stream.Collectors; import com.github.bhlangonijr.chesslib.Board; +import com.github.bhlangonijr.chesslib.Side; import com.github.bhlangonijr.chesslib.Square; import com.github.bhlangonijr.chesslib.move.Move; import com.github.bhlangonijr.chesslib.move.MoveList; @@ -18,8 +19,7 @@ import de.mannheim.th.chess.utl.Clock; public class Game { private Board board; - private Clock clockPlayer1; - private Clock clockPlayer2; + private Clock clock; private MoveList movelist; @@ -31,8 +31,8 @@ public class Game { this.movelist = new MoveList(); - // this.clockPlayer1 = new Clock(); - // this.clockPlayer2 = new Clock(); + clock = new Clock("blitz"); + clock.start(); } @@ -77,6 +77,7 @@ public class Game { public void playMove(Move move) { this.board.doMove(move); this.movelist.add(move); + clock.pressClock(); } /** @@ -89,6 +90,22 @@ public class Game { Move move = new Move(origin, desination); this.board.doMove(move); this.movelist.add(move); + + } + + public boolean isMate() { + return board.isMated(); + } + + public boolean isDraw() { + return board.isDraw(); + } + + public int getActivePlayer() { + if (board.getSideToMove() == Side.WHITE) { + return 1; + } + return 2; } /** @@ -104,6 +121,10 @@ public class Game { .collect(Collectors.toList()); } + + public void stopClock() { + clock.endGame(); + } /** * Retrieves a list of all legal moveable squares from the current board state. 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 4f41945..a8bd089 100644 --- a/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java +++ b/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java @@ -4,6 +4,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.github.bhlangonijr.chesslib.Square; +import com.github.bhlangonijr.chesslib.game.Player; import com.github.bhlangonijr.chesslib.move.Move; import de.mannheim.th.chess.App; @@ -16,8 +17,12 @@ import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; +import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSplitPane; +import javax.swing.JTextArea; +import javax.swing.JTextField; + import java.awt.BorderLayout; import java.awt.Color; import java.awt.Cursor; @@ -49,7 +54,7 @@ public class SpielFrame extends JFrame { private Square selectedSquare; enum BoardMode { - normal, pieceSelected, + normal, pieceSelected, finished } /** @@ -222,6 +227,8 @@ public class SpielFrame extends JFrame { } } } + + /* * Switches the button actions depending on the boardmode @@ -290,6 +297,15 @@ public class SpielFrame extends JFrame { @Override public void actionPerformed(ActionEvent e) { game.playMove(move); + if (game.isDraw()) { + game.stopClock(); + mode = BoardMode.finished; + showDraw(); + } else if (game.isMate()) { + game.stopClock(); + mode = BoardMode.finished; + showWin(game.getActivePlayer()); + } mode = BoardMode.normal; setCursor(null); erstelleBrett(); @@ -298,6 +314,10 @@ public class SpielFrame extends JFrame { } break; + + case finished: + clearButtons(); + break; default: break; @@ -307,5 +327,32 @@ public class SpielFrame extends JFrame { panelLinks.add(b); } } + + private 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); + + } + + private 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); + } } -- 2.43.0 From 12623b5b8fcb9f3ab87f00f6e99e7c8d18057f06 Mon Sep 17 00:00:00 2001 From: stuckd Date: Wed, 18 Jun 2025 19:17:39 +0200 Subject: [PATCH 10/15] move Actionlisensers to controller package --- .../controller/ButtonMovePieceListener.java | 39 ++ .../controller/ButtonSelectPieceListener.java | 43 ++ .../controller/ButtonToNormalListener.java | 24 + .../de/mannheim/th/chess/ui/SpielFrame.java | 512 ++++++++---------- 4 files changed, 341 insertions(+), 277 deletions(-) create mode 100644 src/main/java/de/mannheim/th/chess/controller/ButtonMovePieceListener.java create mode 100644 src/main/java/de/mannheim/th/chess/controller/ButtonSelectPieceListener.java create mode 100644 src/main/java/de/mannheim/th/chess/controller/ButtonToNormalListener.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 new file mode 100644 index 0000000..402fad5 --- /dev/null +++ b/src/main/java/de/mannheim/th/chess/controller/ButtonMovePieceListener.java @@ -0,0 +1,39 @@ +package de.mannheim.th.chess.controller; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import com.github.bhlangonijr.chesslib.move.Move; + +import de.mannheim.th.chess.domain.Game; +import de.mannheim.th.chess.ui.SpielFrame; +import de.mannheim.th.chess.ui.SpielFrame.BoardMode; + +public class ButtonMovePieceListener implements ActionListener { + private SpielFrame sf; + private Game game; + private Move mv; + + public ButtonMovePieceListener(SpielFrame sf, Game game, Move mv) { + this.sf = sf; + this.game = game; + this.mv = mv; + } + + @Override + public void actionPerformed(ActionEvent e) { + this.game.playMove(this.mv); + if (this.game.isDraw()) { + this.game.stopClock(); + this.sf.setBoardMode(BoardMode.finished); + this.sf.showDraw(); + } else if (this.game.isMate()) { + this.game.stopClock(); + this.sf.setBoardMode(BoardMode.finished); + this.sf.showWin(game.getActivePlayer()); + } + this.sf.setBoardMode(BoardMode.normal); + this.sf.setCursor(null); + this.sf.erstelleBrett(); + } +} diff --git a/src/main/java/de/mannheim/th/chess/controller/ButtonSelectPieceListener.java b/src/main/java/de/mannheim/th/chess/controller/ButtonSelectPieceListener.java new file mode 100644 index 0000000..94fa58c --- /dev/null +++ b/src/main/java/de/mannheim/th/chess/controller/ButtonSelectPieceListener.java @@ -0,0 +1,43 @@ +package de.mannheim.th.chess.controller; + +import java.awt.Cursor; +import java.awt.Image; +import java.awt.Point; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import com.github.bhlangonijr.chesslib.Square; + +import de.mannheim.th.chess.ui.SpielFrame; + +public class ButtonSelectPieceListener implements ActionListener { + private SpielFrame sf; + private Square selectedSquare; + + public ButtonSelectPieceListener(SpielFrame sf, Square sq) { + this.sf = sf; + this.selectedSquare = sq; + } + + @Override + public void actionPerformed(ActionEvent e) { + sf.setBoardMode(SpielFrame.BoardMode.pieceSelected); + sf.setSelectedSquare(this.selectedSquare); + + String symbolChoosed = sf.getBelegung().get(e.getSource()); + + // setzt cursor auf spielfigur für die animation + String pfad = "src/main/resources/" + (int) symbolChoosed.toCharArray()[2] + ".png"; + + // Bild laden und Cursor im gesamten Frame setzen + Image image = Toolkit.getDefaultToolkit().getImage(pfad); + Image scaled = image.getScaledInstance(32, 32, Image.SCALE_SMOOTH); + Cursor figurCursor = Toolkit.getDefaultToolkit().createCustomCursor(scaled, new Point(0, 0), + "figurCursor"); + sf.setCursor(figurCursor); + + sf.erstelleBrett(); + } + +} diff --git a/src/main/java/de/mannheim/th/chess/controller/ButtonToNormalListener.java b/src/main/java/de/mannheim/th/chess/controller/ButtonToNormalListener.java new file mode 100644 index 0000000..c4261de --- /dev/null +++ b/src/main/java/de/mannheim/th/chess/controller/ButtonToNormalListener.java @@ -0,0 +1,24 @@ +package de.mannheim.th.chess.controller; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import de.mannheim.th.chess.ui.SpielFrame; +import de.mannheim.th.chess.ui.SpielFrame.BoardMode; + +public class ButtonToNormalListener implements ActionListener { + private SpielFrame sf; + + public ButtonToNormalListener(SpielFrame sf) { + this.sf = sf; + } + + @Override + public void actionPerformed(ActionEvent e) { + this.sf.setBoardMode(BoardMode.normal); + this.sf.setSelectedSquare(null); + this.sf.setCursor(null); + this.sf.erstelleBrett(); + } + +} 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 a8bd089..5e8220e 100644 --- a/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java +++ b/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java @@ -4,11 +4,13 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.github.bhlangonijr.chesslib.Square; -import com.github.bhlangonijr.chesslib.game.Player; import com.github.bhlangonijr.chesslib.move.Move; import de.mannheim.th.chess.App; import de.mannheim.th.chess.domain.Game; +import de.mannheim.th.chess.controller.ButtonMovePieceListener; +import de.mannheim.th.chess.controller.ButtonSelectPieceListener; +import de.mannheim.th.chess.controller.ButtonToNormalListener; import java.awt.EventQueue; import java.awt.Font; @@ -20,339 +22,295 @@ import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSplitPane; -import javax.swing.JTextArea; -import javax.swing.JTextField; import java.awt.BorderLayout; import java.awt.Color; -import java.awt.Cursor; import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; import java.awt.GridLayout; -import java.awt.Image; -import java.awt.Point; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; 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 JPanel contentPane; - private ArrayList buttons = new ArrayList<>(); - private HashMap belegungen = new HashMap<>(); - private JPanel panelLinks, panelRechts; - private Game game; - private String symbolChoosed; + private static final long serialVersionUID = 1L; + private JPanel contentPane; + private ArrayList buttons = new ArrayList<>(); + private HashMap belegungen = new HashMap<>(); + private JPanel panelLinks, panelRechts; + private Game game; + private String symbolChoosed; - private BoardMode mode; - private Square selectedSquare; + private BoardMode mode; + private Square selectedSquare; - enum BoardMode { - normal, pieceSelected, finished - } + public enum BoardMode { + normal, pieceSelected, finished + } - /** - * Launch the application. Die Main-Methode für den WindowBuilder. - */ - public static void main(String[] args) { - EventQueue.invokeLater(new Runnable() { - public void run() { - try { - SpielFrame frame = new SpielFrame(); - frame.setVisible(true); - } catch (Exception e) { - e.printStackTrace(); - } - } - }); - } + /** + * Launch the application. Die Main-Methode für den WindowBuilder. + */ + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + SpielFrame frame = new SpielFrame(); + frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } - /** - * Create the frame. - */ - public SpielFrame() { + /** + * Create the frame. + */ + public SpielFrame() { - game = new Game(); - mode = BoardMode.normal; + game = new Game(); + mode = BoardMode.normal; - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - setBounds(100, 100, 1920, 1080); - setTitle("Schach"); - setAlwaysOnTop(true); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setBounds(100, 100, 1920, 1080); + setTitle("Schach"); + setAlwaysOnTop(true); - JPanel contentPane = new JPanel(); - contentPane.setLayout(new BorderLayout()); - setContentPane(contentPane); + JPanel 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(Color.LIGHT_GRAY); + // Rechtes Panel für Steuerung oder zusätzliche Eingaben + panelRechts = new JPanel(); + panelRechts.setBackground(Color.LIGHT_GRAY); - // JSplitPane horizontal (linke und rechte Hälfte) - JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, panelLinks, panelRechts); - splitPane.setResizeWeight(0.70); - splitPane.setDividerSize(5); - splitPane.setEnabled(false); + // JSplitPane horizontal (linke und rechte Hälfte) + JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, panelLinks, panelRechts); + splitPane.setResizeWeight(0.70); + splitPane.setDividerSize(5); + splitPane.setEnabled(false); - contentPane.add(splitPane, BorderLayout.CENTER); - setVisible(true); - } + contentPane.add(splitPane, BorderLayout.CENTER); + setVisible(true); + } - /** - * Erstellt alle Buttons und fügt sie dem Frame hinzu. - */ - private void erstelleBrett() { + public void setBoardMode(BoardMode bm) { + this.mode = bm; + } - this.clearButtons(); - this.setDefaultBackground(); - this.setButtonsActions(); + public void setSelectedSquare(Square sq) { + this.selectedSquare = sq; + } - ladeBrett(); + public HashMap getBelegung() { + return this.belegungen; + } - panelLinks.revalidate(); - panelLinks.repaint(); + /** + * Erstellt alle Buttons und fügt sie dem Frame hinzu. + */ + public void erstelleBrett() { - // // Bild laden und Cursor im gesamten Frame setzen - // Image image = Toolkit.getDefaultToolkit().getImage(pfad); - // Image scaled = image.getScaledInstance(32, 32, Image.SCALE_SMOOTH); - // Cursor figurCursor = Toolkit.getDefaultToolkit().createCustomCursor(scaled, - // new Point(0, 0), - // "figurCursor"); - // setCursor(figurCursor); + this.clearButtons(); + this.setDefaultBackground(); + this.setButtonsActions(); - // }else - // { - // - // // wenn gerade Figur ausgewählt wird... - // buttonChoosed = (JButton) e.getSource(); - // symbolChoosed = belegungen.get(buttonChoosed); - // // System.out.println(symbolChoosed+" wurde gewählt."); - // // setzt cursor auf spielfigur für die animation - // String pfad = "src/main/resources/" + (int) symbolChoosed.toCharArray()[2] + - // ".png"; - // - // // Bild laden und Cursor im gesamten Frame setzen - // Image image = Toolkit.getDefaultToolkit().getImage(pfad); - // Image scaled = image.getScaledInstance(32, 32, Image.SCALE_SMOOTH); - // Cursor figurCursor = Toolkit.getDefaultToolkit().createCustomCursor(scaled, - // new Point(0, 0), - // "figurCursor"); - // setCursor(figurCursor); - } + ladeBrett(); - private int mirrowedGrid(int i) { - return 63 - (((i / 8) * 8) + (7 - i % 8)); - } + panelLinks.revalidate(); + panelLinks.repaint(); - /** - * holt sich FEN-Zeichenkette und extrahiert daraus die Positionen der Figuren - */ - private void ladeBrett() { - // System.out.println(game.toFEN()); + // // Bild laden und Cursor im gesamten Frame setzen + // Image image = Toolkit.getDefaultToolkit().getImage(pfad); + // Image scaled = image.getScaledInstance(32, 32, Image.SCALE_SMOOTH); + // Cursor figurCursor = Toolkit.getDefaultToolkit().createCustomCursor(scaled, + // new Point(0, 0), + // "figurCursor"); + // setCursor(figurCursor); - 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")); + // }else + // { + // + // // wenn gerade Figur ausgewählt wird... + // buttonChoosed = (JButton) e.getSource(); + // symbolChoosed = belegungen.get(buttonChoosed); + // // System.out.println(symbolChoosed+" wurde gewählt."); + // // setzt cursor auf spielfigur für die animation + // String pfad = "src/main/resources/" + (int) symbolChoosed.toCharArray()[2] + + // ".png"; + // + // // Bild laden und Cursor im gesamten Frame setzen + // Image image = Toolkit.getDefaultToolkit().getImage(pfad); + // Image scaled = image.getScaledInstance(32, 32, Image.SCALE_SMOOTH); + // Cursor figurCursor = Toolkit.getDefaultToolkit().createCustomCursor(scaled, + // new Point(0, 0), + // "figurCursor"); + // setCursor(figurCursor); + } - i++; + 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()); - /** - * Clears the existing buttons from the button list, panellinks and fills them - * with new blank ones. - */ - private void clearButtons() { - buttons.clear(); - panelLinks.removeAll(); + 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")); - for (int i = 0; i < 64; i++) { - JButton b = new JButton(); + i++; - 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 + ""); + /** + * Clears the existing buttons from the button list, panellinks and fills them + * with new blank ones. + */ + private void clearButtons() { + buttons.clear(); + panelLinks.removeAll(); - buttons.add(b); - } - } + for (int i = 0; i < 64; i++) { + JButton b = new JButton(); - /** - * 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)); - } - } - } - - + b.setEnabled(false); - /* - * Switches the button actions depending on the boardmode - */ - private void setButtonsActions() { + // 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 + ""); - List selectables; + buttons.add(b); + } + } - switch (this.mode) { - case BoardMode.normal: - selectables = game.getAllLegalMoveableSquares(); + /** + * 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)); + } + } + } - for (Square square : selectables) { - final Square currentSquare = square; // ActionListener need it to be final - JButton b = buttons.get(mirrowedGrid(square.ordinal())); - b.setEnabled(true); - // b.setBackground(Color.green); - b.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - mode = BoardMode.pieceSelected; - selectedSquare = currentSquare; + /* + * Switches the button actions depending on the boardmode + */ + private void setButtonsActions() { - symbolChoosed = belegungen.get(b); + List selectables; - // setzt cursor auf spielfigur für die animation - String pfad = "src/main/resources/" + (int) symbolChoosed.toCharArray()[2] + ".png"; + switch (this.mode) { + case BoardMode.normal: + selectables = game.getAllLegalMoveableSquares(); - // Bild laden und Cursor im gesamten Frame setzen - Image image = Toolkit.getDefaultToolkit().getImage(pfad); - Image scaled = image.getScaledInstance(32, 32, Image.SCALE_SMOOTH); - Cursor figurCursor = Toolkit.getDefaultToolkit().createCustomCursor(scaled, new Point(0, 0), - "figurCursor"); - setCursor(figurCursor); + for (Square square : selectables) { + JButton b = buttons.get(mirrowedGrid(square.ordinal())); + b.setEnabled(true); + // b.setBackground(Color.green); + b.addActionListener(new ButtonSelectPieceListener(this, square)); + } - erstelleBrett(); - } - }); - } + 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)); // cancel action - JButton s = buttons.get(mirrowedGrid(selectedSquare.ordinal())); - s.setEnabled(true); - s.setBackground(new Color(165, 42, 42)); - s.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - mode = BoardMode.normal; - selectedSquare = null; - setCursor(null); - erstelleBrett(); - } - }); // cancel action + selectables = game.getLegalMoveableSquares(selectedSquare); - selectables = game.getLegalMoveableSquares(selectedSquare); + for ( - for (Square square : selectables) { - JButton b = buttons.get(mirrowedGrid(square.ordinal())); - final Move move = new Move(selectedSquare, square); - b.setEnabled(true); - b.setBackground(new Color(230, 100, 100)); - b.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - game.playMove(move); - if (game.isDraw()) { - game.stopClock(); - mode = BoardMode.finished; - showDraw(); - } else if (game.isMate()) { - game.stopClock(); - mode = BoardMode.finished; - showWin(game.getActivePlayer()); - } - mode = BoardMode.normal; - setCursor(null); - erstelleBrett(); - } - }); - } + Square square : selectables) { + JButton b = buttons.get(mirrowedGrid(square.ordinal())); + final Move move = new Move(selectedSquare, square); + b.setEnabled(true); + b.setBackground(new Color(230, 100, 100)); + b.addActionListener(new ButtonMovePieceListener(this, this.game, move)); + } - break; - - case finished: - clearButtons(); - break; - default: - break; + break; - } + case finished: + clearButtons(); + break; + default: + break; - for (JButton b : buttons) { - panelLinks.add(b); - } - } - - private 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); - - } - - private void showWin(int player) { - JFrame frame = new JFrame("Result"); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setSize(300, 150); - frame.setLayout(null); + for (JButton b : buttons) { + panelLinks.add(b); + } + } - 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); - } + 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); + + } + + 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); + } } -- 2.43.0 From 01ed4f0a911595cf9b6b68844f14af19071481f4 Mon Sep 17 00:00:00 2001 From: Matias <3020772@tud.hs-mannheim.de> Date: Wed, 18 Jun 2025 22:36:00 +0200 Subject: [PATCH 11/15] =?UTF-8?q?Logger=20funktionsf=C3=A4hig=20gemacht?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/log4j2.xml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/resources/log4j2.xml diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml new file mode 100644 index 0000000..602b5ab --- /dev/null +++ b/src/main/resources/log4j2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file -- 2.43.0 From 6c2ef8555613d0beaadfedfddf6642c31eeeb01e Mon Sep 17 00:00:00 2001 From: Matias <3020772@tud.hs-mannheim.de> Date: Wed, 18 Jun 2025 22:43:15 +0200 Subject: [PATCH 12/15] =?UTF-8?q?Aufr=C3=A4umarbeiten?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../de/mannheim/th/chess/ui/MainFrame.java | 22 ------------------- .../de/mannheim/th/chess/ui/SpielFrame.java | 22 ++----------------- 2 files changed, 2 insertions(+), 42 deletions(-) diff --git a/src/main/java/de/mannheim/th/chess/ui/MainFrame.java b/src/main/java/de/mannheim/th/chess/ui/MainFrame.java index 96235ee..fc5a437 100644 --- a/src/main/java/de/mannheim/th/chess/ui/MainFrame.java +++ b/src/main/java/de/mannheim/th/chess/ui/MainFrame.java @@ -1,15 +1,11 @@ package de.mannheim.th.chess.ui; -import java.awt.EventQueue; - import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; -import javax.swing.JTextField; import javax.swing.JLabel; import javax.swing.JOptionPane; -import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; @@ -20,10 +16,8 @@ import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFileChooser; -import java.awt.BorderLayout; import java.awt.Component; import java.awt.Font; -import java.awt.Graphics; import java.awt.Color; public class MainFrame extends JFrame { @@ -33,22 +27,6 @@ public class MainFrame extends JFrame { private static final long serialVersionUID = 1L; private JPanel contentPane; - /** - * Launch the application. - */ - public static void main(String[] args) { - EventQueue.invokeLater(new Runnable() { - public void run() { - try { - MainFrame frame = new MainFrame(); - frame.setVisible(true); - } catch (Exception e) { - e.printStackTrace(); - } - } - }); - } - /** * Create the frame. */ 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 5e8220e..6fc32d8 100644 --- a/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java +++ b/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java @@ -35,12 +35,10 @@ public class SpielFrame extends JFrame { private static final Logger logger = LogManager.getLogger(App.class); private static final long serialVersionUID = 1L; - private JPanel contentPane; private ArrayList buttons = new ArrayList<>(); private HashMap belegungen = new HashMap<>(); - private JPanel panelLinks, panelRechts; + private JPanel panelLinks, panelRechts, contentPane; private Game game; - private String symbolChoosed; private BoardMode mode; private Square selectedSquare; @@ -49,22 +47,6 @@ public class SpielFrame extends JFrame { normal, pieceSelected, finished } - /** - * Launch the application. Die Main-Methode für den WindowBuilder. - */ - public static void main(String[] args) { - EventQueue.invokeLater(new Runnable() { - public void run() { - try { - SpielFrame frame = new SpielFrame(); - frame.setVisible(true); - } catch (Exception e) { - e.printStackTrace(); - } - } - }); - } - /** * Create the frame. */ @@ -78,7 +60,7 @@ public class SpielFrame extends JFrame { setTitle("Schach"); setAlwaysOnTop(true); - JPanel contentPane = new JPanel(); + contentPane = new JPanel(); contentPane.setLayout(new BorderLayout()); setContentPane(contentPane); -- 2.43.0 From e043546ee41d8732a21290000054429cd75536d7 Mon Sep 17 00:00:00 2001 From: <3020511@stud.hs-mannheim.de> Date: Thu, 19 Jun 2025 23:04:51 +0200 Subject: [PATCH 13/15] Promotion mit entsprechendem Auswahlfenster implementiert --- .../de/mannheim/th/chess/domain/Game.java | 43 +++++++++++++++++++ .../de/mannheim/th/chess/ui/SpielFrame.java | 43 ++++++++++++++++++- 2 files changed, 85 insertions(+), 1 deletion(-) 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 a375d29..c716dc6 100644 --- a/src/main/java/de/mannheim/th/chess/domain/Game.java +++ b/src/main/java/de/mannheim/th/chess/domain/Game.java @@ -4,6 +4,8 @@ import java.util.List; import java.util.stream.Collectors; import com.github.bhlangonijr.chesslib.Board; +import com.github.bhlangonijr.chesslib.Piece; +import com.github.bhlangonijr.chesslib.Rank; import com.github.bhlangonijr.chesslib.Side; import com.github.bhlangonijr.chesslib.Square; import com.github.bhlangonijr.chesslib.move.Move; @@ -125,6 +127,11 @@ public class Game { public void stopClock() { clock.endGame(); } + + public boolean isPromotionMove(Move move) { + return ((move.getTo().getRank().equals(Rank.RANK_8) || move.getTo().getRank().equals(Rank.RANK_1)) && + (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. @@ -151,6 +158,42 @@ public class Game { .map(move -> move.getTo()) .collect(Collectors.toList()); } + + public void doPromotionMove(int piece, Square origin, Square destination) { + System.out.println(piece); + Piece promotedTo; + switch(piece) { + case 7: + promotedTo = Piece.BLACK_KNIGHT; + break; + case 4: + promotedTo = Piece.BLACK_QUEEN; + break; + case 5: + promotedTo = Piece.BLACK_ROOK; + break; + case 6: + promotedTo = Piece.BLACK_BISHOP; + break; + case 3: + promotedTo = Piece.WHITE_KNIGHT; + break; + case 0: + promotedTo = Piece.WHITE_QUEEN; + break; + case 1: + promotedTo = Piece.WHITE_ROOK; + break; + case 2: + promotedTo = Piece.WHITE_BISHOP; + break; + default: + promotedTo = Piece.WHITE_QUEEN; + } + Move promotionMove = new Move(origin, destination, promotedTo); + board.doMove(promotionMove); + movelist.add(promotionMove); + } public String toFEN() { board.toString(); 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 a8bd089..6d11ac5 100644 --- a/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java +++ b/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java @@ -3,6 +3,7 @@ package de.mannheim.th.chess.ui; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import com.github.bhlangonijr.chesslib.Piece; import com.github.bhlangonijr.chesslib.Square; import com.github.bhlangonijr.chesslib.game.Player; import com.github.bhlangonijr.chesslib.move.Move; @@ -16,6 +17,7 @@ import java.awt.Font; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JButton; +import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; @@ -293,10 +295,18 @@ public class SpielFrame extends JFrame { final Move move = new Move(selectedSquare, square); b.setEnabled(true); b.setBackground(new Color(230, 100, 100)); + for (ActionListener al : b.getActionListeners()) { + b.removeActionListener(al); + } b.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - game.playMove(move); + if(game.isPromotionMove(move)) { + game.doPromotionMove(showPromotion(), selectedSquare, square); + + } else { + game.playMove(move); + } if (game.isDraw()) { game.stopClock(); mode = BoardMode.finished; @@ -354,5 +364,36 @@ public class SpielFrame extends JFrame { frame.add(jl); frame.setVisible(true); } + + private 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}; + + + for (int i = 0; i < 4; i++) { + int index = (game.getActivePlayer() - 1) * 4 + i; + JButton jb = new JButton(); + jb.setIcon(new ImageIcon("src/main/resources/" + pictures[index] + ".png")); + int selectedPiece = index; + jb.addActionListener(e -> { + System.out.println("Test"); + result[0] = selectedPiece; + dialog.dispose(); + }); + dialog.add(jb); + } + + dialog.setLocationRelativeTo(null); + dialog.setVisible(true); + + return result[0]; + } + } -- 2.43.0 From 8cb621d804e53f38ea0b15e745c885a01884143c Mon Sep 17 00:00:00 2001 From: dstuck Date: Sat, 21 Jun 2025 15:54:17 +0200 Subject: [PATCH 14/15] undo last merge --- .../de/mannheim/th/chess/ui/SpielFrame.java | 108 +++++------------- 1 file changed, 28 insertions(+), 80 deletions(-) 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 46563e8..e9984df 100644 --- a/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java +++ b/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java @@ -245,53 +245,14 @@ public class SpielFrame extends JFrame { selectables = game.getLegalMoveableSquares(selectedSquare); - for ( - - Square square : selectables) { + for (Square square : selectables) { JButton b = buttons.get(mirrowedGrid(square.ordinal())); final Move move = new Move(selectedSquare, square); b.setEnabled(true); b.setBackground(new Color(230, 100, 100)); b.addActionListener(new ButtonMovePieceListener(this, this.game, move)); } - -<<<<<<< HEAD - for (Square square : selectables) { - JButton b = buttons.get(mirrowedGrid(square.ordinal())); - final Move move = new Move(selectedSquare, square); - b.setEnabled(true); - b.setBackground(new Color(230, 100, 100)); - for (ActionListener al : b.getActionListeners()) { - b.removeActionListener(al); - } - b.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if(game.isPromotionMove(move)) { - game.doPromotionMove(showPromotion(), selectedSquare, square); - - } else { - game.playMove(move); - } - if (game.isDraw()) { - game.stopClock(); - mode = BoardMode.finished; - showDraw(); - } else if (game.isMate()) { - game.stopClock(); - mode = BoardMode.finished; - showWin(game.getActivePlayer()); - } - mode = BoardMode.normal; - setCursor(null); - erstelleBrett(); - } - }); - } -======= break; ->>>>>>> branch 'buttonActions' of https://gitty.informatik.hs-mannheim.de/3020772/Schach.git - case finished: clearButtons(); break; @@ -311,51 +272,39 @@ public class SpielFrame extends JFrame { frame.setSize(300, 150); frame.setLayout(null); -<<<<<<< HEAD - 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 }; - int[] pictures = {81, 82, 66, 78, 113, 114, 98, 110}; - + JDialog dialog = new JDialog(this, "Wähle eine Figur", true); + dialog.setLayout(new GridLayout(2, 2)); + dialog.setSize(300, 200); - for (int i = 0; i < 4; i++) { - int index = (game.getActivePlayer() - 1) * 4 + i; - JButton jb = new JButton(); - jb.setIcon(new ImageIcon("src/main/resources/" + pictures[index] + ".png")); - int selectedPiece = index; - jb.addActionListener(e -> { - System.out.println("Test"); - result[0] = selectedPiece; - dialog.dispose(); - }); - dialog.add(jb); - } + int[] pictures = { 81, 82, 66, 78, 113, 114, 98, 110 }; - dialog.setLocationRelativeTo(null); - dialog.setVisible(true); + for (int i = 0; i < 4; i++) { + int index = (game.getActivePlayer() - 1) * 4 + i; + JButton jb = new JButton(); + jb.setIcon(new ImageIcon("src/main/resources/" + pictures[index] + ".png")); + int selectedPiece = index; + jb.addActionListener(e -> { + System.out.println("Test"); + result[0] = selectedPiece; + dialog.dispose(); + }); + dialog.add(jb); + } - return result[0]; - } - -======= - 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); + dialog.setLocationRelativeTo(null); + dialog.setVisible(true); + return result[0]; } public void showWin(int player) { @@ -370,6 +319,5 @@ public class SpielFrame extends JFrame { frame.add(jl); frame.setVisible(true); } ->>>>>>> branch 'buttonActions' of https://gitty.informatik.hs-mannheim.de/3020772/Schach.git } -- 2.43.0 From 64cf32151160911f89cdbd574abd1835a65ef874 Mon Sep 17 00:00:00 2001 From: dstuck Date: Sat, 21 Jun 2025 16:09:55 +0200 Subject: [PATCH 15/15] kida fixed promotion --- .../controller/ButtonMovePieceListener.java | 6 +- .../de/mannheim/th/chess/domain/Game.java | 103 +++++++++--------- 2 files changed, 58 insertions(+), 51 deletions(-) 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..fab0dc3 100644 --- a/src/main/java/de/mannheim/th/chess/controller/ButtonMovePieceListener.java +++ b/src/main/java/de/mannheim/th/chess/controller/ButtonMovePieceListener.java @@ -22,7 +22,11 @@ public class ButtonMovePieceListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { - this.game.playMove(this.mv); + if (game.isPromotionMove(this.mv)) + game.doPromotionMove(this.sf.showPromotion(), mv.getFrom(), mv.getTo()); + else + this.game.playMove(this.mv); + if (this.game.isDraw()) { this.game.stopClock(); this.sf.setBoardMode(BoardMode.finished); 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 c716dc6..71326db 100644 --- a/src/main/java/de/mannheim/th/chess/domain/Game.java +++ b/src/main/java/de/mannheim/th/chess/domain/Game.java @@ -92,22 +92,22 @@ public class Game { Move move = new Move(origin, desination); this.board.doMove(move); this.movelist.add(move); - + } - + public boolean isMate() { - return board.isMated(); + return board.isMated(); } - + public boolean isDraw() { - return board.isDraw(); + return board.isDraw(); } - + public int getActivePlayer() { - if (board.getSideToMove() == Side.WHITE) { - return 1; - } - return 2; + if (board.getSideToMove() == Side.WHITE) { + return 1; + } + return 2; } /** @@ -123,15 +123,15 @@ public class Game { .collect(Collectors.toList()); } - + public void stopClock() { - clock.endGame(); + clock.endGame(); } - + public boolean isPromotionMove(Move move) { - return ((move.getTo().getRank().equals(Rank.RANK_8) || move.getTo().getRank().equals(Rank.RANK_1)) && - (board.getPiece(move.getFrom()) == Piece.BLACK_PAWN || board.getPiece(move.getFrom()) == Piece.WHITE_PAWN)); - } + return ((move.getTo().getRank().equals(Rank.RANK_8) || move.getTo().getRank().equals(Rank.RANK_1)) && + (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. @@ -158,45 +158,48 @@ public class Game { .map(move -> move.getTo()) .collect(Collectors.toList()); } - + public void doPromotionMove(int piece, Square origin, Square destination) { - System.out.println(piece); - Piece promotedTo; - switch(piece) { - case 7: - promotedTo = Piece.BLACK_KNIGHT; - break; - case 4: - promotedTo = Piece.BLACK_QUEEN; - break; - case 5: - promotedTo = Piece.BLACK_ROOK; - break; - case 6: - promotedTo = Piece.BLACK_BISHOP; - break; - case 3: - promotedTo = Piece.WHITE_KNIGHT; - break; - case 0: - promotedTo = Piece.WHITE_QUEEN; - break; - case 1: - promotedTo = Piece.WHITE_ROOK; - break; - case 2: - promotedTo = Piece.WHITE_BISHOP; - break; - default: - promotedTo = Piece.WHITE_QUEEN; - } - Move promotionMove = new Move(origin, destination, promotedTo); - board.doMove(promotionMove); - movelist.add(promotionMove); + System.out.println(piece); + Piece promotedTo; + switch (piece) { + case 7: + promotedTo = Piece.BLACK_KNIGHT; + break; + case 4: + promotedTo = Piece.BLACK_QUEEN; + break; + case 5: + promotedTo = Piece.BLACK_ROOK; + break; + case 6: + promotedTo = Piece.BLACK_BISHOP; + break; + case 3: + promotedTo = Piece.WHITE_KNIGHT; + break; + case 0: + promotedTo = Piece.WHITE_QUEEN; + break; + case 1: + promotedTo = Piece.WHITE_ROOK; + break; + case 2: + promotedTo = Piece.WHITE_BISHOP; + break; + default: + promotedTo = Piece.WHITE_QUEEN; + } + Move promotionMove = new Move(origin, destination, promotedTo); + playMove(promotionMove); } public String toFEN() { board.toString(); return board.getFen(); } + + public Square getSelectedSquare() { + return this.getSelectedSquare(); + } } -- 2.43.0