示例#1
0
        /// <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();
            }
        }
示例#2
0
        /// <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);
            }
        }
示例#3
0
        /// <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();
            }
        }
示例#4
0
        /// <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);
            }
        }