/// <summary> /// KifMoveNodeからMoveNodeへ構造を変換します。 /// 結果は<paramref name="root"/>以下に設定されます。 /// </summary> private void ConvertToMoveNode(MoveNode root, Board board, List <Exception> errors) { for (var node = this; node != null; node = node.VariationNode) { // 指し手を実際に指してみます。 var move = node.MakeMove(board, errors); if (move == null) { continue; } var moveNode = new MoveNode { Move = move, MoveCount = node.MoveCount, Duration = node.Duration, PVInfoList = node.PVInfoList, CommentList = node.CommentList, }; // 次の指し手とその変化を変換します。 if (node.NextNode != null) { // 次の手以降の手はこのノードを親として追加していきます。 node.NextNode.ConvertToMoveNode(moveNode, board, errors); } root.AddNextNode(moveNode); board.Undo(); } }
/// <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> /// コメントからPVを探します。 /// </summary> public void SetupPVInfo(Board board) { Move move = null; if (VariationNode != null) { VariationNode.SetupPVInfo(board); } // このノードの手を指して、変化の基準局面を進めます。 if (LiteralMove != null && LiteralMove.Validate()) { move = MakeMove(board, new List <Exception>()); if (move == null || !move.Validate()) { Log.Error("'{0}'が正しく着手できません。", move); return; } } for (var i = 0; i < CommentList.Count();) { var pvInfo = ParsePVInfo(CommentList[i], board); if (pvInfo != null) { PVInfoList.Add(pvInfo); CommentList.RemoveAt(i); } else { ++i; } } if (NextNode != null) { NextNode.SetupPVInfo(board); } if (move != null) { board.Undo(); } }
/// <summary> /// 局面を設定し、局面に指し手がある場合はそれを指し手リストに追加します。 /// </summary> /// <remarks> /// <paramref name="isStartBoard"/>が真の場合は開始局面のみ /// (手を全く指していない=手数が0)しか受け入れません。 /// </remarks> public void SetBoard(Board board, bool isStartBoard) { if (board == null) { throw new ArgumentNullException("board"); } 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); } }