From bd523018f75fe5524f39d712da05ea7d8ffbb096 Mon Sep 17 00:00:00 2001 From: kske Date: Mon, 9 Sep 2019 19:05:57 +0200 Subject: [PATCH] Refactoring - Simplified FEN-string generation - Made GameConfigurationDialog a utility class --- src/dev/kske/chess/board/Board.java | 33 ++----- src/dev/kske/chess/board/Piece.java | 9 +- src/dev/kske/chess/ui/FENDropTarget.java | 2 +- .../chess/ui/GameConfigurationDialog.java | 87 +++++++++---------- src/dev/kske/chess/ui/MenuBar.java | 4 +- src/dev/kske/chess/ui/TextureUtil.java | 4 +- 6 files changed, 61 insertions(+), 78 deletions(-) diff --git a/src/dev/kske/chess/board/Board.java b/src/dev/kske/chess/board/Board.java index 2b114ab..c8f8e2b 100644 --- a/src/dev/kske/chess/board/Board.java +++ b/src/dev/kske/chess/board/Board.java @@ -480,39 +480,18 @@ public class Board implements Cloneable { // Piece placement (from white's perspective) for (int i = 0; i < 8; i++) { int emptyCount = 0; - for (int j = 0; j < 8; j++) - if (boardArr[j][i] == null) ++emptyCount; + for (int j = 0; j < 8; j++) { + final Piece piece = boardArr[j][i]; + if (piece == null) ++emptyCount; else { if (emptyCount != 0) { sb.append(emptyCount); emptyCount = 0; } - char piece; - switch (boardArr[j][i].getType()) { - case KING: - piece = 'K'; - break; - case QUEEN: - piece = 'Q'; - break; - case ROOK: - piece = 'R'; - break; - case KNIGHT: - piece = 'N'; - break; - case BISHOP: - piece = 'B'; - break; - case PAWN: - piece = 'P'; - break; - default: - piece = '-'; - } - if (boardArr[j][i].getColor() == Color.BLACK) piece = Character.toLowerCase(piece); - sb.append(piece); + char p = boardArr[j][i].getType().firstChar(); + sb.append(piece.getColor() == Color.WHITE ? Character.toUpperCase(p) : p); } + } if (emptyCount != 0) sb.append(emptyCount); if (i < 7) sb.append('/'); } diff --git a/src/dev/kske/chess/board/Piece.java b/src/dev/kske/chess/board/Piece.java index d768f0a..aa5082c 100644 --- a/src/dev/kske/chess/board/Piece.java +++ b/src/dev/kske/chess/board/Piece.java @@ -85,7 +85,14 @@ public abstract class Piece implements Cloneable { } public static enum Type { - KING, QUEEN, ROOK, KNIGHT, BISHOP, PAWN + KING, QUEEN, ROOK, KNIGHT, BISHOP, PAWN; + + /** + * @return The first character of this {@link Type} in algebraic notation and lower case + */ + public char firstChar() { + return this == KNIGHT ? 'n' : Character.toLowerCase(this.toString().charAt(0)); + } } public static enum Color { diff --git a/src/dev/kske/chess/ui/FENDropTarget.java b/src/dev/kske/chess/ui/FENDropTarget.java index 9d913ea..9d8fd2d 100644 --- a/src/dev/kske/chess/ui/FENDropTarget.java +++ b/src/dev/kske/chess/ui/FENDropTarget.java @@ -36,7 +36,7 @@ public class FENDropTarget extends DropTargetAdapter { try (BufferedReader br = new BufferedReader(new FileReader(file))) { final GamePane gamePane = mainWindow.addGamePane(); final String fen = br.readLine(); - new GameConfigurationDialog((whiteName, blackName) -> { + GameConfigurationDialog.show((whiteName, blackName) -> { final Game game = new Game(gamePane.getBoardPane(), whiteName, blackName, fen); gamePane.setGame(game); game.start(); diff --git a/src/dev/kske/chess/ui/GameConfigurationDialog.java b/src/dev/kske/chess/ui/GameConfigurationDialog.java index 45494dc..a9cc9eb 100644 --- a/src/dev/kske/chess/ui/GameConfigurationDialog.java +++ b/src/dev/kske/chess/ui/GameConfigurationDialog.java @@ -4,6 +4,7 @@ import java.awt.Font; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.function.BiConsumer; import javax.swing.DefaultComboBoxModel; import javax.swing.JButton; @@ -17,61 +18,59 @@ import javax.swing.JLabel; * Created: 24.07.2019
* Author: Kai S. K. Engelbart */ -public class GameConfigurationDialog extends JDialog { +public class GameConfigurationDialog { - private static final long serialVersionUID = 9080577278529876972L; + private GameConfigurationDialog() {} - /** - * Create the dialog. - */ - public GameConfigurationDialog(ActionWithConfiguration action) { - setTitle("Game Configuration"); - setBounds(100, 100, 281, 142); - setModal(true); - setLocationRelativeTo(null); - getContentPane().setLayout(null); + public static void show(BiConsumer action) { + new JDialog() { - List options = new ArrayList<>(Arrays.asList("Natural Player", "AI Player")); - EngineUtil.getEngineInfos().forEach(info -> options.add(info.name)); + private static final long serialVersionUID = -5768339760489440385L; - JLabel lblWhite = new JLabel("White:"); - lblWhite.setFont(new Font("Tahoma", Font.PLAIN, 14)); - lblWhite.setBounds(10, 11, 49, 14); - getContentPane().add(lblWhite); + { + setTitle("Game Configuration"); + setBounds(100, 100, 281, 142); + setModal(true); + setLocationRelativeTo(null); + getContentPane().setLayout(null); - JComboBox cbWhite = new JComboBox<>(); - cbWhite.setModel(new DefaultComboBoxModel(options.toArray())); - cbWhite.setBounds(98, 9, 159, 22); - getContentPane().add(cbWhite); + List options = new ArrayList<>(Arrays.asList("Natural Player", "AI Player")); + EngineUtil.getEngineInfos().forEach(info -> options.add(info.name)); - JLabel lblBlack = new JLabel("Black:"); - lblBlack.setFont(new Font("Tahoma", Font.PLAIN, 14)); - lblBlack.setBounds(10, 38, 49, 14); - getContentPane().add(lblBlack); + JLabel lblWhite = new JLabel("White:"); + lblWhite.setFont(new Font("Tahoma", Font.PLAIN, 14)); + lblWhite.setBounds(10, 11, 49, 14); + getContentPane().add(lblWhite); - JComboBox cbBlack = new JComboBox<>(); - cbBlack.setModel(new DefaultComboBoxModel(options.toArray())); - cbBlack.setBounds(98, 36, 159, 22); - getContentPane().add(cbBlack); + JComboBox cbWhite = new JComboBox<>(); + cbWhite.setModel(new DefaultComboBoxModel(options.toArray())); + cbWhite.setBounds(98, 9, 159, 22); + getContentPane().add(cbWhite); - JButton btnStart = new JButton("Start"); - btnStart.addActionListener((evt) -> { - dispose(); - action.onConfigurationSet(options.get(cbWhite.getSelectedIndex()), options.get(cbBlack.getSelectedIndex())); - }); - btnStart.setBounds(20, 73, 89, 23); - getContentPane().add(btnStart); + JLabel lblBlack = new JLabel("Black:"); + lblBlack.setFont(new Font("Tahoma", Font.PLAIN, 14)); + lblBlack.setBounds(10, 38, 49, 14); + getContentPane().add(lblBlack); - JButton btnCancel = new JButton("Cancel"); - btnCancel.addActionListener((evt) -> dispose()); - btnCancel.setBounds(157, 73, 89, 23); - getContentPane().add(btnCancel); + JComboBox cbBlack = new JComboBox<>(); + cbBlack.setModel(new DefaultComboBoxModel(options.toArray())); + cbBlack.setBounds(98, 36, 159, 22); + getContentPane().add(cbBlack); - setVisible(true); - } + JButton btnStart = new JButton("Start"); + btnStart.addActionListener((evt) -> { + dispose(); + action.accept(options.get(cbWhite.getSelectedIndex()), options.get(cbBlack.getSelectedIndex())); + }); + btnStart.setBounds(20, 73, 89, 23); + getContentPane().add(btnStart); - public static interface ActionWithConfiguration { + JButton btnCancel = new JButton("Cancel"); + btnCancel.addActionListener((evt) -> dispose()); + btnCancel.setBounds(157, 73, 89, 23); + getContentPane().add(btnCancel); - void onConfigurationSet(String whiteName, String blackName); + } + }.setVisible(true); } } diff --git a/src/dev/kske/chess/ui/MenuBar.java b/src/dev/kske/chess/ui/MenuBar.java index b339c96..990cb84 100644 --- a/src/dev/kske/chess/ui/MenuBar.java +++ b/src/dev/kske/chess/ui/MenuBar.java @@ -34,7 +34,7 @@ public class MenuBar extends JMenuBar { JMenu gameMenu = new JMenu("Game"); JMenuItem newGameMenuItem = new JMenuItem("New Game"); newGameMenuItem.addActionListener((evt) -> { - new GameConfigurationDialog((whiteName, blackName) -> { + GameConfigurationDialog.show((whiteName, blackName) -> { GamePane gamePane = mainWindow.addGamePane(); Game game = new Game(gamePane.getBoardPane(), whiteName, blackName); gamePane.setGame(game); @@ -80,7 +80,7 @@ public class MenuBar extends JMenuBar { loadFromFENMenuItem.addActionListener((evt) -> { final GamePane gamePane = mainWindow.addGamePane(); final String fen = JOptionPane.showInputDialog("Enter a FEN string: "); - new GameConfigurationDialog((whiteName, blackName) -> { + GameConfigurationDialog.show((whiteName, blackName) -> { final Game game = new Game(gamePane.getBoardPane(), whiteName, blackName, fen); gamePane.setGame(game); game.start(); diff --git a/src/dev/kske/chess/ui/TextureUtil.java b/src/dev/kske/chess/ui/TextureUtil.java index 5597032..03993f7 100644 --- a/src/dev/kske/chess/ui/TextureUtil.java +++ b/src/dev/kske/chess/ui/TextureUtil.java @@ -19,11 +19,9 @@ import dev.kske.chess.board.Piece; */ public class TextureUtil { - private static Map textures, scaledTextures; + private static Map textures = new HashMap<>(), scaledTextures = new HashMap<>(); static { - textures = new HashMap<>(); - scaledTextures = new HashMap<>(); loadPieceTextures(); scaledTextures.putAll(textures); }