package chess.ai; import java.util.List; import chess.controller.Command; import chess.controller.CommandExecutor; import chess.controller.commands.GetPieceAtCommand; import chess.controller.commands.GetPlayerMovesCommand; import chess.controller.commands.GetAllowedCastlingsCommand; import chess.controller.commands.GetAllowedCastlingsCommand.CastlingResult; import chess.controller.event.GameAdaptator; import chess.model.Color; import chess.model.Coordinate; import chess.model.Move; import chess.model.Piece; public abstract class AI extends GameAdaptator{ protected final CommandExecutor commandExecutor; protected final Color color; public AI(CommandExecutor commandExecutor, Color color) { this.commandExecutor = commandExecutor; this.color = color; } protected abstract void play(); protected abstract void promote(Coordinate pawnCoords); @Override public void onPlayerTurn(Color color, boolean undone) { if (this.color != color || undone) return; play(); } @Override public void onPromotePawn(Coordinate pieceCoords) { Piece pawn = pieceAt(pieceCoords); if (pawn.getColor() != this.color) return; promote(pieceCoords); } protected Piece pieceAt(Coordinate coordinate) { GetPieceAtCommand command = new GetPieceAtCommand(coordinate); sendCommand(command); return command.getPiece(); } protected List getAllowedMoves() { GetPlayerMovesCommand cmd = new GetPlayerMovesCommand(); sendCommand(cmd); return cmd.getMoves(); } protected CastlingResult getAllowedCastlings() { GetAllowedCastlingsCommand cmd2 = new GetAllowedCastlingsCommand(); sendCommand(cmd2); return cmd2.getCastlingResult(); } protected void sendCommand(Command command) { this.commandExecutor.executeCommand(command); } }