Exemple #1
0
        public static MoveSummary CanRookMove(Board board, Square from, Square to)
        {
            //throw new NotImplementedException("CanRookMove");
            var piece       = board[from];
            var isSameColor = board[from].Color == board[to].Color;
            var isCapturing = board[to].IsNone() ?
                              false :
                              !isSameColor;
            var isMovePossible =
                !isSameColor &&
                Checker.CanMoveLineary(
                    MoveProperty.IsHorizontalLine(from, to) ||
                    MoveProperty.IsVerticalLine(from, to),
                    board, from, to);

            var isWhite = piece.Color.IsWhite();
            var startQueensideSquare = isWhite ?
                                       WhiteCastlingSquares.QueensideRookStartSquare :
                                       BlackCastlingSquares.QueensideRookStartSquare;

            var startKingsideSquare = isWhite ?
                                      WhiteCastlingSquares.KingsideRookStartSquare :
                                      BlackCastlingSquares.KingsideRookStartSquare;

            var isQueensideRookMoving =
                from == startQueensideSquare;
            var isKingsideRookMoving =
                from == startKingsideSquare;

            return(MoveSummaryBuilder.RookSummary(
                       isCapturing, isMovePossible,
                       isQueensideRookMoving, isKingsideRookMoving, to));
        }
Exemple #2
0
        public static MoveSummary CanKnightMove(Board board, Square from, Square to)
        {
            var isSameColor = board[from].Color == board[to].Color;
            var isCapturing = board[to].IsNone() ?
                              false :
                              !isSameColor;
            var isMovePossible =
                !isSameColor &&
                MoveProperty.AbsDeltaX(from, to) *
                MoveProperty.AbsDeltaY(from, to) == 2;

            return(MoveSummaryBuilder.DefaultMoveSummary(isCapturing, isMovePossible, to));
        }
Exemple #3
0
        public static MoveSummary CanBishopMove(Board board, Square from, Square to)
        {
            var isSameColor = board[from].Color == board[to].Color;
            var isCapturing = board[to].IsNone() ?
                              false :
                              !isSameColor;
            var isMovePossible =
                !isSameColor &&
                Checker.CanMoveLineary(
                    MoveProperty.IsDiagonalLine(from, to),
                    board, from, to);

            return(MoveSummaryBuilder.DefaultMoveSummary(isCapturing, isMovePossible, to));
        }
Exemple #4
0
        public static MoveSummary CanKingMove(ChessGame game, Color kingColor, Board board, Square from, Square to)
        {
            var isSameColor = board[from].Color == board[to].Color;
            var isCapturing = board[to].IsNone() ?
                              false :
                              !isSameColor;
            var canDefaultMove = CanDefaultMove(from, to, isSameColor);

            if (canDefaultMove)
            {
                return(MoveSummaryBuilder.KingSummary(isCapturing, true, false, false, to));
            }
            return
                (CanCastle(game, kingColor, board, from, to));
        }
Exemple #5
0
        public static MoveSummary CanPawnMove(
            ChessGame game,
            Color pawnColor,
            Board board,
            Square from, Square to)
        {
            var isCapturing           = false;
            var isMovePossible        = false;
            var canPromote            = false;
            var enPassantTargetSquare = Square.NoneSquare;
            var isEnPassant           = false;

            var canForward = CanForward(pawnColor, board, from, to);

            if (canForward)
            {
                isMovePossible = true;

                var promotionRow = GetPawnPromotionRow(pawnColor);
                if (to.Y == promotionRow)
                {
                    canPromote = true;
                }
            }

            var canPush = CanPush(pawnColor, board, from, to);

            if (canPush)
            {
                isMovePossible = true;

                enPassantTargetSquare = new Square(from.X, from.Y + GetPawnStep(pawnColor));
            }

            var canCapture = CanCapture(pawnColor, board, from, to);

            if (canCapture)
            {
                isMovePossible = true;
                isCapturing    = true;

                var promotionRow = GetPawnPromotionRow(pawnColor);
                if (to.Y == promotionRow)
                {
                    canPromote = true;
                }
            }
            var capturedPieceSquare = isCapturing ? to : Square.NoneSquare;
            var canEnPassant        = CanEnPassantCapture(
                game,
                pawnColor,
                from, to);

            if (canEnPassant)
            {
                isMovePossible      = true;
                isCapturing         = true;
                isEnPassant         = true;
                capturedPieceSquare = new Square(
                    game.EnPassantTargetSquare.X,
                    game.EnPassantTargetSquare.Y + GetPawnStep(pawnColor));
            }

            return
                (MoveSummaryBuilder.PawnMoveSummary(
                     isCapturing, isMovePossible,
                     canPromote, enPassantTargetSquare, isEnPassant, capturedPieceSquare));
        }
Exemple #6
0
        private static MoveSummary CanCastle(ChessGame game, Color kingColor, Board board, Square from, Square to)
        {
            var isHorizontalLine = MoveProperty.IsHorizontalLine(from, to);

            if (isHorizontalLine)
            {
                var isAnyPieceBetween = Checker.IsAnyPieceBetween(board, from, to);
                if (!isAnyPieceBetween)
                {
                    var isKingWhite  = kingColor.IsWhite();
                    var hasKingMoved =
                        isKingWhite ?
                        game.HasWhiteKingMoved :
                        game.HasBlackKingMoved;

                    if (hasKingMoved)
                    {
                        return
                            (MoveSummaryBuilder.DefaultMoveSummary(false, false, Square.NoneSquare));
                    }

                    var kingStartSquare = GetKingStartSquare(isKingWhite);
                    if (kingStartSquare == from)
                    {
                        var    isQueensideDirection = IsQueensideDirection(isKingWhite, to);
                        var    isKingsideDirection  = IsKingsideDirection(isKingWhite, to);
                        Square rookStartSquare;
                        bool   hasRookMoved;
                        if (isQueensideDirection)
                        {
                            rookStartSquare = GetQueensideRookStartSquare(isKingWhite);
                            hasRookMoved    = isKingWhite ?
                                              game.HasWhiteQueensideRookMoved :
                                              game.HasBlackQueensideRookMoved;
                        }

                        else if (isKingsideDirection)
                        {
                            rookStartSquare = GetKingsideRookStartSquare(isKingWhite);
                            hasRookMoved    = isKingWhite ?
                                              game.HasWhiteKingsideRookMoved :
                                              game.HasBlackKingsideRookMoved;
                        }

                        else
                        {
                            return(MoveSummaryBuilder.DefaultMoveSummary(false, false, Square.NoneSquare));
                        }

                        var piece = board[rookStartSquare];
                        if (piece.IsNone())
                        {
                            return
                                (MoveSummaryBuilder.DefaultMoveSummary(false, false, Square.NoneSquare));
                        }

                        var isValid =
                            !hasRookMoved &&
                            piece.Color == kingColor &&
                            piece.Type == PieceType.Rook;
                        if (isValid)
                        {
                            return(MoveSummaryBuilder.
                                   KingSummary(false, true, isQueensideDirection, isKingsideDirection, Square.NoneSquare));
                        }
                    }
                }
            }

            return(MoveSummaryBuilder.DefaultMoveSummary(false, false, Square.NoneSquare));
        }