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