/// <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); }
/// <summary> /// 局面を設定し、局面に指し手がある場合はそれを指し手リストに追加します。 /// </summary> /// <remarks> /// <paramref name="isStartBoard"/>が真の場合は開始局面のみ /// (手を全く指していない=手数が0)しか受け入れません。 /// </remarks> public void SetBoard(Board board, bool isStartBoard) { if (board == null) { throw new ArgumentNullException("board"); } if (!board.Validate()) { throw new ArgumentException("board"); } // 念のためクローンしておきます。 board = board.Clone(); if (isStartBoard) { if (board.MoveCount > 0) { throw new ShogiException( "SetBoardには開始局面を設定してください。"); } StartBoard = board; } else { // 開始局面でなくてもよい場合は、指し手を別に取得します。 var moveList = new List <BoardMove>(); for (var move = board.Undo(); move != null; move = board.Undo()) { moveList.Insert(0, move); } StartBoard = board; SetMoveList(moveList); } }
/// <summary> /// 局面を設定し、局面に指し手がある場合はそれを指し手リストに追加します。 /// </summary> /// <remarks> /// <paramref name="isStartBoard"/>が真の場合は開始局面のみ /// (手を全く指していない=手数が0)しか受け入れません。 /// </remarks> public void SetBoard(Board board, bool isStartBoard) { if (board == null) { throw new ArgumentNullException("board"); } if (!board.Validate()) { throw new ArgumentException("board"); } // 念のためクローンしておきます。 board = board.Clone(); if (isStartBoard) { if (board.MoveCount > 0) { throw new ShogiException( "SetBoardには開始局面を設定してください。"); } StartBoard = board; } else { // 開始局面でなくてもよい場合は、指し手を別に取得します。 var moveList = new List<BoardMove>(); for (var move = board.Undo(); move != null; move = board.Undo()) { moveList.Insert(0, move); } StartBoard = board; SetMoveList(moveList); } }