/// <summary> /// 直前の相手の手を考慮して、与えられた指し手を修正します。 /// </summary> private LiteralMove ModifyMove(LiteralMove move) { /*if (move == null || !move.Validate()) * { * throw new Exception("与えられた指し手が正しくありません。"); * }*/ using (LazyLock()) { if (this.opponentMove == null) { return(move); } var newMove = move.Clone(); // 同○○なら、相手の直前の手と列段を合わせます。 if (newMove.SameAsOld) { newMove.File = this.opponentMove.File; newMove.Rank = this.opponentMove.Rank; } else if (newMove.File == this.opponentMove.File && newMove.Rank == this.opponentMove.Rank) { newMove.SameAsOld = true; } return(newMove); } }
/// <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); }