Esempio n. 1
0
        public EncodedPositionBoard(Span <BitVector64> spanOurPawnsKnightsBishipsRooksQueensKing,
                                    Span <BitVector64> spanTheirPawnsKnightsBishipsRooksQueensKing,
                                    bool repetitions)
        {
            // Suppress definite assigment error
            // TODO: In .NET 5 use the new API:
            //   Unsafe.SkipInit<T>(out T value);
            fixed(void *pThis = &this)
            {
            }

            fixed(void *targetOurPiecesPtr = &OurPawns)
            {
                Span <BitVector64> targetOurPieces = new Span <BitVector64>(targetOurPiecesPtr, 6);

                spanOurPawnsKnightsBishipsRooksQueensKing.CopyTo(targetOurPieces);
            }

            fixed(void *targetTheirPiecesPtr = &TheirPawns)
            {
                Span <BitVector64> targetTheirPieces = new Span <BitVector64>(targetTheirPiecesPtr, 6);

                spanTheirPawnsKnightsBishipsRooksQueensKing.CopyTo(targetTheirPieces);
            }

            Repetitions = repetitions ? new EncodedPositionBoardPlane(ALL_ONES_LONG) : default;
        }
Esempio n. 2
0
        private EncodedPositionBoard(EncodedPositionBoard other, bool mirror, bool reverse)
        {
            if (reverse & mirror)
            {
                OurPawns   = other.OurPawns.Reversed.Mirrored;
                OurKnights = other.OurKnights.Reversed.Mirrored;
                OurBishops = other.OurBishops.Reversed.Mirrored;
                OurRooks   = other.OurRooks.Reversed.Mirrored;
                OurQueens  = other.OurQueens.Reversed.Mirrored;
                OurKing    = other.OurKing.Reversed.Mirrored;

                TheirPawns   = other.TheirPawns.Reversed.Mirrored;
                TheirKnights = other.TheirKnights.Reversed.Mirrored;
                TheirBishops = other.TheirBishops.Reversed.Mirrored;
                TheirRooks   = other.TheirRooks.Reversed.Mirrored;
                TheirQueens  = other.TheirQueens.Reversed.Mirrored;
                TheirKing    = other.TheirKing.Reversed.Mirrored;
            }
            else
            if (reverse)
            {
                OurPawns   = other.OurPawns.Reversed;
                OurKnights = other.OurKnights.Reversed;
                OurBishops = other.OurBishops.Reversed;
                OurRooks   = other.OurRooks.Reversed;
                OurQueens  = other.OurQueens.Reversed;
                OurKing    = other.OurKing.Reversed;

                TheirPawns   = other.TheirPawns.Reversed;
                TheirKnights = other.TheirKnights.Reversed;
                TheirBishops = other.TheirBishops.Reversed;
                TheirRooks   = other.TheirRooks.Reversed;
                TheirQueens  = other.TheirQueens.Reversed;
                TheirKing    = other.TheirKing.Reversed;
            }
            else
            {
                OurPawns   = mirror ? other.OurPawns.Mirrored : other.OurPawns;
                OurKnights = mirror ? other.OurKnights.Mirrored : other.OurKnights;
                OurBishops = mirror ? other.OurBishops.Mirrored : other.OurBishops;
                OurRooks   = mirror ? other.OurRooks.Mirrored : other.OurRooks;
                OurQueens  = mirror ? other.OurQueens.Mirrored : other.OurQueens;
                OurKing    = mirror ? other.OurKing.Mirrored : other.OurKing;

                TheirPawns   = mirror ? other.TheirPawns.Mirrored : other.TheirPawns;
                TheirKnights = mirror ? other.TheirKnights.Mirrored : other.TheirKnights;
                TheirBishops = mirror ? other.TheirBishops.Mirrored : other.TheirBishops;
                TheirRooks   = mirror ? other.TheirRooks.Mirrored : other.TheirRooks;
                TheirQueens  = mirror ? other.TheirQueens.Mirrored : other.TheirQueens;
                TheirKing    = mirror ? other.TheirKing.Mirrored : other.TheirKing;
            }
            Repetitions = other.Repetitions;
        }
Esempio n. 3
0
        /// <summary>
        /// Determines if en passant opportunity
        /// exists between two specified consecutive history boards.
        /// </summary>
        /// <param name="currentBoard"></param>
        /// <param name="priorBoard"></param>
        /// <returns></returns>
        public static PositionMiscInfo.EnPassantFileIndexEnum EnPassantOpportunityBetweenBoards(EncodedPositionBoard currentBoard,
                                                                                                EncodedPositionBoard priorBoard)
        {
            EncodedPositionBoardPlane pawnsPrior   = priorBoard.OurPawns;
            EncodedPositionBoardPlane pawnsCurrent = currentBoard.TheirPawns;

            // We look for the boards differing only because a pawn moved from rank 7 to rank 5 (from our perspective)
            for (int i = 8; i < 16; i++)
            {
                if (
                    priorBoard.TheirPawns.BitIsSet(64 - i) &&
                    !priorBoard.TheirPawns.BitIsSet(64 - i - 16) &&
                    !currentBoard.TheirPawns.BitIsSet(64 - i) &&
                    currentBoard.TheirPawns.BitIsSet(64 - i - 16)
                    )
                {
                    return((PositionMiscInfo.EnPassantFileIndexEnum) new Square(16 - i).File);
                }
            }

            return(PositionMiscInfo.EnPassantFileIndexEnum.FileNone);
        }
Esempio n. 4
0
        public EncodedPositionBoard(EncodedPositionBoardPlane ourPawns, EncodedPositionBoardPlane ourKnights,
                                    EncodedPositionBoardPlane ourBishops, EncodedPositionBoardPlane ourRooks,
                                    EncodedPositionBoardPlane ourQueens, EncodedPositionBoardPlane ourKing,
                                    EncodedPositionBoardPlane theirPawns, EncodedPositionBoardPlane theirKnights,
                                    EncodedPositionBoardPlane theirBishops, EncodedPositionBoardPlane theirRooks,
                                    EncodedPositionBoardPlane theirQueens, EncodedPositionBoardPlane theirKing,
                                    EncodedPositionBoardPlane repetitions)
        {
            OurPawns   = ourPawns;
            OurKnights = ourKnights;
            OurBishops = ourBishops;
            OurRooks   = ourRooks;
            OurQueens  = ourQueens;
            OurKing    = ourKing;

            TheirPawns   = theirPawns;
            TheirKnights = theirKnights;
            TheirBishops = theirBishops;
            TheirRooks   = theirRooks;
            TheirQueens  = theirQueens;
            TheirKing    = theirKing;
            Repetitions  = repetitions;
        }
Esempio n. 5
0
        public EncodedPositionBoard(BitVector64 ourPawns, BitVector64 ourKnights,
                                    BitVector64 ourBishops, BitVector64 ourRooks,
                                    BitVector64 ourQueens, BitVector64 ourKing,
                                    BitVector64 theirPawns, BitVector64 theirKnights,
                                    BitVector64 theirBishops, BitVector64 theirRooks,
                                    BitVector64 theirQueens, BitVector64 theirKing,
                                    bool repetitions)
        {
            OurPawns   = new EncodedPositionBoardPlane(ourPawns);
            OurKnights = new EncodedPositionBoardPlane(ourKnights);
            OurBishops = new EncodedPositionBoardPlane(ourBishops);
            OurRooks   = new EncodedPositionBoardPlane(ourRooks);
            OurQueens  = new EncodedPositionBoardPlane(ourQueens);
            OurKing    = new EncodedPositionBoardPlane(ourKing);

            TheirPawns   = new EncodedPositionBoardPlane(theirPawns);
            TheirKnights = new EncodedPositionBoardPlane(theirKnights);
            TheirBishops = new EncodedPositionBoardPlane(theirBishops);
            TheirRooks   = new EncodedPositionBoardPlane(theirRooks);
            TheirQueens  = new EncodedPositionBoardPlane(theirQueens);
            TheirKing    = new EncodedPositionBoardPlane(theirKing);
            Repetitions  = repetitions ? new EncodedPositionBoardPlane(ALL_ONES_LONG) : default;
        }