/// <summary> /// 与えられた指し手が着手可能か調べ、もし着手可能な場合はそれを正式な表記に変換します。 /// </summary> /// <remarks> /// 「正式な表記」にするとは、たとえば不要な「打」を削除したり、 /// 右や直などの表記を正確なものに修正することです。 /// </remarks> public static Move NormalizeMove(this Board board, Move move) { if (board == null) { throw new ArgumentNullException("board"); } if (!board.Validate()) { throw new ArgumentException("board"); } if (move == null) { throw new ArgumentNullException("move"); } if (!move.Validate()) { throw new ArgumentException("move"); } // 投了などの特殊な指し手は常にさせることにします。 /*if (move.IsSpecialMove) * { * return move; * }*/ // 一度、指し手の正規化を行います(打を消したり、左を追加するなど) // あり得る指し手が複数ある場合は失敗とします。 var bmove = board.ConvertMove(move, true); if (bmove == null || !board.CanMove(bmove)) { return(null); } // 指し手を表記形式に再度変換します。 // 移動元の情報は使いません。("65銀(55)"という表記にはしません) var newMove = board.ConvertMove(bmove, false); if (newMove == null) { return(null); } // 最後に元の文字列を保存して返します。 newMove.OriginalText = move.OriginalText; return(newMove); }
/// <summary> /// このノードの手を実際に指してみて、着手可能か確認します。 /// </summary> private BoardMove MakeMove(Board board, List <Exception> errors) { var bmove = board.ConvertMove(Move, true); if (bmove == null || !bmove.Validate()) { errors.Add(new FileFormatException( LineNumber, string.Format( "{0}手目: 指し手が正しくありません。", MoveCount))); return(null); } // 局面を進めます。 if (!board.DoMove(bmove)) { errors.Add(new FileFormatException( LineNumber, string.Format( "{0}手目の手を指すことができませんでした。", MoveCount))); return(null); } return(bmove); }
/// <summary> /// このノードの手を実際に指してみて、着手可能か確認します。 /// </summary> private BoardMove MakeMove(Board board, List<Exception> errors) { var bmove = board.ConvertMove(Move, true); if (bmove == null || !bmove.Validate()) { errors.Add(new FileFormatException( LineNumber, string.Format( "{0}手目: 指し手が正しくありません。", MoveCount))); return null; } // 局面を進めます。 if (!board.DoMove(bmove)) { errors.Add(new FileFormatException( LineNumber, string.Format( "{0}手目の手を指すことができませんでした。", MoveCount))); return null; } return bmove; }
/// <summary> /// 文字列から得られた指し手から、移動前の情報も含むような /// 指し手情報を取得します。 /// </summary> public static BoardMove ConvertMove(this Board board, Move move, bool multipleIsNull = false) { return(board.ConvertMove(move, board.Turn, multipleIsNull)); }