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; }
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; }
/// <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); }
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; }
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; }