Refactoring and documentation, improved FEN integration
+ Adding a new game when loading a FEN string + Loading multiple FEN files with drag and drop
This commit is contained in:
		@@ -17,10 +17,10 @@ import dev.kske.chess.board.Piece.Type;
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
public class Board implements Cloneable {
 | 
					public class Board implements Cloneable {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private Piece[][]						boardArr;
 | 
						private Piece[][]						boardArr		= new Piece[8][8];
 | 
				
			||||||
	private Map<Color, Position>			kingPos;
 | 
						private Map<Color, Position>			kingPos			= new HashMap<>();
 | 
				
			||||||
	private Map<Color, Map<Type, Boolean>>	castlingRights;
 | 
						private Map<Color, Map<Type, Boolean>>	castlingRights	= new HashMap<>();
 | 
				
			||||||
	private Log								log;
 | 
						private Log								log				= new Log();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private static final Map<Type, int[][]> positionScores;
 | 
						private static final Map<Type, int[][]> positionScores;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -59,14 +59,22 @@ public class Board implements Cloneable {
 | 
				
			|||||||
						new int[] { 0, 1, 1, -2, -2, 1, 1, 0 }, new int[] { 0, 0, 0, 0, 0, 0, 0, 0 } });
 | 
											new int[] { 0, 1, 1, -2, -2, 1, 1, 0 }, new int[] { 0, 0, 0, 0, 0, 0, 0, 0 } });
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Initializes the board with the default chess starting position.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
	public Board() {
 | 
						public Board() {
 | 
				
			||||||
		boardArr		= new Piece[8][8];
 | 
					 | 
				
			||||||
		kingPos			= new HashMap<>();
 | 
					 | 
				
			||||||
		castlingRights	= new HashMap<>();
 | 
					 | 
				
			||||||
		log				= new Log();
 | 
					 | 
				
			||||||
		initDefaultPositions();
 | 
							initDefaultPositions();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Initializes the board with data from a FEN-string.
 | 
				
			||||||
 | 
						 * 
 | 
				
			||||||
 | 
						 * @param fen The FEN-string to initialize the board from
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public Board(String fen) {
 | 
				
			||||||
 | 
							initFromFEN(fen);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * Moves a piece across the board if the move is legal.
 | 
						 * Moves a piece across the board if the move is legal.
 | 
				
			||||||
	 * 
 | 
						 * 
 | 
				
			||||||
@@ -369,7 +377,6 @@ public class Board implements Cloneable {
 | 
				
			|||||||
				boardArr[i][j] = null;
 | 
									boardArr[i][j] = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Initialize castling rights
 | 
							// Initialize castling rights
 | 
				
			||||||
		castlingRights.clear();
 | 
					 | 
				
			||||||
		Map<Type, Boolean> whiteCastling = new HashMap<>(), blackCastling = new HashMap<>();
 | 
							Map<Type, Boolean> whiteCastling = new HashMap<>(), blackCastling = new HashMap<>();
 | 
				
			||||||
		whiteCastling.put(Type.KING, true);
 | 
							whiteCastling.put(Type.KING, true);
 | 
				
			||||||
		whiteCastling.put(Type.QUEEN, true);
 | 
							whiteCastling.put(Type.QUEEN, true);
 | 
				
			||||||
@@ -434,22 +441,25 @@ public class Board implements Cloneable {
 | 
				
			|||||||
		log.setActiveColor(Color.fromFirstChar(parts[1].charAt(0)));
 | 
							log.setActiveColor(Color.fromFirstChar(parts[1].charAt(0)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Castling rights
 | 
							// Castling rights
 | 
				
			||||||
 | 
							Map<Type, Boolean> whiteCastling = new HashMap<>(), blackCastling = new HashMap<>();
 | 
				
			||||||
		for (char c : parts[2].toCharArray())
 | 
							for (char c : parts[2].toCharArray())
 | 
				
			||||||
			switch (c) {
 | 
								switch (c) {
 | 
				
			||||||
				case 'K':
 | 
									case 'K':
 | 
				
			||||||
					castlingRights.get(Color.WHITE).put(Type.KING, true);
 | 
										whiteCastling.put(Type.KING, true);
 | 
				
			||||||
				case 'Q':
 | 
									case 'Q':
 | 
				
			||||||
					castlingRights.get(Color.WHITE).put(Type.QUEEN, true);
 | 
										whiteCastling.put(Type.QUEEN, true);
 | 
				
			||||||
				case 'k':
 | 
									case 'k':
 | 
				
			||||||
					castlingRights.get(Color.BLACK).put(Type.KING, true);
 | 
										blackCastling.put(Type.KING, true);
 | 
				
			||||||
				case 'q':
 | 
									case 'q':
 | 
				
			||||||
					castlingRights.get(Color.BLACK).put(Type.QUEEN, true);
 | 
										blackCastling.put(Type.QUEEN, true);
 | 
				
			||||||
				case '-':
 | 
									case '-':
 | 
				
			||||||
					break;
 | 
										break;
 | 
				
			||||||
				default:
 | 
									default:
 | 
				
			||||||
					System.err
 | 
										System.err
 | 
				
			||||||
						.printf("Unknown character '%c' in castling rights declaration of FEN string '%s'", c, fen);
 | 
											.printf("Unknown character '%c' in castling rights declaration of FEN string '%s'", c, fen);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
							castlingRights.put(Color.WHITE, whiteCastling);
 | 
				
			||||||
 | 
							castlingRights.put(Color.BLACK, blackCastling);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// En passant availability
 | 
							// En passant availability
 | 
				
			||||||
		if (!parts[3].equals("-")) log.setEnPassant(Position.fromSAN(parts[3]));
 | 
							if (!parts[3].equals("-")) log.setEnPassant(Position.fromSAN(parts[3]));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,18 +26,29 @@ import dev.kske.chess.ui.OverlayComponent;
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
public class Game {
 | 
					public class Game {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private Map<Color, Player>	players;
 | 
						private Map<Color, Player>	players	= new HashMap<>();
 | 
				
			||||||
	private Board				board;
 | 
						private Board				board;
 | 
				
			||||||
	private OverlayComponent	overlayComponent;
 | 
						private OverlayComponent	overlayComponent;
 | 
				
			||||||
	private BoardComponent		boardComponent;
 | 
						private BoardComponent		boardComponent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public Game(BoardPane boardPane, String whiteName, String blackName) {
 | 
						public Game(BoardPane boardPane, String whiteName, String blackName) {
 | 
				
			||||||
		players				= new HashMap<>();
 | 
					 | 
				
			||||||
		board				= new Board();
 | 
							board				= new Board();
 | 
				
			||||||
 | 
							init(boardPane, whiteName, blackName);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public Game(BoardPane boardPane, String whiteName, String blackName, String fen) {
 | 
				
			||||||
 | 
							board = new Board(fen);
 | 
				
			||||||
 | 
							init(boardPane, whiteName, blackName);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private void init(BoardPane boardPane, String whiteName, String blackName) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Initialize / synchronize UI
 | 
				
			||||||
		overlayComponent	= boardPane.getOverlayComponent();
 | 
							overlayComponent	= boardPane.getOverlayComponent();
 | 
				
			||||||
		boardComponent		= boardPane.getBoardComponent();
 | 
							boardComponent		= boardPane.getBoardComponent();
 | 
				
			||||||
		boardComponent.setBoard(board);
 | 
							boardComponent.setBoard(board);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Initialize players
 | 
				
			||||||
		players.put(Color.WHITE, getPlayer(whiteName, Color.WHITE));
 | 
							players.put(Color.WHITE, getPlayer(whiteName, Color.WHITE));
 | 
				
			||||||
		players.put(Color.BLACK, getPlayer(blackName, Color.BLACK));
 | 
							players.put(Color.BLACK, getPlayer(blackName, Color.BLACK));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -61,6 +72,7 @@ public class Game {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	public void onMove(Player player, Move move) {
 | 
						public void onMove(Player player, Move move) {
 | 
				
			||||||
		if (board.getPos(move).getColor() == player.color && board.attemptMove(move)) {
 | 
							if (board.getPos(move).getColor() == player.color && board.attemptMove(move)) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Redraw
 | 
								// Redraw
 | 
				
			||||||
			boardComponent.repaint();
 | 
								boardComponent.repaint();
 | 
				
			||||||
			overlayComponent.displayArrow(move);
 | 
								overlayComponent.displayArrow(move);
 | 
				
			||||||
@@ -85,7 +97,7 @@ public class Game {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public void start() {
 | 
						public void start() {
 | 
				
			||||||
		players.get(Color.WHITE).requestMove();
 | 
							players.get(board.getLog().getActiveColor()).requestMove();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public void reset() {
 | 
						public void reset() {
 | 
				
			||||||
@@ -97,12 +109,15 @@ public class Game {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * Removed all connections between the game and the UI.
 | 
						 * Stops the game by disconnecting its players form the UI.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	public void disconnect() {
 | 
						public void stop() {
 | 
				
			||||||
		players.values().forEach(Player::disconnect);
 | 
							players.values().forEach(Player::disconnect);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Assigns the players their opposite colors.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
	public void swapColors() {
 | 
						public void swapColors() {
 | 
				
			||||||
		players.values().forEach(Player::cancelMove);
 | 
							players.values().forEach(Player::cancelMove);
 | 
				
			||||||
		Player	white	= players.get(Color.WHITE);
 | 
							Player	white	= players.get(Color.WHITE);
 | 
				
			||||||
@@ -114,7 +129,13 @@ public class Game {
 | 
				
			|||||||
		players.get(board.getLog().getActiveColor()).requestMove();
 | 
							players.get(board.getLog().getActiveColor()).requestMove();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * @return The board on which this game's moves are made
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
	public Board getBoard() { return board; }
 | 
						public Board getBoard() { return board; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * @return The players participating in this game
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
	public Map<Color, Player> getPlayers() { return players; }
 | 
						public Map<Color, Player> getPlayers() { return players; }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,6 +11,8 @@ import java.io.FileReader;
 | 
				
			|||||||
import java.io.IOException;
 | 
					import java.io.IOException;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import dev.kske.chess.game.Game;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Project: <strong>Chess</strong><br>
 | 
					 * Project: <strong>Chess</strong><br>
 | 
				
			||||||
 * File: <strong>FENDropTarget.java</strong><br>
 | 
					 * File: <strong>FENDropTarget.java</strong><br>
 | 
				
			||||||
@@ -25,23 +27,26 @@ public class FENDropTarget extends DropTargetAdapter {
 | 
				
			|||||||
		this.mainWindow = mainWindow;
 | 
							this.mainWindow = mainWindow;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@SuppressWarnings("unchecked")
 | 
				
			||||||
	@Override
 | 
						@Override
 | 
				
			||||||
	public void drop(DropTargetDropEvent evt) {
 | 
						public void drop(DropTargetDropEvent evt) {
 | 
				
			||||||
		try {
 | 
							try {
 | 
				
			||||||
			evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
 | 
								evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
 | 
				
			||||||
			@SuppressWarnings("unchecked")
 | 
								((List<File>) evt.getTransferable().getTransferData(DataFlavor.javaFileListFlavor)).forEach(file -> {
 | 
				
			||||||
			List<File> droppedFiles = (List<File>) evt.getTransferable().getTransferData(DataFlavor.javaFileListFlavor);
 | 
									try (BufferedReader br = new BufferedReader(new FileReader(file))) {
 | 
				
			||||||
			try (BufferedReader br = new BufferedReader(new FileReader(droppedFiles.get(0)))) {
 | 
										final GamePane	gamePane	= mainWindow.addGamePane();
 | 
				
			||||||
				mainWindow.getSelectedGamePane().getGame().reset();
 | 
										final String	fen			= br.readLine();
 | 
				
			||||||
				mainWindow.getSelectedGamePane().getGame().getBoard().initFromFEN(br.readLine());
 | 
										new GameConfigurationDialog((whiteName, blackName) -> {
 | 
				
			||||||
				mainWindow.getSelectedGamePane().getBoardPane().getBoardComponent().repaint();
 | 
											final Game game = new Game(gamePane.getBoardPane(), whiteName, blackName, fen);
 | 
				
			||||||
				mainWindow.getSelectedGamePane()
 | 
											gamePane.setGame(game);
 | 
				
			||||||
					.getGame()
 | 
											game.start();
 | 
				
			||||||
					.getPlayers()
 | 
										});
 | 
				
			||||||
					.get(mainWindow.getSelectedGamePane().getGame().getBoard().getLog().getActiveColor())
 | 
										evt.dropComplete(true);
 | 
				
			||||||
					.requestMove();
 | 
									} catch (IOException e) {
 | 
				
			||||||
				evt.dropComplete(true);
 | 
										e.printStackTrace();
 | 
				
			||||||
			}
 | 
										evt.rejectDrop();
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
		} catch (UnsupportedFlavorException | IOException ex) {
 | 
							} catch (UnsupportedFlavorException | IOException ex) {
 | 
				
			||||||
			ex.printStackTrace();
 | 
								ex.printStackTrace();
 | 
				
			||||||
			evt.rejectDrop();
 | 
								evt.rejectDrop();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,20 +21,16 @@ public class GameConfigurationDialog extends JDialog {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	private static final long serialVersionUID = 9080577278529876972L;
 | 
						private static final long serialVersionUID = 9080577278529876972L;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private String	whiteName, blackName;
 | 
					 | 
				
			||||||
	private boolean	startGame;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * Create the dialog.
 | 
						 * Create the dialog.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	public GameConfigurationDialog() {
 | 
						public GameConfigurationDialog(ActionWithConfiguration action) {
 | 
				
			||||||
		setTitle("Game Configuration");
 | 
							setTitle("Game Configuration");
 | 
				
			||||||
		setBounds(100, 100, 281, 142);
 | 
							setBounds(100, 100, 281, 142);
 | 
				
			||||||
		setModal(true);
 | 
							setModal(true);
 | 
				
			||||||
		setLocationRelativeTo(null);
 | 
							setLocationRelativeTo(null);
 | 
				
			||||||
		getContentPane().setLayout(null);
 | 
							getContentPane().setLayout(null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		startGame = false;
 | 
					 | 
				
			||||||
		List<String> options = new ArrayList<>(Arrays.asList("Natural Player", "AI Player"));
 | 
							List<String> options = new ArrayList<>(Arrays.asList("Natural Player", "AI Player"));
 | 
				
			||||||
		EngineUtil.getEngineInfos().forEach(info -> options.add(info.name));
 | 
							EngineUtil.getEngineInfos().forEach(info -> options.add(info.name));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -60,10 +56,8 @@ public class GameConfigurationDialog extends JDialog {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		JButton btnStart = new JButton("Start");
 | 
							JButton btnStart = new JButton("Start");
 | 
				
			||||||
		btnStart.addActionListener((evt) -> {
 | 
							btnStart.addActionListener((evt) -> {
 | 
				
			||||||
			startGame	= true;
 | 
					 | 
				
			||||||
			whiteName	= options.get(cbWhite.getSelectedIndex());
 | 
					 | 
				
			||||||
			blackName	= options.get(cbBlack.getSelectedIndex());
 | 
					 | 
				
			||||||
			dispose();
 | 
								dispose();
 | 
				
			||||||
 | 
								action.onConfigurationSet(options.get(cbWhite.getSelectedIndex()), options.get(cbBlack.getSelectedIndex()));
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
		btnStart.setBounds(20, 73, 89, 23);
 | 
							btnStart.setBounds(20, 73, 89, 23);
 | 
				
			||||||
		getContentPane().add(btnStart);
 | 
							getContentPane().add(btnStart);
 | 
				
			||||||
@@ -72,11 +66,12 @@ public class GameConfigurationDialog extends JDialog {
 | 
				
			|||||||
		btnCancel.addActionListener((evt) -> dispose());
 | 
							btnCancel.addActionListener((evt) -> dispose());
 | 
				
			||||||
		btnCancel.setBounds(157, 73, 89, 23);
 | 
							btnCancel.setBounds(157, 73, 89, 23);
 | 
				
			||||||
		getContentPane().add(btnCancel);
 | 
							getContentPane().add(btnCancel);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							setVisible(true);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public String getWhiteName() { return whiteName; }
 | 
						public static interface ActionWithConfiguration {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public String getBlackName() { return blackName; }
 | 
							void onConfigurationSet(String whiteName, String blackName);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	public boolean isStartGame() { return startGame; }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -89,6 +89,7 @@ public class GamePane extends JComponent {
 | 
				
			|||||||
			letterPanel.add(letterLabel);
 | 
								letterPanel.add(letterLabel);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// TODO: LogPanel
 | 
				
			||||||
		// LogPanel logPanel = new LogPanel(game.getBoard().getLog());
 | 
							// LogPanel logPanel = new LogPanel(game.getBoard().getLog());
 | 
				
			||||||
		// GridBagConstraints gbc_logPanel = new GridBagConstraints();
 | 
							// GridBagConstraints gbc_logPanel = new GridBagConstraints();
 | 
				
			||||||
		//
 | 
							//
 | 
				
			||||||
@@ -112,7 +113,7 @@ public class GamePane extends JComponent {
 | 
				
			|||||||
	 * @param game The {@link Game} to assign to this game pane.
 | 
						 * @param game The {@link Game} to assign to this game pane.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	public void setGame(Game game) {
 | 
						public void setGame(Game game) {
 | 
				
			||||||
		if (this.game != null) this.game.disconnect();
 | 
							if (this.game != null) this.game.stop();
 | 
				
			||||||
		this.game = game;
 | 
							this.game = game;
 | 
				
			||||||
		btnSwapColors.setEnabled(game.getPlayers().get(Color.WHITE) instanceof NaturalPlayer
 | 
							btnSwapColors.setEnabled(game.getPlayers().get(Color.WHITE) instanceof NaturalPlayer
 | 
				
			||||||
				^ game.getPlayers().get(Color.BLACK) instanceof NaturalPlayer);
 | 
									^ game.getPlayers().get(Color.BLACK) instanceof NaturalPlayer);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,10 +13,11 @@ import javax.swing.JTabbedPane;
 | 
				
			|||||||
 * Created: <strong>01.07.2019</strong><br>
 | 
					 * Created: <strong>01.07.2019</strong><br>
 | 
				
			||||||
 * Author: <strong>Kai S. K. Engelbart</strong>
 | 
					 * Author: <strong>Kai S. K. Engelbart</strong>
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
public class MainWindow {
 | 
					public class MainWindow extends JFrame {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private JFrame		frame;
 | 
						private static final long serialVersionUID = -3100939302567978977L;
 | 
				
			||||||
	private JTabbedPane	tabbedPane;
 | 
					
 | 
				
			||||||
 | 
						private JTabbedPane tabbedPane;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * Launch the application.
 | 
						 * Launch the application.
 | 
				
			||||||
@@ -35,6 +36,7 @@ public class MainWindow {
 | 
				
			|||||||
	 * Create the application.
 | 
						 * Create the application.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	public MainWindow() {
 | 
						public MainWindow() {
 | 
				
			||||||
 | 
							super("Chess by Kai S. K. Engelbart");
 | 
				
			||||||
		initialize();
 | 
							initialize();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -43,24 +45,22 @@ public class MainWindow {
 | 
				
			|||||||
	 */
 | 
						 */
 | 
				
			||||||
	private void initialize() {
 | 
						private void initialize() {
 | 
				
			||||||
		// Configure frame
 | 
							// Configure frame
 | 
				
			||||||
		frame = new JFrame("Chess by Kai S. K. Engelbart");
 | 
							setResizable(false);
 | 
				
			||||||
		frame.setResizable(false);
 | 
							setBounds(100, 100, 494, 565);
 | 
				
			||||||
		frame.setBounds(100, 100, 494, 565);
 | 
							setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 | 
				
			||||||
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 | 
							setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("/pieces/queen_white.png")));
 | 
				
			||||||
		frame.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("/pieces/queen_white.png")));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Add frame content
 | 
							// Add frame content
 | 
				
			||||||
		tabbedPane = new JTabbedPane();
 | 
							tabbedPane = new JTabbedPane();
 | 
				
			||||||
		addGamePane(); // Game is initialized inside MenuBar
 | 
							getContentPane().add(tabbedPane);
 | 
				
			||||||
		frame.getContentPane().add(tabbedPane);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		frame.setJMenuBar(new MenuBar(this));
 | 
							setJMenuBar(new MenuBar(this));
 | 
				
			||||||
		new DropTarget(frame, new FENDropTarget(this));
 | 
							new DropTarget(this, new FENDropTarget(this));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Update position and dimensions
 | 
							// Update position and dimensions
 | 
				
			||||||
		frame.pack();
 | 
							pack();
 | 
				
			||||||
		frame.setLocationRelativeTo(null);
 | 
							setLocationRelativeTo(null);
 | 
				
			||||||
		frame.setVisible(true);
 | 
							setVisible(true);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
@@ -79,4 +79,13 @@ public class MainWindow {
 | 
				
			|||||||
		tabbedPane.setSelectedIndex(tabbedPane.getComponentCount() - 1);
 | 
							tabbedPane.setSelectedIndex(tabbedPane.getComponentCount() - 1);
 | 
				
			||||||
		return gamePane;
 | 
							return gamePane;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Removes a {@link GamePane} form the tabbed pane.
 | 
				
			||||||
 | 
						 * 
 | 
				
			||||||
 | 
						 * @param index The index of the {@link GamePane} to remove
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public void removeGamePane(int index) {
 | 
				
			||||||
 | 
							tabbedPane.remove(index);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,22 +34,16 @@ public class MenuBar extends JMenuBar {
 | 
				
			|||||||
		JMenu		gameMenu		= new JMenu("Game");
 | 
							JMenu		gameMenu		= new JMenu("Game");
 | 
				
			||||||
		JMenuItem	newGameMenuItem	= new JMenuItem("New Game");
 | 
							JMenuItem	newGameMenuItem	= new JMenuItem("New Game");
 | 
				
			||||||
		newGameMenuItem.addActionListener((evt) -> {
 | 
							newGameMenuItem.addActionListener((evt) -> {
 | 
				
			||||||
			GameConfigurationDialog dialog = new GameConfigurationDialog();
 | 
								new GameConfigurationDialog((whiteName, blackName) -> {
 | 
				
			||||||
			dialog.setVisible(true);
 | 
									GamePane	gamePane	= mainWindow.addGamePane();
 | 
				
			||||||
			if (dialog.isStartGame()) {
 | 
									Game		game		= new Game(gamePane.getBoardPane(), whiteName, blackName);
 | 
				
			||||||
				GamePane gamePane = mainWindow.addGamePane();
 | 
					 | 
				
			||||||
				Game game = new Game(gamePane.getBoardPane(), dialog.getWhiteName(), dialog.getBlackName());
 | 
					 | 
				
			||||||
				gamePane.setGame(game);
 | 
									gamePane.setGame(game);
 | 
				
			||||||
				game.start();
 | 
									game.start();
 | 
				
			||||||
			}
 | 
								});
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
		gameMenu.add(newGameMenuItem);
 | 
							gameMenu.add(newGameMenuItem);
 | 
				
			||||||
 | 
					 | 
				
			||||||
		add(gameMenu);
 | 
							add(gameMenu);
 | 
				
			||||||
 | 
							newGameMenuItem.doClick();
 | 
				
			||||||
		// TODO: Game initialization
 | 
					 | 
				
			||||||
		// Start a game
 | 
					 | 
				
			||||||
		startGame(new Game(mainWindow.getSelectedGamePane().getBoardPane(), "Natural Player", "Natural Player"));
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private void initEngineMenu() {
 | 
						private void initEngineMenu() {
 | 
				
			||||||
@@ -75,36 +69,25 @@ public class MenuBar extends JMenuBar {
 | 
				
			|||||||
		JMenu toolsMenu = new JMenu("Tools");
 | 
							JMenu toolsMenu = new JMenu("Tools");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		JMenuItem exportFENMenuItem = new JMenuItem("Export board to FEN");
 | 
							JMenuItem exportFENMenuItem = new JMenuItem("Export board to FEN");
 | 
				
			||||||
		exportFENMenuItem.addActionListener((evt) -> Toolkit.getDefaultToolkit()
 | 
							exportFENMenuItem.addActionListener((evt) -> {
 | 
				
			||||||
			.getSystemClipboard()
 | 
								final String fen = mainWindow.getSelectedGamePane().getGame().getBoard().toFEN();
 | 
				
			||||||
			.setContents(new StringSelection(mainWindow.getSelectedGamePane().getGame().getBoard().toFEN()), null));
 | 
								Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(fen), null);
 | 
				
			||||||
 | 
								JOptionPane.showMessageDialog(mainWindow, String.format("FEN-string copied to clipboard!%n%s", fen));
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
		toolsMenu.add(exportFENMenuItem);
 | 
							toolsMenu.add(exportFENMenuItem);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// TODO: Synchronize with game
 | 
					 | 
				
			||||||
		JMenuItem loadFromFENMenuItem = new JMenuItem("Load board from FEN");
 | 
							JMenuItem loadFromFENMenuItem = new JMenuItem("Load board from FEN");
 | 
				
			||||||
		loadFromFENMenuItem.addActionListener((evt) -> {
 | 
							loadFromFENMenuItem.addActionListener((evt) -> {
 | 
				
			||||||
			mainWindow.getSelectedGamePane().getGame().reset();
 | 
								final GamePane	gamePane	= mainWindow.addGamePane();
 | 
				
			||||||
			mainWindow.getSelectedGamePane()
 | 
								final String	fen			= JOptionPane.showInputDialog("Enter a FEN string: ");
 | 
				
			||||||
				.getGame()
 | 
								new GameConfigurationDialog((whiteName, blackName) -> {
 | 
				
			||||||
				.getBoard()
 | 
									final Game game = new Game(gamePane.getBoardPane(), whiteName, blackName, fen);
 | 
				
			||||||
				.initFromFEN(JOptionPane.showInputDialog("Enter a FEN string: "));
 | 
									gamePane.setGame(game);
 | 
				
			||||||
			mainWindow.getSelectedGamePane().getBoardPane().getBoardComponent().repaint();
 | 
									game.start();
 | 
				
			||||||
			mainWindow.getSelectedGamePane()
 | 
								});
 | 
				
			||||||
				.getGame()
 | 
					 | 
				
			||||||
				.getPlayers()
 | 
					 | 
				
			||||||
				.get(mainWindow.getSelectedGamePane().getGame().getBoard().getLog().getActiveColor())
 | 
					 | 
				
			||||||
				.requestMove();
 | 
					 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
		toolsMenu.add(loadFromFENMenuItem);
 | 
							toolsMenu.add(loadFromFENMenuItem);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		add(toolsMenu);
 | 
							add(toolsMenu);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					 | 
				
			||||||
	private void startGame(Game game) {
 | 
					 | 
				
			||||||
		mainWindow.getSelectedGamePane().setGame(game);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Update board and board component
 | 
					 | 
				
			||||||
		game.reset();
 | 
					 | 
				
			||||||
		game.start();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user