/// <summary> /// 与えられた指し手が着手可能か調べ、もし着手可能な場合はそれを正式な表記に変換します。 /// </summary> /// <remarks> /// 「正式な表記」にするとは、たとえば不要な「打」を削除したり、 /// 右や直などの表記を正確なものに修正することです。 /// </remarks> public static LiteralMove NormalizeMove(this Board board, LiteralMove lmove) { if (board == null) { throw new ArgumentNullException("board"); } if (!board.Validate()) { throw new ArgumentException("board"); } if (lmove == null) { throw new ArgumentNullException("lmove"); } if (!lmove.Validate()) { throw new ArgumentException("lmove"); } // 投了などの特殊な指し手は常にさせることにします。 /*if (move.IsSpecialMove) * { * return move; * }*/ // 一度、指し手の正規化を行います(打を消したり、左を追加するなど) // あり得る指し手が複数ある場合は失敗とします。 var move = board.ConvertMoveFromLiteral(lmove, true); if (move == null || !board.CanMove(move)) { return(null); } // 指し手を表記形式に再度変換します。 // 移動元の情報は使いません。("65銀(55)"という表記にはしません) var newLMove = board.ConvertLiteralFromMove(move, false); if (newLMove == null) { return(null); } // 最後に元の文字列を保存して返します。 newLMove.OriginalText = lmove.OriginalText; return(newLMove); }