/// <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> public static bool CanMoveList(this Board board, IEnumerable <Move> moveList) { if (board == null) { throw new ArgumentNullException("board"); } // 駒を動かしながら差し手を検証するため、 // 盤の一時オブジェクトが必要になります。 var boardTmp = board.Clone(); foreach (var boardMove in moveList) { // 次の手を検証する必要があるため、実際に駒を動かします。 if (!boardTmp.DoMove(boardMove)) { return(true); } } return(true); }
/// <summary> /// KifMoveNodeからMoveNodeへ構造を変換します。 /// 結果は<paramref name="root"/>以下に設定されます。 /// </summary> private void ConvertToMoveNode(Board board, MoveNode root, List<Exception> errors) { for (var node = this; node != null; node = node.Variation) { var cloned = board.Clone(); // 指し手を実際に指してみます。 var bmove = node.MakeMove(cloned, errors); if (bmove == null) { continue; } var moveNode = new MoveNode { Move = bmove, MoveCount = node.MoveCount, Duration = node.Duration, Comment = node.Comment, }; // 次の指し手とその変化を変換します。 if (node.Next != null) { node.Next.ConvertToMoveNode(cloned, moveNode, errors); } root.AddNext(moveNode); } }
/// <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> private AutoPlay(Board board, bool isCloneBoard) { if (board == null) { throw new ArgumentNullException("board"); } UpdateEnumeratorFactory = () => GetUpdateEnumerator(); StartBoard = board; Board = (isCloneBoard ? board.Clone() : board); IsCloneBoard = isCloneBoard; Interval = DefaultInterval; EffectFadeInterval = DefaultEffectFadeInterval; BeginningInterval = TimeSpan.Zero; EndingInterval = TimeSpan.Zero; Position = TimeSpan.Zero; BasePosition = TimeSpan.Zero; IsWaitForLastMove = true; }