Beispiel #1
0
        /// <summary>
        /// Removes en passant piece from the specified bitboard.
        /// </summary>
        /// <param name="bitboard">The bitboard.</param>
        /// <param name="enemyColor">The enemy color.</param>
        /// <param name="fieldLSB">The bitboard with set field.</param>
        private void RemoveEnPassantPiece(Bitboard bitboard, Color enemyColor, ulong fieldLSB)
        {
            var enPassantPiece = Color == Color.White ? fieldLSB >> 8 : fieldLSB << 8;

            bitboard.Pieces[FastArray.GetPieceIndex(enemyColor, PieceType.Pawn)] &= ~enPassantPiece;
            bitboard.Occupancy[(int)enemyColor] ^= enPassantPiece;

            IncrementalMaterial.RemovePiece(bitboard, enemyColor, PieceType.Pawn);
            IncrementalPosition.RemovePiece(bitboard, enemyColor, PieceType.Pawn, enPassantPiece);
            IncrementalZobrist.AddOrRemovePiece(enemyColor, PieceType.Pawn, enPassantPiece, bitboard);
        }
Beispiel #2
0
        /// <summary>
        /// Helper method for derived classes, calculates move with the specified parameters.
        /// </summary>
        /// <param name="bitboard">The bitboard.</param>
        /// <param name="pieceFrom">The source piece type.</param>
        /// <param name="from">The piece source position.</param>
        /// <param name="pieceTo">The destination piece type.</param>
        /// <param name="to">The piece destination position.</param>
        protected void CalculatePieceMove(Bitboard bitboard, PieceType pieceFrom, ulong from, PieceType pieceTo, ulong to)
        {
            bitboard.Pieces[FastArray.GetPieceIndex(Color, pieceFrom)] &= ~from;
            bitboard.Pieces[FastArray.GetPieceIndex(Color, pieceTo)]   |= to;
            bitboard.Occupancy[(int)Color] ^= from | to;

            IncrementalPosition.RemovePiece(bitboard, Color, pieceFrom, from);
            IncrementalPosition.AddPiece(bitboard, Color, pieceTo, to);

            IncrementalZobrist.AddOrRemovePiece(Color, pieceFrom, from, bitboard);
            IncrementalZobrist.AddOrRemovePiece(Color, pieceTo, to, bitboard);

            if (pieceFrom == PieceType.Pawn)
            {
                bitboard.ReversibleMoves = 0;
            }
        }
Beispiel #3
0
        /// <summary>
        /// Removes killed piece from the specified bitboard.
        /// </summary>
        /// <param name="bitboard">The bitboard.</param>
        /// <param name="enemyColor">The enemy color.</param>
        /// <param name="fieldLSB">The bitboard with set field.</param>
        protected void CalculateKill(Bitboard bitboard, Color enemyColor, ulong fieldLSB)
        {
            for (var piece = 0; piece < 6; piece++)
            {
                var index = FastArray.GetPieceIndex(enemyColor, (PieceType)piece);
                if ((bitboard.Pieces[index] & fieldLSB) != 0)
                {
                    bitboard.Pieces[index] &= ~fieldLSB;
                    bitboard.Occupancy[(int)enemyColor] &= ~fieldLSB;

                    IncrementalMaterial.RemovePiece(bitboard, enemyColor, (PieceType)piece);
                    IncrementalPosition.RemovePiece(bitboard, enemyColor, (PieceType)piece, fieldLSB);
                    IncrementalZobrist.AddOrRemovePiece(enemyColor, (PieceType)piece, fieldLSB, bitboard);

                    bitboard.ReversibleMoves = 0;
                    break;
                }
            }
        }