Ejemplo n.º 1
0
        public bool ValidatePosition()
        {
            Board      board = m_editBoard;
            BoardState state = board.State;

            //----Validating piece count----
            byte K = 0; //white kings
            byte k = 0; //black kings
            byte Q = 0; //white queens
            byte q = 0; //black queens
            byte R = 0; //white rooks
            byte r = 0; //black rooks
            byte B = 0; //white bishops
            byte b = 0; //black bishops
            byte N = 0; //white knights
            byte n = 0; //black knights
            byte P = 0; //white pawns
            byte p = 0; //black pawns

            foreach (Square square in board)
            {
                if (board[square] == Piece.WhiteKing)
                {
                    ++K;
                }

                if (board[square] == Piece.BlackKing)
                {
                    ++k;
                }

                if (board[square] == Piece.WhiteQueen)
                {
                    ++Q;
                }

                if (board[square] == Piece.BlackQueen)
                {
                    ++q;
                }

                if (board[square] == Piece.WhiteRook)
                {
                    ++R;
                }

                if (board[square] == Piece.BlackRook)
                {
                    ++r;
                }

                if (board[square] == Piece.WhiteBishop)
                {
                    ++B;
                }

                if (board[square] == Piece.BlackBishop)
                {
                    ++b;
                }

                if (board[square] == Piece.WhiteKnight)
                {
                    ++N;
                }

                if (board[square] == Piece.BlackKnight)
                {
                    ++n;
                }

                if (board[square] == Piece.WhitePawn)
                {
                    ++P;
                }

                if (board[square] == Piece.BlackPawn)
                {
                    ++p;
                }
            }

            if ((K + Q + R + B + N + P) > 16 || (k + q + r + b + n + p) > 16) //total
            {
                return(false);
            }

            if (K != 1 || k != 1) //kings
            {
                return(false);
            }

            if (P > 8 || p > 8) //pawns
            {
                return(false);
            }

            if ((Q + R + B + N - 7) > (8 - P) || (q + r + b + n - 7) > (8 - p)) //ekstra due to promotion
            {
                return(false);
            }


            //----Validate color to play----
            if (!(state.ColorToPlay == PieceColor.White || state.ColorToPlay == PieceColor.Black))
            {
                return(false);
            }


            //----Validate pawn locations----
            for (Square square = Square.A1; square <= Square.H1; ++square)
            {
                Piece piece = board[square];
                if (piece == Piece.WhitePawn || piece == Piece.BlackPawn)
                {
                    return(false);
                }
            }

            for (Square square = Square.A8; square <= Square.H8; ++square)
            {
                Piece piece = board[square];
                if (piece == Piece.WhitePawn || piece == Piece.BlackPawn)
                {
                    return(false);
                }
            }


            //----Validating if a king can be captured----
            if (state.ColorToPlay == PieceColor.White)
            {
                if (board.IsCheck(PieceColor.Black))
                {
                    return(false);
                }
            }

            if (state.ColorToPlay == PieceColor.Black)
            {
                if (board.IsCheck(PieceColor.White))
                {
                    return(false);
                }
            }


            //----Validating En Passant----
            if (state.EnPassantTarget != Square.None)
            {
                if (!(Board.Rank(state.EnPassantTarget) == 3 || Board.Rank(state.EnPassantTarget) == 4))
                {
                    return(false);
                }

                if (state.ColorToPlay == PieceColor.White && board[state.EnPassantTarget] != Piece.BlackPawn)
                {
                    return(false);
                }

                if (state.ColorToPlay == PieceColor.Black && board[state.EnPassantTarget] != Piece.WhitePawn)
                {
                    return(false);
                }
            }


            //----Validating castling----
            if (state.WhiteCanCastleShort)
            {
                if (board[Square.E1] != Piece.WhiteKing || board[Square.H1] != Piece.WhiteRook)
                {
                    return(false);
                }
            }

            if (state.WhiteCanCastleLong)
            {
                if (board[Square.E1] != Piece.WhiteKing || board[Square.A1] != Piece.WhiteRook)
                {
                    return(false);
                }
            }

            if (state.BlackCanCastleShort)
            {
                if (board[Square.E8] != Piece.BlackKing || board[Square.H8] != Piece.BlackRook)
                {
                    return(false);
                }
            }

            if (state.BlackCanCastleLong)
            {
                if (board[Square.E8] != Piece.BlackKing || board[Square.A8] != Piece.BlackRook)
                {
                    return(false);
                }
            }

            return(true);
        }