Example #1
0
        /// <summary>
        /// マージするための下請け。
        ///
        /// currentNodeのsfen == tree.currentNodeのsfen
        /// であることは保証されている。
        ///
        /// ここにマージしていく。
        /// </summary>
        /// <param name="tree"></param>
        private void MergeSub(KifuTree tree)
        {
            //Debug.Assert(position.ToSfen() == tree.position.ToSfen());
            // → このAssert書きたいが、重くなるので省略。

            // それぞれの指し手で進めて再帰的に自分自身を呼び出す。
            var moves = tree.currentNode.moves;

            foreach (var move in moves)
            {
                // すでに同じ指し手の分岐を持っているか?
                var move2 = currentNode.moves.Find(kifuMove => kifuMove.nextMove == move.nextMove);
                if (move2 != null)
                {
                    // 見つかったのでこの枝を辿って再帰的に子nodeを追加。

                    DoMove(move2);
                    tree.DoMove(move);

                    MergeSub(tree);

                    tree.UndoMove();
                    UndoMove();
                }
                else
                {
                    // ただしprevNodeは異なるので、この指し手で進めたときのprevNodeを書き換えてやる必要はある。
                    move.nextNode.prevNode = currentNode;

                    // 見つからなかったのでこの枝をまるごと追加。
                    currentNode.moves.Add(move);
                }
            }
        }
Example #2
0
 /// <summary>
 /// 指し手で局面を戻す。
 /// </summary>
 public void UndoMove()
 {
     Tree.UndoMove();
 }