package dev.kske.chess.board; import java.util.ArrayList; import java.util.List; /** * Project: Chess
* File: King.java
* Created: 01.07.2019
* Author: Kai S. K. Engelbart */ public class King extends Piece { public King(Color color, Board board) { super(color, board); } @Override public boolean isValidMove(Move move) { // Castling if (move.xDist == 2 && move.yDist == 0) { if (canCastleKingside()) { move.type = Move.Type.CASTLING; return true; } if (canCastleQueenside()) { move.type = Move.Type.CASTLING; return true; } } return move.xDist <= 1 && move.yDist <= 1 && checkDestination(move); } public boolean canCastleKingside() { if (getMoveCounter() == 0) { int y = getColor() == Color.WHITE ? 7 : 0; Position rookPos = new Position(7, y); Piece rook = board.get(rookPos); return rook != null && rook.getType() == Type.ROOK && rook.getMoveCounter() == 0 && isFreePath(new Move(new Position(4, y), new Position(6, y))); } else return false; } public boolean canCastleQueenside() { if (getMoveCounter() == 0) { int y = getColor() == Color.WHITE ? 7 : 0; Position rookPos = new Position(0, y); Piece rook = board.get(rookPos); return rook != null && rook.getType() == Type.ROOK && rook.getMoveCounter() == 0 && isFreePath(new Move(new Position(4, y), new Position(1, y))); } else return false; } @Override protected List getPseudolegalMoves(Position pos) { List moves = new ArrayList<>(); for (int i = Math.max(0, pos.x - 1); i < Math.min(8, pos.x + 2); i++) for (int j = Math.max(0, pos.y - 1); j < Math.min(8, pos.y + 2); j++) if (i != pos.x || j != pos.y) { Move move = new Move(pos, new Position(i, j)); if (board.getDest(move) == null || board.getDest(move).getColor() != getColor()) moves.add(move); } // Castling // TODO: Condition: cannot castle out of, through or into check if (canCastleKingside()) moves.add(new Move(pos, new Position(6, pos.y), Move.Type.CASTLING)); if (canCastleQueenside()) moves.add(new Move(pos, new Position(2, pos.y), Move.Type.CASTLING)); return moves; } @Override public Type getType() { return Type.KING; } }