package dev.kske.chess.game; import java.util.HashMap; import java.util.Map; import javax.swing.JOptionPane; import dev.kske.chess.board.Board; import dev.kske.chess.board.GameState; import dev.kske.chess.board.Move; import dev.kske.chess.board.Piece.Color; import dev.kske.chess.game.ai.AIPlayer; import dev.kske.chess.ui.BoardComponent; import dev.kske.chess.ui.BoardPane; import dev.kske.chess.ui.EngineUtil; import dev.kske.chess.ui.EngineUtil.EngineInfo; import dev.kske.chess.ui.OverlayComponent; /** * Project: Chess
* File: Game.java
* Created: 06.07.2019
* Author: Kai S. K. Engelbart */ public class Game { private Map players; private Board board; private OverlayComponent overlayComponent; private BoardComponent boardComponent; public Game(BoardPane boardPane, String whiteName, String blackName) { players = new HashMap<>(); board = new Board(); overlayComponent = boardPane.getOverlayComponent(); boardComponent = boardPane.getBoardComponent(); boardComponent.setBoard(board); players.put(Color.WHITE, getPlayer(whiteName, Color.WHITE)); players.put(Color.BLACK, getPlayer(blackName, Color.BLACK)); // Initialize the game variable in each player players.values().forEach(player -> player.setGame(this)); } private Player getPlayer(String name, Color color) { switch (name) { case "Natural Player": return new NaturalPlayer(color, overlayComponent); case "AI Player": return new AIPlayer(color, 4, -10); default: for (EngineInfo info : EngineUtil.getEngineInfos()) if (info.name.equals(name)) return new UCIPlayer(color, info.path); System.err.println("Invalid player name: " + name); return null; } } public void onMove(Player player, Move move) { if (board.getPos(move).getColor() == player.color && board.attemptMove(move)) { // Redraw boardComponent.repaint(); overlayComponent.displayArrow(move); System.out.printf("%s: %s%n", player.color, move); System.out.println("FEN: " + board.toFEN()); GameState eventType = board.getGameEventType(board.getDest(move).getColor().opposite()); switch (eventType) { case CHECKMATE: case STALEMATE: String result = String.format("%s in %s!%n", player.color.opposite(), eventType); System.out.print(result); JOptionPane.showMessageDialog(boardComponent, result); break; case CHECK: System.out.printf("%s in check!%n", player.color.opposite()); default: players.get(board.getActiveColor()).requestMove(); } } else player.requestMove(); } public void start() { players.get(Color.WHITE).requestMove(); } public void reset() { players.values().forEach(Player::cancelMove); board.initializeDefaultPositions(); boardComponent.repaint(); overlayComponent.clearDots(); overlayComponent.clearArrow(); } /** * Removed all connections between the game and the UI. */ public void disconnect() { players.values().forEach(Player::disconnect); } public void swapColors() { players.values().forEach(Player::cancelMove); Player white = players.get(Color.WHITE); Player black = players.get(Color.BLACK); white.setColor(Color.BLACK); black.setColor(Color.WHITE); players.put(Color.WHITE, black); players.put(Color.BLACK, white); players.get(board.getActiveColor()).requestMove(); } public Board getBoard() { return board; } public Map getPlayers() { return players; } }