From 92b8255eb1b50a7897887c18c53d0746c131b087 Mon Sep 17 00:00:00 2001 From: Tilo Date: Mon, 4 Apr 2016 19:33:48 +0200 Subject: [PATCH 01/11] Added NewGameGUI --- src/main/java/de/tilosp/chess/Main.java | 5 +- src/main/java/de/tilosp/chess/gui/GUI.java | 27 ++++ .../java/de/tilosp/chess/gui/NewGameGUI.java | 141 ++++++++++++++++++ 3 files changed, 172 insertions(+), 1 deletion(-) create mode 100644 src/main/java/de/tilosp/chess/gui/GUI.java create mode 100644 src/main/java/de/tilosp/chess/gui/NewGameGUI.java diff --git a/src/main/java/de/tilosp/chess/Main.java b/src/main/java/de/tilosp/chess/Main.java index a7102c0..365d2e6 100644 --- a/src/main/java/de/tilosp/chess/Main.java +++ b/src/main/java/de/tilosp/chess/Main.java @@ -1,8 +1,11 @@ package de.tilosp.chess; +import de.tilosp.chess.gui.NewGameGUI; + public class Main { public static void main(String[] args) { - + // Open NewGameGUI Window + new NewGameGUI().setVisible(true); } } diff --git a/src/main/java/de/tilosp/chess/gui/GUI.java b/src/main/java/de/tilosp/chess/gui/GUI.java new file mode 100644 index 0000000..f72b2b2 --- /dev/null +++ b/src/main/java/de/tilosp/chess/gui/GUI.java @@ -0,0 +1,27 @@ +package de.tilosp.chess.gui; + +import javax.swing.*; + +abstract class GUI extends JFrame { + + JPanel panel; + + GUI() { + // create panel + panel = new JPanel(); + + // initialise GUI + initGUI(); + + // add panel + setContentPane(panel); + pack(); + + // initialise Listeners + initListeners(); + } + + abstract void initGUI(); + + abstract void initListeners(); +} diff --git a/src/main/java/de/tilosp/chess/gui/NewGameGUI.java b/src/main/java/de/tilosp/chess/gui/NewGameGUI.java new file mode 100644 index 0000000..4d67f8f --- /dev/null +++ b/src/main/java/de/tilosp/chess/gui/NewGameGUI.java @@ -0,0 +1,141 @@ +package de.tilosp.chess.gui; + +import javax.swing.*; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import java.awt.*; +import java.awt.event.ItemListener; + +public class NewGameGUI extends GUI { + + private JButton startButton; + private JRadioButton onePlayerRadioButton; + private JRadioButton twoPlayerRadioButton; + private JTextField hostTextField; + private JTextField portTextField; + private JComboBox twoPlayerModeComboBox; + private JComboBox colorComboBox; + private JLabel colorLabel; + private JLabel hostLabel; + private JLabel portLabel; + + @Override + void initGUI() { + setTitle("New Game"); + panel.setLayout(new GridBagLayout()); + panel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); + GridBagConstraints c = new GridBagConstraints(); + + ButtonGroup buttonGroup = new ButtonGroup(); + + c.insets = new Insets(2, 2, 2, 2); + c.fill = GridBagConstraints.BOTH; + + c.gridy = 0; + c.gridx = 0; + c.gridwidth = 2; + panel.add(onePlayerRadioButton = new JRadioButton("1 Player"), c); + buttonGroup.add(onePlayerRadioButton); + onePlayerRadioButton.setSelected(true); + c.gridx = 2; + c.gridwidth = 1; + c.gridheight = 3; + panel.add(Box.createHorizontalStrut(10), c); + c.gridheight = 1; + c.gridx = 3; + panel.add(colorLabel = new JLabel("Color"), c); + c.gridx = 4; + panel.add(colorComboBox = new JComboBox<>(new String[] { "white", "black" }), c); + + c.gridy = 1; + c.gridx = 0; + c.gridwidth = 2; + panel.add(twoPlayerRadioButton = new JRadioButton("2 Player"), c); + buttonGroup.add(twoPlayerRadioButton); + c.gridx = 3; + c.gridwidth = 1; + panel.add(hostLabel = new JLabel("Host"), c); + c.gridx = 4; + panel.add(hostTextField = new JTextField("localhost"), c); + hostTextField.setPreferredSize(new Dimension(150, -1)); + + c.gridy = 2; + c.gridx = 0; + panel.add(Box.createHorizontalStrut(18), c); + c.gridx = 1; + panel.add(twoPlayerModeComboBox = new JComboBox<>(new String[] { "local", "server", "client" }), c); + c.gridx = 3; + panel.add(portLabel = new JLabel("Port"), c); + c.gridx = 4; + panel.add(portTextField = new JTextField("49152"), c); + + c.gridy = 3; + c.gridx = 0; + c.gridwidth = 5; + panel.add(startButton = new JButton("Start"), c); + + updateEnabledStatus(); + + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + setResizable(false); + } + + @Override + void initListeners() { + // listener to update enabled status + ItemListener listener = e -> updateEnabledStatus(); + onePlayerRadioButton.addItemListener(listener); + twoPlayerRadioButton.addItemListener(listener); + twoPlayerModeComboBox.addItemListener(listener); + + // listener for start button + startButton.addActionListener(e -> onStartButtonPressed()); + + // listener to change the color of the port text field + portTextField.getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + update(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + update(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + update(); + } + + void update() { + try { + int port = Integer.parseInt(portTextField.getText()); + portTextField.setForeground(port < 49152 || port > 65535 ? Color.ORANGE : Color.BLACK); + } catch (NumberFormatException e) { + portTextField.setForeground(Color.RED); + } + } + }); + } + + private void onStartButtonPressed() { + // TODO + dispose(); + } + + private void updateEnabledStatus() { + twoPlayerModeComboBox.setEnabled(twoPlayerRadioButton.isSelected()); + + boolean enabled = onePlayerRadioButton.isSelected() || twoPlayerRadioButton.isSelected() && twoPlayerModeComboBox.getSelectedIndex() == 1; + colorLabel.setEnabled(enabled); + colorComboBox.setEnabled(enabled); + + enabled = twoPlayerRadioButton.isSelected() && twoPlayerModeComboBox.getSelectedIndex() == 2; + hostLabel.setEnabled(enabled); + hostTextField.setEnabled(enabled); + portLabel.setEnabled(enabled); + portTextField.setEnabled(enabled); + + } +} \ No newline at end of file From e27bdc53580b6b143ccee890e8228d572f4e7610 Mon Sep 17 00:00:00 2001 From: Tilo Date: Wed, 6 Apr 2016 13:23:35 +0200 Subject: [PATCH 02/11] Added player color enum --- src/main/java/de/tilosp/chess/lib/PlayerColor.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/de/tilosp/chess/lib/PlayerColor.java diff --git a/src/main/java/de/tilosp/chess/lib/PlayerColor.java b/src/main/java/de/tilosp/chess/lib/PlayerColor.java new file mode 100644 index 0000000..37f3081 --- /dev/null +++ b/src/main/java/de/tilosp/chess/lib/PlayerColor.java @@ -0,0 +1,11 @@ +package de.tilosp.chess.lib; + +// the two player colors +public enum PlayerColor { + WHITE, + BLACK; + + public PlayerColor otherColor() { + return values()[ordinal() ^ 1]; + } +} From 423ca80dcb4a9ff77019be04c20c38073b102a20 Mon Sep 17 00:00:00 2001 From: Tilo Date: Wed, 6 Apr 2016 13:28:22 +0200 Subject: [PATCH 03/11] Added chess piece type enum --- .../de/tilosp/chess/lib/ChessPieceType.java | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/main/java/de/tilosp/chess/lib/ChessPieceType.java diff --git a/src/main/java/de/tilosp/chess/lib/ChessPieceType.java b/src/main/java/de/tilosp/chess/lib/ChessPieceType.java new file mode 100644 index 0000000..fec11d7 --- /dev/null +++ b/src/main/java/de/tilosp/chess/lib/ChessPieceType.java @@ -0,0 +1,73 @@ +package de.tilosp.chess.lib; + +public enum ChessPieceType { + + KING(new int[][] { + { 0, 1, }, + { 0, -1 }, + { 1, 0 }, + { -1, 0 }, + { 1, 1 }, + { 1, -1 }, + { -1, 1 }, + { -1, -1 } }), + QUEEN(new int[][] { + { 0, 1, 7 }, + { 0, -1, 7 }, + { 1, 0, 7 }, + { -1, 0, 7 }, + { 1, 1, 7 }, + { 1, -1, 7 }, + { -1, 1, 7 }, + { -1, -1, 7 } }), + ROOK(new int[][] { + { 0, 1, 7 }, + { 0, -1, 7 }, + { 1, 0, 7 }, + { -1, 0, 7 } }), + BISHOP(new int[][] { + { 1, 1, 7 }, + { 1, -1, 7 }, + { -1, 1, 7 }, + { -1, -1, 7 } }), + KNIGHT(new int[][] { + { 1, 2 }, + { -1, 2 }, + { 1, -2 }, + { -1, -2 }, + { 2, 1 }, + { 2, -1 }, + { -2, 1 }, + { -2, -1 } }), + PAWN(new int[][] { + { 0, 1 } + }, new int[][] { + { 0, 1, 2 } + }, new int[][] { + { 1, 1 }, + { -1, 1 }, + { 1, 1, 1, 0 }, + { -1, 1, -1, 0 } + }); + + public static final ChessPieceType[] POSITIONS_FIRST_ROW = { ROOK, KNIGHT, BISHOP, QUEEN, KING, BISHOP, KNIGHT, ROOK }; + public static final ChessPieceType[] POSITIONS_PROMOTION = { QUEEN, KNIGHT, ROOK, BISHOP }; + public final int[][] capture; + private final int[][] move; + private int[][] moveFirstTurn; + + ChessPieceType(int[][] move) { + this.move = move; + this.capture = move; + } + + ChessPieceType(int[][] move, int[][] moveFirstTurn, int[][] capture) { + this.move = move; + this.moveFirstTurn = moveFirstTurn; + this.capture = capture; + } + + public int[][] getMove(boolean notMoved) { + return notMoved && moveFirstTurn != null ? moveFirstTurn : move; + } +} From 85bdc17578ba0b386a73a9791e66d660bf32801c Mon Sep 17 00:00:00 2001 From: Tilo Date: Wed, 6 Apr 2016 13:31:01 +0200 Subject: [PATCH 04/11] Added ChessPiece class --- .../java/de/tilosp/chess/lib/ChessPiece.java | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/main/java/de/tilosp/chess/lib/ChessPiece.java diff --git a/src/main/java/de/tilosp/chess/lib/ChessPiece.java b/src/main/java/de/tilosp/chess/lib/ChessPiece.java new file mode 100644 index 0000000..21e3bf4 --- /dev/null +++ b/src/main/java/de/tilosp/chess/lib/ChessPiece.java @@ -0,0 +1,55 @@ +package de.tilosp.chess.lib; + +public class ChessPiece { + + public final ChessPieceType chessPieceType; + public final PlayerColor playerColor; + private final int movements; + private final int movedInTurn; + private final boolean enPassant; + + public ChessPiece(ChessPieceType chessPieceType, PlayerColor playerColor) { + this(chessPieceType, playerColor, 0, 0, false); + } + + private ChessPiece(ChessPieceType chessPieceType, PlayerColor playerColor, int movements, int movedInTurn, boolean enPassant) { + this.chessPieceType = chessPieceType; + this.playerColor = playerColor; + this.movements = movements; + this.movedInTurn = movedInTurn; + this.enPassant = enPassant; + } + + public int[][] getMove() { + return chessPieceType.getMove(notMoved()); + } + + public int[][] getCapture() { + return chessPieceType.capture; + } + + public ChessPiece moved(int turn, boolean enPassant) { + return new ChessPiece(chessPieceType, playerColor, movements + 1, turn, enPassant); + } + + public ChessPiece promotion(ChessPieceType chessPieceType) { + return new ChessPiece(chessPieceType, playerColor, movements, movedInTurn, false); + } + + public boolean notMoved() { + return movements == 0; + } + + public boolean checkEnPassant(int turn) { + return turn == movedInTurn + 1 && enPassant; + } + + public boolean checkPromotion(int y) { + return chessPieceType == ChessPieceType.PAWN && (playerColor == PlayerColor.WHITE ? 0 : 7) == y; + } + + @Override + public String toString() { + return chessPieceType.toString() + playerColor.toString(); + } +} \ No newline at end of file From 64b5a4b6c1b033308c7955e081d5722930b9fdeb Mon Sep 17 00:00:00 2001 From: Tilo Date: Wed, 6 Apr 2016 13:33:55 +0200 Subject: [PATCH 05/11] Added Chessboard class --- .../java/de/tilosp/chess/lib/Chessboard.java | 186 ++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 src/main/java/de/tilosp/chess/lib/Chessboard.java diff --git a/src/main/java/de/tilosp/chess/lib/Chessboard.java b/src/main/java/de/tilosp/chess/lib/Chessboard.java new file mode 100644 index 0000000..516a9f9 --- /dev/null +++ b/src/main/java/de/tilosp/chess/lib/Chessboard.java @@ -0,0 +1,186 @@ +package de.tilosp.chess.lib; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.stream.Collectors; + +public class Chessboard { + + private static final ChessPiece[][] INITIAL_POSITIONS = new ChessPiece[8][8]; + + static { + for (int i = 0; i < 8; i++) { + INITIAL_POSITIONS[i][0] = new ChessPiece(ChessPieceType.POSITIONS_FIRST_ROW[i], PlayerColor.BLACK); + INITIAL_POSITIONS[i][1] = new ChessPiece(ChessPieceType.PAWN, PlayerColor.BLACK); + INITIAL_POSITIONS[i][6] = new ChessPiece(ChessPieceType.PAWN, PlayerColor.WHITE); + INITIAL_POSITIONS[i][7] = new ChessPiece(ChessPieceType.POSITIONS_FIRST_ROW[i], PlayerColor.WHITE); + } + } + + private final ChessPiece[][] chessPieces; + private final int turn; + public final PlayerColor playerColor; + public final boolean promotion; + private final int promotionX; + private final int promotionY; + + + public Chessboard() { + this(INITIAL_POSITIONS, 1, PlayerColor.WHITE, false, -1, -1); + } + + private Chessboard(ChessPiece[][] chessPieces, int turn, PlayerColor playerColor, boolean promotion, int promotionX, int promotionY) { + this.chessPieces = chessPieces; + this.turn = turn; + this.playerColor = playerColor; + this.promotion = promotion; + this.promotionX = promotionX; + this.promotionY = promotionY; + } + + public ArrayList getPossibleMoves(int x, int y) { + ArrayList possibilities = new ArrayList<>(); + ChessPiece chessPiece = chessPieces[x][y]; + if (chessPiece != null) { + for (int[] a : chessPiece.getCapture()) { + if (a.length == 4) { // en passant + int gX = x + a[0]; + int gY = y + a[1] * (chessPiece.playerColor.ordinal() * 2 - 1); + int bX = x + a[2]; + int bY = y + a[3] * (chessPiece.playerColor.ordinal() * 2 - 1); + if (gX < 0 || gX > 7 || gY < 0 || gY > 7) + continue; + if (chessPieces[gX][gY] == null && chessPieces[bX][bY] != null && chessPieces[bX][bY].playerColor != chessPiece.playerColor && chessPieces[bX][bY].chessPieceType == ChessPieceType.PAWN && chessPieces[bX][bY].checkEnPassant(turn)) + possibilities.add(new int[] { gX, gY, bX, bY }); + } else { + int extend = a.length == 3 ? a[2] : 1; + for (int i = 1; i <= extend; i++) { + int nX = x + i * a[0]; + int nY = y + i * a[1] * (chessPiece.playerColor.ordinal() * 2 - 1); + if (nX < 0 || nX > 7 || nY < 0 || nY > 7) + continue; + if (chessPieces[nX][nY] != null) { + if (chessPieces[nX][nY].playerColor != chessPiece.playerColor) + possibilities.add(new int[] { nX, nY }); + break; + } + } + } + } + for (int[] a : chessPiece.getMove()) { + int extend = a.length == 3 ? a[2] : 1; + for (int i = 1; i <= extend; i++) { + int nX = x + i * a[0]; + int nY = y + i * a[1] * (chessPiece.playerColor.ordinal() * 2 - 1); + if (nX < 0 || nX > 7 || nY < 0 || nY > 7) + continue; + if (chessPieces[nX][nY] == null) + possibilities.add(new int[] { nX, nY }); + else + break; + } + } + if (chessPiece.chessPieceType == ChessPieceType.KING) { + if (chessPiece.notMoved()) { + if (chessPieces[7][y] != null && chessPieces[7][y].notMoved() && chessPieces[6][y] == null && chessPieces[5][y] == null && !isThreatenedField(5, y, chessPiece.playerColor.otherColor())) + possibilities.add(new int[] { 6, y, 7, y, 5, y }); + if (chessPieces[0][y] != null && chessPieces[0][y].notMoved() && chessPieces[1][y] == null && chessPieces[2][y] == null && chessPieces[3][y] == null && !isThreatenedField(3, y, chessPiece.playerColor.otherColor())) + possibilities.add(new int[] { 2, y, 0, y, 3, y }); + } + } + possibilities.removeAll(possibilities.stream().filter(a -> move(new int[] { x, y }, a).inCheck(chessPiece.playerColor)).collect(Collectors.toCollection(ArrayList::new))); + } + return possibilities; + } + + private ArrayList getThreatenedFields(int x, int y) { + ArrayList possibilities = new ArrayList<>(); + ChessPiece chessPiece = chessPieces[x][y]; + if (chessPiece != null) { + for (int[] a : chessPiece.getCapture()) { + int extend = a.length == 3 ? a[2] : 1; + for (int i = 1; i <= extend; i++) { + int nX = x + i * a[0]; + int nY = y + i * a[1] * (chessPiece.playerColor.ordinal() * 2 - 1); + if (nX < 0 || nX > 7 || nY < 0 || nY > 7) + continue; + if (chessPieces[nX][nY] == null) { + possibilities.add(new int[] { nX, nY }); + } else { + possibilities.add(new int[] { nX, nY }); + break; + } + } + } + } + return possibilities; + } + + private boolean isThreatenedField(int x, int y, PlayerColor playerColor) { + for (int i1 = 0; i1 < 8; i1++) + for (int i2 = 0; i2 < 8; i2++) + if (chessPieces[i1][i2] != null && chessPieces[i1][i2].playerColor == playerColor) + for (int[] a : getThreatenedFields(i1, i2)) + if (a[0] == x && a[1] == y) + return true; + return false; + } + + private Chessboard move(int[] from, int[] to) { + ChessPiece[][] chessPieces = copy(this.chessPieces); + chessPieces[to[0]][to[1]] = this.chessPieces[from[0]][from[1]].moved(turn, Math.abs(from[1] - to[1]) > 1); + chessPieces[from[0]][from[1]] = null; + if (to.length == 4) { + chessPieces[to[2]][to[3]] = null; + } else if (to.length == 6) { + chessPieces[to[4]][to[5]] = this.chessPieces[to[2]][to[3]].moved(turn, false); + chessPieces[to[2]][to[3]] = null; + } + boolean promotion = chessPieces[to[0]][to[1]].checkPromotion(to[1]); + return new Chessboard(chessPieces, promotion ? turn : turn + 1, promotion ? playerColor : playerColor.otherColor(), promotion, promotion ? to[0] : -1, promotion ? to[1] : -1); + } + + + public Chessboard checkAndMove(int[] from, int[] to) { + ArrayList m = getPossibleMoves(from[0], from[1]); + for (int[] t : m) + if (t[0] == to[0] && t[1] == to[1]) + return move(from, t); + return null; + } + + private boolean inCheck(PlayerColor playerColor) { + int[] pos = findChessPiece(ChessPieceType.KING, playerColor); + return pos != null && isThreatenedField(pos[0], pos[1], playerColor.otherColor()); + } + + private int[] findChessPiece(ChessPieceType chessPieceType, PlayerColor playerColor) { + for (int y = 0; y < 8; y++) + for (int x = 0; x < 8; x++) + if (chessPieces[x][y] != null && chessPieces[x][y].chessPieceType == chessPieceType && chessPieces[x][y].playerColor == playerColor) + return new int[] { x, y }; + return null; + } + + public Chessboard promotion(ChessPieceType chessPieceType) { + ChessPiece[][] chessPieces = copy(this.chessPieces); + chessPieces[promotionX][promotionY] = chessPieces[promotionX][promotionY].promotion(chessPieceType); + return new Chessboard(chessPieces, turn + 1, playerColor.otherColor(), false, -1, -1); + } + + public ChessPiece getChessPiece(int x, int y) { + return chessPieces[x][y]; + } + + @Override + public String toString() { + return Arrays.deepToString(chessPieces); + } + + private ChessPiece[][] copy(ChessPiece[][] array) { + ChessPiece[][] a = new ChessPiece[array.length][]; + for (int i = 0; i < a.length; i++) + a[i] = Arrays.copyOf(array[i], array[i].length); + return a; + } +} From 970946188f08e65d4c3cb6145395de981782a88e Mon Sep 17 00:00:00 2001 From: Tilo Date: Wed, 6 Apr 2016 14:34:07 +0200 Subject: [PATCH 06/11] Added Player and LocalPlayer --- src/main/java/de/tilosp/chess/player/LocalPlayer.java | 4 ++++ src/main/java/de/tilosp/chess/player/Player.java | 4 ++++ 2 files changed, 8 insertions(+) create mode 100644 src/main/java/de/tilosp/chess/player/LocalPlayer.java create mode 100644 src/main/java/de/tilosp/chess/player/Player.java diff --git a/src/main/java/de/tilosp/chess/player/LocalPlayer.java b/src/main/java/de/tilosp/chess/player/LocalPlayer.java new file mode 100644 index 0000000..84f2655 --- /dev/null +++ b/src/main/java/de/tilosp/chess/player/LocalPlayer.java @@ -0,0 +1,4 @@ +package de.tilosp.chess.player; + +public class LocalPlayer extends Player { +} diff --git a/src/main/java/de/tilosp/chess/player/Player.java b/src/main/java/de/tilosp/chess/player/Player.java new file mode 100644 index 0000000..c5d5611 --- /dev/null +++ b/src/main/java/de/tilosp/chess/player/Player.java @@ -0,0 +1,4 @@ +package de.tilosp.chess.player; + +abstract class Player { +} From b591b2a4b6e593c37124ce60ec0805d146f4a06b Mon Sep 17 00:00:00 2001 From: Tilo Date: Wed, 6 Apr 2016 15:06:19 +0200 Subject: [PATCH 07/11] Made player public --- src/main/java/de/tilosp/chess/player/Player.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/tilosp/chess/player/Player.java b/src/main/java/de/tilosp/chess/player/Player.java index c5d5611..4d319c0 100644 --- a/src/main/java/de/tilosp/chess/player/Player.java +++ b/src/main/java/de/tilosp/chess/player/Player.java @@ -1,4 +1,4 @@ package de.tilosp.chess.player; -abstract class Player { +public abstract class Player { } From bc47d989d030cbc1c74d028a2ff0ed9c70a420a3 Mon Sep 17 00:00:00 2001 From: Tilo Date: Wed, 6 Apr 2016 20:29:53 +0200 Subject: [PATCH 08/11] Added custom button for custom color on hover --- .../java/de/tilosp/chess/gui/HoverButton.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/main/java/de/tilosp/chess/gui/HoverButton.java diff --git a/src/main/java/de/tilosp/chess/gui/HoverButton.java b/src/main/java/de/tilosp/chess/gui/HoverButton.java new file mode 100644 index 0000000..d308cfe --- /dev/null +++ b/src/main/java/de/tilosp/chess/gui/HoverButton.java @@ -0,0 +1,65 @@ +package de.tilosp.chess.gui; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; + +public class HoverButton extends JButton implements MouseListener { + + private Color color; + private Color colorHover; + private boolean hover; + + public HoverButton() { + super(); + addMouseListener(this); + } + + public void setBackground(Color color, Color colorHover) { + this.color = color; + this.colorHover = colorHover; + updateBackground(); + } + + + @Override + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + updateBackground(); + } + + private void updateBackground() { + if (hover && isEnabled()) + setBackground(colorHover); + else + setBackground(color); + } + + @Override + public void mouseClicked(MouseEvent e) { + + } + + @Override + public void mousePressed(MouseEvent e) { + + } + + @Override + public void mouseReleased(MouseEvent e) { + + } + + @Override + public void mouseEntered(MouseEvent e) { + hover = true; + updateBackground(); + } + + @Override + public void mouseExited(MouseEvent e) { + hover = false; + updateBackground(); + } +} From 0b1d1533da150482a40ae21d6b09d85eb6dc3004 Mon Sep 17 00:00:00 2001 From: Tilo Date: Wed, 6 Apr 2016 21:04:41 +0200 Subject: [PATCH 09/11] Added ChessPiece icons --- src/main/java/de/tilosp/chess/icon/Icons.java | 22 ++++++++++++++++++ .../de/tilosp/chess/icon/black_bishop.png | Bin 0 -> 1767 bytes .../de/tilosp/chess/icon/black_king.png | Bin 0 -> 4107 bytes .../de/tilosp/chess/icon/black_knight.png | Bin 0 -> 2594 bytes .../de/tilosp/chess/icon/black_pawn.png | Bin 0 -> 1115 bytes .../de/tilosp/chess/icon/black_queen.png | Bin 0 -> 3779 bytes .../de/tilosp/chess/icon/black_rook.png | Bin 0 -> 1032 bytes .../de/tilosp/chess/icon/white_bishop.png | Bin 0 -> 3040 bytes .../de/tilosp/chess/icon/white_king.png | Bin 0 -> 3879 bytes .../de/tilosp/chess/icon/white_knight.png | Bin 0 -> 3133 bytes .../de/tilosp/chess/icon/white_pawn.png | Bin 0 -> 2059 bytes .../de/tilosp/chess/icon/white_queen.png | Bin 0 -> 4709 bytes .../de/tilosp/chess/icon/white_rook.png | Bin 0 -> 1293 bytes 13 files changed, 22 insertions(+) create mode 100644 src/main/java/de/tilosp/chess/icon/Icons.java create mode 100644 src/main/resources/de/tilosp/chess/icon/black_bishop.png create mode 100644 src/main/resources/de/tilosp/chess/icon/black_king.png create mode 100644 src/main/resources/de/tilosp/chess/icon/black_knight.png create mode 100644 src/main/resources/de/tilosp/chess/icon/black_pawn.png create mode 100644 src/main/resources/de/tilosp/chess/icon/black_queen.png create mode 100644 src/main/resources/de/tilosp/chess/icon/black_rook.png create mode 100644 src/main/resources/de/tilosp/chess/icon/white_bishop.png create mode 100644 src/main/resources/de/tilosp/chess/icon/white_king.png create mode 100644 src/main/resources/de/tilosp/chess/icon/white_knight.png create mode 100644 src/main/resources/de/tilosp/chess/icon/white_pawn.png create mode 100644 src/main/resources/de/tilosp/chess/icon/white_queen.png create mode 100644 src/main/resources/de/tilosp/chess/icon/white_rook.png diff --git a/src/main/java/de/tilosp/chess/icon/Icons.java b/src/main/java/de/tilosp/chess/icon/Icons.java new file mode 100644 index 0000000..e63f74c --- /dev/null +++ b/src/main/java/de/tilosp/chess/icon/Icons.java @@ -0,0 +1,22 @@ +package de.tilosp.chess.icon; + +import de.tilosp.chess.lib.ChessPieceType; +import de.tilosp.chess.lib.PlayerColor; + +import javax.swing.*; + +public final class Icons { + + public static final Icon[][] icons; + + static { + icons = new Icon[PlayerColor.values().length][ChessPieceType.values().length]; + for (PlayerColor playerColor : PlayerColor.values()) + for (ChessPieceType chessPieceType : ChessPieceType.values()) + icons[playerColor.ordinal()][chessPieceType.ordinal()] = new ImageIcon(Icons.class.getResource(playerColor.name().toLowerCase() + "_" + chessPieceType.name().toLowerCase() + ".png")); + } + + public static Icon getIcon(PlayerColor playerColor, ChessPieceType chessPieceType) { + return icons[playerColor.ordinal()][chessPieceType.ordinal()]; + } +} diff --git a/src/main/resources/de/tilosp/chess/icon/black_bishop.png b/src/main/resources/de/tilosp/chess/icon/black_bishop.png new file mode 100644 index 0000000000000000000000000000000000000000..f13ad0855a258ec0545f9e87764dfa0754b7772b GIT binary patch literal 1767 zcmVt3Y5ET)u#Q68Zf{LbFiITJ~(B-Ey zyFT2VQkUIyXLn}K%zLU}G%nDDeP>v5rGUO=5tdfK21_frw#hLqTqZ~k zNef-8DZ)bF9QMQ2SpqcD3Q`N11imQay1nQY;u^POzlGc?p=d3!ozk80ija;q#WlbP zvpeGeaJ7(*H9-ULB5;P%TSyw%23#hfZ`Be89s~ZS{E6Xl;1PoVxIvsIU=QUxB40iw zK(ltgu^#oG?UXYt`3KnOp&eDh79fN3&afl{^m=AZfC&Mw;hrP%++(QL@MkEr+Mk0|)`;_}Uurm;}qn7QIRhh9^ENd7>)-a50 zEEcQ8DW`x{9@y(^Lco_)5N`VW`?D7P{r#1Ou6+piC(`Nnhk@HFxxt({a|(VglUslX zD!oZ1NIIk*cv-OgV!R40kSbi#ArIltG)5C}zf|Fp@$x6&dOH`yVlle9y8aiMIy*aw zL?QqrlSvL9JUIP3!!U@)EFyEOD(CiXbsl4+G=CB7w5)Fb-USa*St4 zgscqktw6bUIe^E`0J)j^KB02$5Ck0^qZv4l^D*BkIY(tXwgSlj@)ci9-gnV%-?9>W z3#Yx3G_b-&yM4{m$U7iko^aJ-pHm0Kk#~Y6A0WKWKq~!iVWJilgn)akFW0PDLtkGX zjg5`26gn|6K~GN)hYlT@`Sl>`v2w%dNcL?YpOfiue33A~ZhK^#9VGJXMg7GUn&xpa4T)7;$bNCNdvVBLsWDq_)Q*_wd+SzDwT~!qn}IGiD)h>kx0yIZ*Qlgql0i*HffN_ zWEdG4A(>2GBC3cmyOHn6^JTZI7SDooE^EJV`GpW&fT107F<(n7AW0Z_3HdN($#(pe za22B)7(>nxN%X-17g3LTNR_}lM;r#8BtXZ=N)Q4%QD>ighqLRq&ZEw2+zQ;}l|gn0 zLcCmt+V9r^tOi<9Ij~X~N2T_EMvb2Kpx!;=TikL;9cpdUGF0U)M!gls3JvqQusJ`( zg@oP$)XpVKns9y-{~6Rtbth-YncVLtX8c_mwSv+5Jf4#Y)XQRy;KE~HrySA<+=V)t zVs%ccJuat#Ur-_NJ>W-Kbreg1cPQ^n_G*$0@GOHi*gD#Urzg6Olrzo?n^F;qgZ*u<<3wQX)WYI3>=HNmW>_y}k+ zSJq52Ilb$1_h>-PxmKa(TE%n*l_A)K%FUHbxf8<%pa-}c6(c8674#YE6+=g;{$>4P zR5oHAa3>H!oltr9kQd*Xfzs)Mx)VaG#ZUYqtR3){{bPsd9G+*wzL2M002ov JPDHLkV1n#FDOmsj literal 0 HcmV?d00001 diff --git a/src/main/resources/de/tilosp/chess/icon/black_king.png b/src/main/resources/de/tilosp/chess/icon/black_king.png new file mode 100644 index 0000000000000000000000000000000000000000..6a8440bbb078111366c1378d1d6e04c6e6e13c9c GIT binary patch literal 4107 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 S17+~X9nesLD_1?X2>l-*i{OU< literal 0 HcmV?d00001 diff --git a/src/main/resources/de/tilosp/chess/icon/black_knight.png b/src/main/resources/de/tilosp/chess/icon/black_knight.png new file mode 100644 index 0000000000000000000000000000000000000000..e57052e573013023a4d46a36bf601772344f25ec GIT binary patch literal 2594 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 Ef_cK>jQ{`u literal 0 HcmV?d00001 diff --git a/src/main/resources/de/tilosp/chess/icon/black_pawn.png b/src/main/resources/de/tilosp/chess/icon/black_pawn.png new file mode 100644 index 0000000000000000000000000000000000000000..e39c5cb70fc172829707bd0cf27e3ed644404daf GIT binary patch literal 1115 zcmV-h1f=_kP)xL5nM3At*{V5L{W}PiiP%SqvC=^Y*bJXTtE?2FxY4`E>V*>7MBN!apGih&pG$KIUoG( zS?)jg&U^RWc>|8)IF92uj^j9v<2a7vIF92uj^orWqpS<4lIcJT&;-l{dVqJpL*N$B zZC6@t(F9xudVx|IeFaVvOmhTjV`wA(RwrQ=IRc!eawGby7dT*0Z=q?UIx{l;0yd~u zT~L}B-ZE8AZ-Md3wHK00jNFV&N0e(X9McGwv#|_$qFa9P*iSq&GA&f?pbF}&3mAeX zftbw#F{6^QA#(&`&J~Cmm6Q$nEfBL$AZAojHspOyVn!upL+(e8R{|bHj#*Po0lpCL z3hSP3`PGr~4Cw;yM2vSSVyv2@4md^JdypT%KFubI!YJSZ@ox%Cge$j$daV?LlgOBn zsTbIx)=kc7Mb?Z=pMd#FJ>{0kKnFU8lzxLp~bk?=;RofD{br06rV$e{Pt25Gfc^0v;LWe`uI{ z5Gfb}aLq9HRm0rLGM_kys)wsrr1PN!(kbRGaK#|+8D!3X6@q5s9<9gSIxjT7#(wZUX$iaI?{=o#oENQnc zBqq(IdCyU)ItY&iRM6OdKSX}tehT58D^{oTqcaxxfc>X@q`Dq^V614telTO`7vY6! z;z%!9yM*IwF&5aSkx1H*B5i4JvMykxEXIDRiK+J}T%1VGkadEwEtmx?l1?IN$V$Q3 zR;-dvAZf@7!Pr)a_atdZo;DIIMdD4V1CTPLp0MT?4e^%@NEy;dzPC%t(I}lj%8(+? z4uILx38V}u>OT>TCfv1)A!UeY(Z+~w#Y=vv7Zo=oF+_VCBNX=;;jfB{$am`k9LI4S h$8j9TaU93d;twhlh{z%3eAoa0002ovPDHLkV1ljC@C*O| literal 0 HcmV?d00001 diff --git a/src/main/resources/de/tilosp/chess/icon/black_queen.png b/src/main/resources/de/tilosp/chess/icon/black_queen.png new file mode 100644 index 0000000000000000000000000000000000000000..2b495645ced28e8d2b7c4b10573429af5f8a9262 GIT binary patch literal 3779 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 XE=+7Elw|yC00000NkvXXu0mjfuJ+uE literal 0 HcmV?d00001 diff --git a/src/main/resources/de/tilosp/chess/icon/white_pawn.png b/src/main/resources/de/tilosp/chess/icon/white_pawn.png new file mode 100644 index 0000000000000000000000000000000000000000..8c3aaa1b973c093808300bb032d8640f6db9bbf2 GIT binary patch literal 2059 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 c2X$~~UKCb8mdbtw90}p5D{CuNDp4nJ z$gKlm#vAMAZ2<~OmbgZg1m~xflqVLYGL)B>>t*I;7bhncr0V4trO$q6BLy_5%hSa% zq+-t7J7=?%Q)SpctoO{gbYYqh%S&q~XFtmhcJ+VET(*@QEZ;U&ytulVOHL&B!rqF@ zlc(F7>}L08?7rZ@etyrq5s;~O8B16q@vWcqZ#a&1Vlsp zy|s7PGM;|?$*aJ&I&(|h?ep3PzqW}@2$eWs)bN1e_j=BC>D=4mtWRxZUu$l%e)_)? zW@csrz4v4Vy_O2`@$t1>-5jbV`sDM^g|DRA8mCU(Eq*}bYssXh$3f=4mtRde{nV^)X#&pGp5ApBuL#f$5H zzP`L)>+{?)C%=nnUsJR*M|JW^$M>_=_^1`XFGxL|V#IviS8a0G&X_Q(l#?}lo{T@P z#u@r?<874NObLY)FcIZ&k^4jy~&IPOuvwbVg)w*HJmX?GKzune_ zXeE}GUfuaJmf`n2E`E=n)gA^CZ)_qH_pmJ&Uix0~%GvGODcRZF#l^*SvVJR0pZ31$ zEAU8=?f;DAm}%}zzhCmrbiQUUl)YN*?VXhRTfc=HzQ393pwLiZ(>HUbWW(X?9LX}2g3XN-j^#h zC{J-wYV=SkdjH<^PuR+kfYnzEDk?JaKbi7Ojay(UBhj|7YD$(d&tXfSy#W^uSJ_$p zbiG)}zHmwJA02OF9v4c{ssG15{Q4!eG|02mnBmU0)F9i|U;CSiqUU*8|F#RM*>2A8 zK;(cl!-j3!+I-X&FOa;uZTt4Zl9H75|5y_Q51jqGzCyz6;SbL<^3?_C9;gNkE$?~J#k^^o z)dT*2Se8|(wBSEOhwP>&XHqQXTITMa!hZPa)6^wF|NV2T3kw^QHomCTin!b2qzopr0M+YPSO5S3 literal 0 HcmV?d00001 From ced76bf5c391b785b80f792c31f67878a6926e76 Mon Sep 17 00:00:00 2001 From: Tilo Date: Wed, 6 Apr 2016 22:02:43 +0200 Subject: [PATCH 10/11] Added 2 player local mode --- .../de/tilosp/chess/gui/ChessboardGUI.java | 252 ++++++++++++++++++ .../java/de/tilosp/chess/gui/NewGameGUI.java | 16 +- 2 files changed, 267 insertions(+), 1 deletion(-) create mode 100644 src/main/java/de/tilosp/chess/gui/ChessboardGUI.java diff --git a/src/main/java/de/tilosp/chess/gui/ChessboardGUI.java b/src/main/java/de/tilosp/chess/gui/ChessboardGUI.java new file mode 100644 index 0000000..8cb31e1 --- /dev/null +++ b/src/main/java/de/tilosp/chess/gui/ChessboardGUI.java @@ -0,0 +1,252 @@ +package de.tilosp.chess.gui; + +import de.tilosp.chess.icon.Icons; +import de.tilosp.chess.lib.ChessPiece; +import de.tilosp.chess.lib.ChessPieceType; +import de.tilosp.chess.lib.Chessboard; +import de.tilosp.chess.player.LocalPlayer; +import de.tilosp.chess.player.Player; + +import javax.swing.*; +import javax.swing.border.BevelBorder; +import javax.swing.border.Border; +import java.awt.*; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; + +public class ChessboardGUI extends GUI { + + private static final Border BORDER_INSERTS = BorderFactory.createEmptyBorder(5, 5, 5, 5); + private static final Border BORDER_BEVEL_RAISED = BorderFactory.createBevelBorder(BevelBorder.RAISED); + private static final Border BORDER_BEVEL_LOWERED = BorderFactory.createBevelBorder(BevelBorder.LOWERED); + private static final Border BORDER_SIDE_PANEL = BorderFactory.createCompoundBorder(BORDER_BEVEL_RAISED, BORDER_BEVEL_LOWERED); + + private static final Color COLOR_1 = new Color(255, 206, 158); + private static final Color COLOR_1_B = new Color(255, 222, 174); + private static final Color COLOR_2 = new Color(209, 139, 71); + private static final Color COLOR_2_B = new Color(225, 155, 87); + private static final Color COLOR_SELECTED = new Color(209, 82, 60); + private static final Color COLOR_SELECTED_B = new Color(225, 98, 76); + private static final Color COLOR_SHOW = new Color(183, 78, 55); + private static final Color COLOR_SHOW_B = new Color(199, 94, 71); + private static final Color COLOR_PROMOTION = Color.WHITE; + private static final Color COLOR_PROMOTION_D = Color.WHITE.darker(); + + private static final Font FONT_LABEL = new Font(null, 0, 75); + + private HoverButton[][] boardButtons; + private HoverButton[] promotionButtons; + private JLabel[] topLabels; + private JLabel[] leftLabels; + private JLabel topLabel; + + private final Player[] players; + private Chessboard chessboard; + private int[] selected; + + public ChessboardGUI(Player player1, Player player2) { + super(); + players = new Player[] { player1, player2 }; + } + + @Override + void initGUI() { + setTitle("Chess"); + panel.setLayout(new BorderLayout()); + JPanel chessboardMPanel = new JPanel(); + panel.add(chessboardMPanel, BorderLayout.CENTER); + + chessboard = new Chessboard(); + + // initialise chessboard + JPanel chessboardPanel = new JPanel(new GridLayout(9, 9)); + chessboardMPanel.add(chessboardPanel); + chessboardMPanel.addComponentListener(new ComponentAdapter() { + + @Override + public void componentResized(ComponentEvent e) { + int size = Math.min(chessboardMPanel.getWidth(), chessboardMPanel.getHeight()); + chessboardPanel.setPreferredSize(new Dimension(size, size)); + chessboardMPanel.revalidate(); + } + }); + + boardButtons = new HoverButton[8][8]; + promotionButtons = new HoverButton[4]; + topLabels = new JLabel[8]; + leftLabels = new JLabel[8]; + + chessboardPanel.add(new JLabel()); + for (int i = 0; i < 8; i++) + chessboardPanel.add(topLabels[i] = newLabel(Character.toString((char) (0x61 + i)))); + for (int y = 0; y < 8; y++) { + chessboardPanel.add(leftLabels[y] = newLabel(Integer.toString(8 - y))); + for (int x = 0; x < 8; x++) { + HoverButton button = new HoverButton(); + button.setBorder(null); + chessboardPanel.add(boardButtons[x][y] = button); + } + } + + // initialise side panel + JPanel sidePanelO = new JPanel(new BorderLayout()); + panel.add(sidePanelO, BorderLayout.LINE_END); + sidePanelO.setBorder(BORDER_INSERTS); + + JPanel sidePanel = new JPanel(new BorderLayout()); + sidePanelO.add(sidePanel, BorderLayout.CENTER); + sidePanel.setBorder(BORDER_SIDE_PANEL); + + + sidePanel.add(Box.createVerticalGlue(), BorderLayout.CENTER); + topLabel = new JLabel("White"); + topLabel.setFont(FONT_LABEL); + topLabel.setBorder(BORDER_INSERTS); + + sidePanel.add(topLabel, BorderLayout.PAGE_START); + + // add promotion buttons + JPanel promotionPanel = new JPanel(new GridLayout(2, 2)); + promotionPanel.setBorder(BORDER_INSERTS); + for (int i = 0; i < 4; i++) { + HoverButton button = new HoverButton(); + button.setBorder(null); + button.setBackground(COLOR_PROMOTION, COLOR_PROMOTION_D); + button.setEnabled(false); + promotionPanel.add(promotionButtons[i] = button); + } + sidePanel.add(promotionPanel, BorderLayout.PAGE_END); + + // setup background + updateBackground(); + + // setup icons + updateIcons(); + + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + } + + @Override + void initListeners() { + for (int y = 0; y < 8; y++) { + for (int x = 0; x < 8; x++) { + final int fX = x, fY = y; + boardButtons[x][y].addActionListener(e -> buttonPressed(fX, fY)); + boardButtons[x][y].addMouseListener(new MouseListener() { + @Override + public void mouseClicked(MouseEvent e) { + + } + + @Override + public void mousePressed(MouseEvent e) { + + } + + @Override + public void mouseReleased(MouseEvent e) { + + } + + @Override + public void mouseEntered(MouseEvent e) { + setLabels(fX, fY); + } + + @Override + public void mouseExited(MouseEvent e) { + resetLabels(fX, fY); + } + }); + } + } + for (int i = 0; i < 4; i++) { + final int fI = i; + promotionButtons[i].addActionListener(e -> promotionButtonPressed(fI)); + } + } + + private void resetLabels(int x, int y) { + Font font = topLabels[x].getFont(); + topLabels[x].setFont(new Font(font.getName(), font.getStyle() & ~Font.BOLD, font.getSize())); + font = leftLabels[y].getFont(); + leftLabels[y].setFont(new Font(font.getName(), font.getStyle() & ~Font.BOLD, font.getSize())); + } + + private void setLabels(int x, int y) { + Font font = topLabels[x].getFont(); + topLabels[x].setFont(new Font(font.getName(), font.getStyle() | Font.BOLD, font.getSize())); + font = leftLabels[y].getFont(); + leftLabels[y].setFont(new Font(font.getName(), font.getStyle() | Font.BOLD, font.getSize())); + } + + private void buttonPressed(int x, int y) { + if (!chessboard.promotion) { + if (chessboard.getChessPiece(x, y) != null && chessboard.getChessPiece(x, y).playerColor == chessboard.playerColor && players[chessboard.playerColor.ordinal()] instanceof LocalPlayer && !chessboard.getPossibleMoves(x, y).isEmpty()) { + selected = new int[] { x, y }; + updateBackground(); + } else if (selected != null) { + Chessboard move = chessboard.checkAndMove(selected, new int[] { x, y }); + if (move != null) { + chessboard = move; + selected = null; + updateIcons(); + updateBackground(); + } + } + } + } + + private void promotionButtonPressed(int i) { + if (chessboard.promotion && players[chessboard.playerColor.ordinal()] instanceof LocalPlayer) { + chessboard = chessboard.promotion(ChessPieceType.POSITIONS_PROMOTION[i]); + updateIcons(); + } + } + + private void updateBackground() { + for (int y = 0; y < 8; y++) + for (int x = 0; x < 8; x++) + boardButtons[x][y].setBackground(((x ^ y) & 1) == 0 ? COLOR_1 : COLOR_2, ((x ^ y) & 1) == 0 ? COLOR_1_B : COLOR_2_B); + if (selected != null) { + boardButtons[selected[0]][selected[1]].setBackground(COLOR_SELECTED, COLOR_SELECTED_B); + for (int[] m : chessboard.getPossibleMoves(selected[0], selected[1])) + boardButtons[m[0]][m[1]].setBackground(COLOR_SHOW, COLOR_SHOW_B); + } + } + + private JLabel newLabel(String text) { + JLabel label = new JLabel(text); + label.setHorizontalAlignment(SwingConstants.CENTER); + label.setFont(FONT_LABEL); + label.addComponentListener(new ComponentAdapter() { + + @Override + public void componentResized(ComponentEvent e) { + Font font = label.getFont(); + label.setFont(new Font(font.getName(), font.getStyle(), (int) (label.getSize().height * 0.8))); + } + }); + return label; + } + + private void updateIcons() { + // update chessboard icons + for (int y = 0; y < 8; y++) { + for (int x = 0; x < 8; x++) { + ChessPiece chessPiece = chessboard.getChessPiece(x, y); + boardButtons[x][y].setIcon(chessPiece != null ? Icons.getIcon(chessPiece.playerColor, chessPiece.chessPieceType) : null); + } + } + + // update promotion icons + for (int i = 0; i < 4; i++) + promotionButtons[i].setIcon(Icons.getIcon(chessboard.playerColor, ChessPieceType.POSITIONS_PROMOTION[i])); + + // update promotion buttons + for (int i = 0; i < 4; i++) + promotionButtons[i].setEnabled(chessboard.promotion && players[chessboard.playerColor.ordinal()] instanceof LocalPlayer); + } +} diff --git a/src/main/java/de/tilosp/chess/gui/NewGameGUI.java b/src/main/java/de/tilosp/chess/gui/NewGameGUI.java index 4d67f8f..9e5713f 100644 --- a/src/main/java/de/tilosp/chess/gui/NewGameGUI.java +++ b/src/main/java/de/tilosp/chess/gui/NewGameGUI.java @@ -1,5 +1,7 @@ package de.tilosp.chess.gui; +import de.tilosp.chess.player.LocalPlayer; + import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; @@ -73,6 +75,7 @@ void initGUI() { c.gridx = 0; c.gridwidth = 5; panel.add(startButton = new JButton("Start"), c); + getRootPane().setDefaultButton(startButton); updateEnabledStatus(); @@ -120,7 +123,18 @@ void update() { } private void onStartButtonPressed() { - // TODO + if (onePlayerRadioButton.isSelected()) { + // TODO 1 Player + } else { + if (twoPlayerModeComboBox.getSelectedIndex() == 0) { + // 2 Players local + new ChessboardGUI(new LocalPlayer(), new LocalPlayer()).setVisible(true); + } else if(twoPlayerModeComboBox.getSelectedIndex() == 1) { + // TODO 2 Players host + } else { + // TODO 2 Players client + } + } dispose(); } From e6145f418f0b9f9bd2cea213cf6a4a429d3e6129 Mon Sep 17 00:00:00 2001 From: Tilo Date: Wed, 6 Apr 2016 22:20:30 +0200 Subject: [PATCH 11/11] Made top label change --- src/main/java/de/tilosp/chess/gui/ChessboardGUI.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/tilosp/chess/gui/ChessboardGUI.java b/src/main/java/de/tilosp/chess/gui/ChessboardGUI.java index 8cb31e1..800ce41 100644 --- a/src/main/java/de/tilosp/chess/gui/ChessboardGUI.java +++ b/src/main/java/de/tilosp/chess/gui/ChessboardGUI.java @@ -101,7 +101,7 @@ public void componentResized(ComponentEvent e) { sidePanel.add(Box.createVerticalGlue(), BorderLayout.CENTER); - topLabel = new JLabel("White"); + topLabel = new JLabel(); topLabel.setFont(FONT_LABEL); topLabel.setBorder(BORDER_INSERTS); @@ -248,5 +248,6 @@ private void updateIcons() { // update promotion buttons for (int i = 0; i < 4; i++) promotionButtons[i].setEnabled(chessboard.promotion && players[chessboard.playerColor.ordinal()] instanceof LocalPlayer); + topLabel.setText(chessboard.playerColor.toString().toLowerCase()); } }