Ejemplo n.º 1
0
        /// <summary>
        /// 文字列から得られた指し手から、移動前の情報も含むような
        /// 指し手情報を取得します。
        /// </summary>
        public static Move ConvertMoveFromLiteral(this Board board, LiteralMove move,
                                                  BWType bwType,
                                                  bool multipleIsNull = false)
        {
            if (board == null)
            {
                throw new ArgumentNullException("board");
            }

            if (move == null)
            {
                return(null);
            }

            if (move.SameAsOld && board.PrevMovedSquare == null)
            {
                return(null);
            }

            if (move.IsSpecialMove)
            {
                return(Move.CreateSpecialMove(
                           bwType, move.SpecialMoveType));
            }

            // 移動後の位置を取得します。
            // 同○○なら前回の位置を使います。
            var dstSquare = move.DstSquare;

            if (move.SameAsOld)
            {
                move           = move.Clone();
                move.DstSquare = board.PrevMovedSquare;

                dstSquare = board.PrevMovedSquare;
            }

            var boardMoveList = board.ListupMoves(
                move.Piece, bwType, dstSquare)
                                .ToList();

            // 複数の指し手の中から適切な一つを選びます。
            var boardMove = FilterMoveFromLiteral(boardMoveList, move, multipleIsNull);

            if (boardMove == null)
            {
                return(null);
            }

            return(boardMove);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 指し手をXX->YYの形式から、ZZ銀上などの形に変換します。
        /// </summary>
        /// <remarks>
        /// <paramref name="useSrcSquare"/>を真にすると、差し手の後に
        /// 古い位置の情報が付加されるようになります。(例: 32金(22))
        /// </remarks>
        public static LiteralMove ConvertLiteralFromMove(this Board board, Move move,
                                                         bool useSrcSquare)
        {
            if (board == null)
            {
                throw new ArgumentNullException("board");
            }

            if (move == null || !move.Validate())
            {
                throw new ArgumentNullException("move");
            }

            if (move.IsSpecialMove)
            {
                return(new LiteralMove
                {
                    BWType = move.BWType,
                    SpecialMoveType = move.SpecialMoveType,
                });
            }

            var fromPiece = (
                move.ActionType == ActionType.Drop ?
                new Piece(move.DropPieceType) :
                move.MovePiece);

            if (fromPiece == null)
            {
                return(null);
            }

            // 駒の種類と最終位置から、あり得る指し手をすべて検索します。
            var boardMoveList = board.ListupMoves(
                fromPiece, move.BWType, move.DstSquare)
                                .ToList();

            return(FilterLiteralFromMove(
                       board, boardMoveList, move, fromPiece, useSrcSquare));
        }