示例#1
0
 internal Move(Move source, PromotionType promotion)
 {
     Piece            = source.Piece;
     OriginalPosition = source.OriginalPosition;
     NewPosition      = source.NewPosition;
     CapturedPiece    = source.CapturedPiece;
     Parameter        = new MovePromotion(promotion);
     IsCheck          = source.IsCheck;
     IsMate           = source.IsMate;
     San = source.San;
 }
示例#2
0
    internal static bool IsValidMove(Move move, ChessBoard board, bool raise, bool checkTurn)
    {
        if (move is null || !move.HasValue)
        {
            throw new ArgumentNullException(nameof(move));
        }

        if (board.pieces[move.OriginalPosition.Y, move.OriginalPosition.X] is null)
        {
            throw new ChessPieceNotFoundException(board, move.OriginalPosition);
        }

        if (checkTurn && board.pieces[move.OriginalPosition.Y, move.OriginalPosition.X].Color != board.Turn)
        {
            return(false);
        }

        if (move.OriginalPosition == move.NewPosition)
        {
            return(false);
        }

        move.Piece         = board.pieces[move.OriginalPosition.Y, move.OriginalPosition.X];
        move.IsCheck       = false;
        move.IsMate        = false;
        move.CapturedPiece = null;
        move.San           = null;

        MovePromotion?promParams = null;

        // Promotion result can be already specified so we dont need to invoke event again to ask for prom result
        if (move.Parameter is MovePromotion p)
        {
            promParams = new MovePromotion(p.PromotionType);
        }

        move.Parameter = null;

        bool isValid = IsValidMove(move, board);
        // If is not valid => don't validate further
        bool isChecked = !isValid || IsKingCheckedValidation(move, move.Piece.Color, board);

        if (!isChecked)
        {
            // Capture
            if (board.pieces[move.NewPosition.Y, move.NewPosition.X] is not null &&
                board.pieces[move.NewPosition.Y, move.NewPosition.X].Color != move.Piece.Color)
            {
                move.CapturedPiece = board.pieces[move.NewPosition.Y, move.NewPosition.X];
            }

            // Promote, Invoke event only when raises == true AND promotion parameters has been not specified yet
            if (move.Parameter is MovePromotion promotion)
            {
                if (promParams != null && promParams.PromotionType != PromotionType.Default)
                {
                    move.Parameter = promParams;
                }
                else if (raise)
                {
                    var args = new PromotionEventArgs(board);
                    board.OnPromotePawnEvent(args);
                    promotion.PromotionType = args.PromotionResult;
                }
            }

            // Check on opposite king
            move.IsCheck = IsKingCheckedValidation(move, move.Piece.Color.OppositeColor(), board);

            // Opposite king is in (stale)mate
            move.IsMate = !PlayerHasMovesValidation(move, move.Piece.Color.OppositeColor(), board);

            return(true);
        }
        else
        {
            if (isValid && raise)
            {
                board.OnInvalidMoveKingCheckedEvent(new CheckEventArgs(board, move.Piece.Color == PieceColor.White ? board.WhiteKing : board.BlackKing, true));
            }
            return(false);
        }
    }