Пример #1
0
 /*
  * 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);
 }
Пример #2
0
        /*
         * 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;
        }