Esempio n. 1
0
        /// <summary>
        /// The move piece to fen position.
        /// </summary>
        /// <param name="charToken">
        /// The char token.
        /// </param>
        /// <param name="intFile">
        /// The int file.
        /// </param>
        /// <param name="intRank">
        /// The int rank.
        /// </param>
        /// <param name="blnAnyLocation">
        /// The bln any location.
        /// </param>
        /// <param name="blnAllowPromotion">
        /// The bln allow promotion.
        /// </param>
        private static void MovePieceToFenPosition(
            ref char charToken, int intFile, int intRank, bool blnAnyLocation, bool blnAllowPromotion)
        {
            Piece.PieceNames piecename = Piece.PieceNames.King;
            Player           player    = charToken.ToString() == charToken.ToString().ToUpper() ? Game.PlayerWhite : Game.PlayerBlack;

            switch (charToken.ToString().ToUpper())
            {
            case "K":
                piecename = Piece.PieceNames.King;
                break;

            case "Q":
                piecename = Piece.PieceNames.Queen;
                break;

            case "R":
                piecename = Piece.PieceNames.Rook;
                break;

            case "B":
                piecename = Piece.PieceNames.Bishop;
                break;

            case "N":
                piecename = Piece.PieceNames.Knight;
                break;

            case "P":
                piecename = Piece.PieceNames.Pawn;
                break;
            }

            // Try to find the required piece in from the available pool of captured
            // pieces that haven't been placed on the board yet.
            Piece pieceToUse = null;

            foreach (Piece pieceCaptured in player.OpposingPlayer.CapturedEnemyPieces)
            {
                if ((pieceCaptured.Name == piecename || (blnAllowPromotion && pieceCaptured.Name == Piece.PieceNames.Pawn)) &&
                    (pieceCaptured.StartLocation == Board.GetSquare(intFile, intRank) || blnAnyLocation))
                {
                    pieceToUse = pieceCaptured;
                    break;
                }
            }

            if (pieceToUse != null)
            {
                Square square = Board.GetSquare(intFile, intRank);
                pieceToUse.Uncapture(0);
                square.Piece         = pieceToUse;
                pieceToUse.Square    = square;
                pieceToUse.NoOfMoves = blnAnyLocation ? 1 : 0;
                if (pieceToUse.Name != piecename)
                {
                    pieceToUse.Promote(piecename);
                }

                // Mark the token in the original FEN string with a * to indicate that the piece has been processed
                charToken = '.';
            }
        }