Esempio n. 1
0
        private static void PopulatePawnMoves(
            ICollection <GameMoveData2> resultMoves,
            Bitboard destinationsBitboard,
            int moveOffset,
            GameMoveFlags moveFlags)
        {
            var isPawnPromotion = (moveFlags & GameMoveFlags.IsPawnPromotion) != 0;

            while (destinationsBitboard.IsAny)
            {
                var targetSquareIndex = Bitboard.PopFirstSquareIndex(ref destinationsBitboard);

                var move = new GameMove2(
                    new Square(targetSquareIndex - moveOffset),
                    new Square(targetSquareIndex));

                if (isPawnPromotion)
                {
                    var promotionMoves = move.MakeAllPromotions();
                    foreach (var promotionMove in promotionMoves)
                    {
                        resultMoves.Add(new GameMoveData2(promotionMove, moveFlags));
                    }
                }
                else
                {
                    resultMoves.Add(new GameMoveData2(move, moveFlags));
                }
            }
        }
        internal CastlingInfo2(
            CastlingType castlingType,
            GameMove2 kingMove,
            GameMove2 rookMove,
            [NotNull] params Square[] emptySquares)
        {
            castlingType.EnsureDefined();

            if (emptySquares is null)
            {
                throw new ArgumentNullException(nameof(emptySquares));
            }

            if (kingMove.From.Rank != kingMove.To.Rank ||
                Math.Abs(kingMove.From.SquareIndex - kingMove.To.SquareIndex) != 2)
            {
                throw new ArgumentException(
                          $@"Invalid castling move '{kingMove.ToUciNotation()}'.",
                          nameof(kingMove));
            }

            CastlingType = castlingType;
            CastlingSide = castlingType.GetSide();
            Option       = castlingType.ToOption();
            KingMove     = kingMove;
            RookMove     = rookMove;
            EmptySquares = emptySquares.AsReadOnly();
            PassedSquare = new Square((kingMove.From.SquareIndex + kingMove.To.SquareIndex) / 2);
            GameSide     = Option.IsAnySet(CastlingOptions.WhiteMask) ? GameSide.White : GameSide.Black;
        }
Esempio n. 3
0
        private void GenerateSlidingPieceMoves(
            [NotNull] ICollection <GameMoveData2> resultMoves,
            GameSide side,
            GeneratedMoveTypes moveTypes,
            PieceType pieceType,
            [NotNull] ShiftDirection[] directions)
        {
            var piece  = pieceType.ToPiece(side);
            var pieces = PiecePosition[piece];

            var emptySquares = PiecePosition[Piece.None];
            var enemies      = PiecePosition[side.Invert()];

            var shouldGenerateQuiets   = moveTypes.IsAnySet(GeneratedMoveTypes.Quiet);
            var shouldGenerateCaptures = moveTypes.IsAnySet(GeneratedMoveTypes.Capture);

            //// TODO [HarinezumiSama] NEW-DESIGN: IDEA: Generate for all pieces rather for one by one
            while (pieces.IsAny)
            {
                var sourceSquareIndex = Bitboard.PopFirstSquareIndex(ref pieces);
                var sourceBitboard    = Bitboard.FromSquareIndex(sourceSquareIndex);
                var sourceSquare      = new Square(sourceSquareIndex);

                foreach (var direction in directions)
                {
                    var current = sourceBitboard;

                    while ((current = current.Shift(direction)).IsAny)
                    {
                        if ((current & emptySquares).IsAny)
                        {
                            if (shouldGenerateQuiets)
                            {
                                var move = new GameMove2(sourceSquare, current.GetFirstSquare());
                                resultMoves.Add(new GameMoveData2(move, GameMoveFlags.None));
                            }

                            continue;
                        }

                        if ((current & enemies).IsAny)
                        {
                            if (shouldGenerateCaptures)
                            {
                                var move = new GameMove2(sourceSquare, current.GetFirstSquare());
                                resultMoves.Add(
                                    new GameMoveData2(move, GameMoveFlags.IsRegularCapture));
                            }
                        }

                        break;
                    }
                }
            }
        }
Esempio n. 4
0
        private static void PopulateSimpleMoves(
            ICollection <GameMoveData2> resultMoves,
            Square sourceSquare,
            Bitboard destinationsBitboard,
            GameMoveFlags moveFlags)
        {
            while (destinationsBitboard.IsAny)
            {
                var targetSquareIndex = Bitboard.PopFirstSquareIndex(ref destinationsBitboard);

                var move = new GameMove2(sourceSquare, new Square(targetSquareIndex));
                resultMoves.Add(new GameMoveData2(move, moveFlags));
            }
        }
Esempio n. 5
0
        public static string ToUciNotation(this GameMove2 move)
        {
            var isPromotion = move.PromotionResult != PieceType.None;

            var chars = new[]
            {
                move.From.FileChar,
                move.From.RankChar,
                move.To.FileChar,
                move.To.RankChar,
                isPromotion ? char.ToLowerInvariant(move.PromotionResult.GetFenChar()) : '\0'
            };

            return(new string(chars, 0, isPromotion ? chars.Length : chars.Length - 1));
        }
 internal GameMoveData2(GameMove2 move, GameMoveFlags moveFlags)
 {
     Move      = move;
     MoveFlags = moveFlags;
 }
Esempio n. 7
0
 public abstract GamePosition MakeMove(GameMove2 move);
Esempio n. 8
0
 public override GamePosition MakeMove(GameMove2 move)
 {
     throw new NotImplementedException();
 }