/* * Return true if the side to move is in check */ public static Boolean inCheck(Position position) { int kingSquare = position.getKingSquare(position.whiteMove); if (kingSquare < 0) { return false; } return squareAttacked(position, kingSquare); }
/* * Return true if a square is attacked by the opposite side */ public static Boolean squareAttacked(Position position, int square) { int file = Position.getFile(square); int rank = Position.getRank(square); Boolean isWhiteMove = position.whiteMove; PieceType opppositeQueen = isWhiteMove ? PieceType.q : PieceType.Q; PieceType opppositeRook = isWhiteMove ? PieceType.r : PieceType.R; PieceType opppositeBishop = isWhiteMove ? PieceType.b : PieceType.B; PieceType opppositeKnight = isWhiteMove ? PieceType.n : PieceType.N; PieceType piece; if (rank > 0) { piece = checkDirection(position, square, rank, -8); if ((piece == opppositeQueen) || (piece == opppositeRook)) return true; piece = checkDirection(position, square, Math.Min(file, rank), -9); if ((piece == opppositeQueen) || (piece == opppositeBishop)) return true; piece = checkDirection(position, square, Math.Min(7 - file, rank), -7); if ((piece == opppositeQueen) || (piece == opppositeBishop)) return true; if (file > 1) { piece = checkDirection(position, square, 1, -10); if (piece == opppositeKnight) return true; } if (file > 0 && rank > 1) { piece = checkDirection(position, square, 1, -17); if (piece == opppositeKnight) return true; } if (file < 7 && rank > 1) { piece = checkDirection(position, square, 1, -15); if (piece == opppositeKnight) return true; } if (file < 6) { piece = checkDirection(position, square, 1, -6); if (piece == opppositeKnight) return true; } if (!isWhiteMove) { if (file < 7 && rank > 1) { piece = checkDirection(position, square, 1, -7); if (piece == PieceType.P) return true; } if (file > 0 && rank > 1) { piece = checkDirection(position, square, 1, -9); if (piece == PieceType.P) return true; } } } if (rank < 7) { piece = checkDirection(position, square, 7 - rank, 8); if ((piece == opppositeQueen) || (piece == opppositeRook)) return true; piece = checkDirection(position, square, Math.Min(7 - file, 7 - rank), 9); if ((piece == opppositeQueen) || (piece == opppositeBishop)) return true; piece = checkDirection(position, square, Math.Min(file, 7 - rank), 7); if ((piece == opppositeQueen) || (piece == opppositeBishop)) return true; if (rank < 6) { piece = checkDirection(position, square, 1, 10); if (piece == opppositeKnight) return true; } if (file < 7 && rank < 6) { piece = checkDirection(position, square, 1, 17); if (piece == opppositeKnight) return true; } if (file > 0 && rank < 6) { piece = checkDirection(position, square, 1, 15); if (piece == opppositeKnight) return true; } if (file > 1) { piece = checkDirection(position, square, 1, 6); if (piece == opppositeKnight) return true; } if (isWhiteMove) { if (file < 7 && rank < 6) { piece = checkDirection(position, square, 1, 9); if (piece == PieceType.p) return true; } if (file > 0 && rank < 6) { piece = checkDirection(position, square, 1, 7); if (piece == PieceType.p) return true; } } } piece = checkDirection(position, square, 7 - file, 1); if ((piece == opppositeQueen) || (piece == opppositeRook)) return true; piece = checkDirection(position, square, file, -1); if ((piece == opppositeQueen) || (piece == opppositeRook)) return true; int opppositeKingSquare = position.getKingSquare(!isWhiteMove); if (opppositeKingSquare >= 0) { int oFile = Position.getFile(opppositeKingSquare); int oRank = Position.getRank(opppositeKingSquare); if ((Math.Abs(file - oFile) <= 1) && (Math.Abs(rank - oRank) <= 1)) { return true; } } return false; }