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/controller/ButtonMovePieceListener.java b/src/main/java/de/mannheim/th/chess/controller/ButtonMovePieceListener.java new file mode 100644 index 0000000..fab0dc3 --- /dev/null +++ b/src/main/java/de/mannheim/th/chess/controller/ButtonMovePieceListener.java @@ -0,0 +1,43 @@ +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) { + 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); + 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/domain/Game.java b/src/main/java/de/mannheim/th/chess/domain/Game.java index f880fa8..71326db 100644 --- a/src/main/java/de/mannheim/th/chess/domain/Game.java +++ b/src/main/java/de/mannheim/th/chess/domain/Game.java @@ -4,9 +4,13 @@ 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; import com.github.bhlangonijr.chesslib.move.MoveList; +import com.github.bhlangonijr.chesslib.pgn.PgnHolder; import de.mannheim.th.chess.utl.Clock; @@ -17,8 +21,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; @@ -30,8 +33,8 @@ public class Game { this.movelist = new MoveList(); - // this.clockPlayer1 = new Clock(); - // this.clockPlayer2 = new Clock(); + clock = new Clock("blitz"); + clock.start(); } @@ -76,6 +79,7 @@ public class Game { public void playMove(Move move) { this.board.doMove(move); this.movelist.add(move); + clock.pressClock(); } /** @@ -88,6 +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(); + } + + public boolean isDraw() { + return board.isDraw(); + } + + public int getActivePlayer() { + if (board.getSideToMove() == Side.WHITE) { + return 1; + } + return 2; } /** @@ -104,7 +124,82 @@ 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. + * + * @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) + .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); + playMove(promotionMove); + } + public String toFEN() { + board.toString(); return board.getFen(); } + + public Square getSelectedSquare() { + return this.getSelectedSquare(); + } } 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 e4ed32d..e9984df 100644 --- a/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java +++ b/src/main/java/de/mannheim/th/chess/ui/SpielFrame.java @@ -3,13 +3,15 @@ package de.mannheim.th.chess.ui; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import com.github.bhlangonijr.chesslib.Board; -import com.github.bhlangonijr.chesslib.File; -import com.github.bhlangonijr.chesslib.Rank; +import com.github.bhlangonijr.chesslib.Piece; 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; +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; @@ -17,56 +19,34 @@ 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; import javax.swing.JSplitPane; + 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 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 JPanel panelLinks, panelRechts, contentPane; private Game game; - private String symbolChoosed; - private JButton buttonChoosed; - private boolean playerWhite = true; - private boolean moveFinished = false; - /** - * 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(); - } - } - }); + private BoardMode mode; + private Square selectedSquare; + + public enum BoardMode { + normal, pieceSelected, finished } /** @@ -75,13 +55,14 @@ public class SpielFrame extends JFrame { public SpielFrame() { game = new Game(); + mode = BoardMode.normal; setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 1920, 1080); setTitle("Schach"); setAlwaysOnTop(true); - JPanel contentPane = new JPanel(); + contentPane = new JPanel(); contentPane.setLayout(new BorderLayout()); setContentPane(contentPane); @@ -104,174 +85,62 @@ public class SpielFrame extends JFrame { setVisible(true); } + public void setBoardMode(BoardMode bm) { + this.mode = bm; + } + + public void setSelectedSquare(Square sq) { + this.selectedSquare = sq; + } + + public HashMap getBelegung() { + return this.belegungen; + } + /** * Erstellt alle Buttons und fügt sie dem Frame hinzu. */ - 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)); + public void erstelleBrett() { - 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.setForeground(Color.WHITE); - b.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1)); - b.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - - // setzt alle Roten Felder zurück - for (JButton b : farben.keySet()) { - - if (b.getBackground().equals(new Color(230, 100, 100))) { - - b.setBackground(farben.get(b)); - } - } - - // 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); - - } + this.clearButtons(); + this.setDefaultBackground(); + this.setButtonsActions(); ladeBrett(); + 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); + + // }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)); } /** @@ -287,7 +156,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; @@ -295,12 +165,159 @@ 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")); + buttons.get(i).setDisabledIcon(new ImageIcon("src/main/resources/" + (int) fen[j] + ".png")); i++; } } + + /** + * 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(); + + 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); + } + } + + /** + * 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() { + + List selectables; + + switch (this.mode) { + case BoardMode.normal: + selectables = game.getAllLegalMoveableSquares(); + + for (Square square : selectables) { + JButton b = buttons.get(mirrowedGrid(square.ordinal())); + b.setEnabled(true); + // b.setBackground(Color.green); + b.addActionListener(new ButtonSelectPieceListener(this, square)); + } + + break; + + 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 + + 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 ButtonMovePieceListener(this, this.game, move)); + } + break; + case finished: + clearButtons(); + break; + default: + break; + + } + + for (JButton b : buttons) { + panelLinks.add(b); + } + } + + public void showDraw() { + JFrame frame = new JFrame("Result"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setSize(300, 150); + frame.setLayout(null); + + // 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 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]; + } + + 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); + } + } 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 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()); + } }