예제 #1
0
 public KifuMove(Move nextMove_, KifuNode nextNode_, TimeSpan thinkingTime_, TimeSpan totalTime_)
 {
     nextMove     = nextMove_;
     nextNode     = nextNode_;
     thinkingTime = thinkingTime_;
     totalTime    = totalTime_;
 }
예제 #2
0
        /// <summary>
        /// 初期化する。new KifuTree()した状態に戻る。
        /// </summary>
        public void Init()
        {
            position.InitBoard();

            // root nodeを作る
            currentNode   = rootNode = new KifuNode(null);
            pliesFromRoot = 0;

            rootBoardType = BoardType.NoHandicap;
            rootSfen      = Position.SFEN_HIRATE;

            // rootSfenのsetterで初期化されているのでここではKifuList、UsiMoveListの初期化はしない
            //KifuList = new List<string>();
            //UsiMoveList = new List<string>();

            // 対局情報などを保存するためにここを確保する。
            rootKifuMove = new KifuMove(Move.NONE, rootNode, KifuMoveTimes.Zero);

            kifuWindowMoves  = new List <KifuMove>();
            KifuTimeSettings = KifuTimeSettings.TimeLimitless;
            KifuBranch       = -1;

            // mutableなオブジェクトのraiseは、raiseする側でClone()してimmutableにしておかないと駄目。
            RaisePropertyChanged("Position", position.Clone());
        }
예제 #3
0
        /// <summary>
        /// posを1手前の局面に移動する
        /// </summary>
        public void UndoMove()
        {
            // rootNode以上に遡ることはできない。
            Debug.Assert(currentNode != rootNode);

            // speical moveでこの局面に来たのであればPosition.UndoMove()は呼び出さない。
            if (!IsSpecialNode())
            {
                position.UndoMove();

                // これ、RemoveKifu()で棋譜リストの更新を行うならばKifuListSelectedIndexが変化するので
                // 再度このイベントが発生する。無駄と言えば無駄だが…。
                RaisePropertyChanged("Position", position.Clone());
            }

            --pliesFromRoot;

            // ここに引っかかるならcurrentNode.prevNodeの設定忘れ。
            Debug.Assert(currentNode.prevNode != null);

            currentNode = currentNode.prevNode;

            // 棋譜の更新
            RemoveKifu();
        }
예제 #4
0
파일: KifuTree.cs 프로젝트: ruhiel/MyShogi
        // -------------------------------------------------------------------------
        // 局面に対する操作子
        // -------------------------------------------------------------------------

        // DoMove(),UndoMove()以外はcurrentNode.movesに自分で足すなり引くなりすれば良い

        /// <summary>
        /// posの現在の局面から指し手mで進める。
        /// mは、currentNodeのもつ指し手の一つであるものとする
        /// </summary>
        /// <param name="m"></param>
        public void DoMove(KifuMove m)
        {
            Debug.Assert(m != null);

            position.DoMove(m.nextMove);
            currentNode = m.nextNode;
            //    UsiMoveStringList.Add(m.nextMove.ToUsi());
        }
예제 #5
0
        /// <summary>
        /// 初期化する。new KifuTree()した状態に戻る。
        /// </summary>
        public void Init()
        {
            position.InitBoard();

            currentNode = rootNode = new KifuNode(null);
            //    UsiMoveStringList.Clear();
            rootBoardType = BoardType.NoHandicap;
            rootSfen      = Position.SFEN_HIRATE;

            RaisePropertyChanged("Position", position);
        }
예제 #6
0
파일: KifuTree.cs 프로젝트: ruhiel/MyShogi
        /// <summary>
        /// 初期化する。new KifuTree()した状態に戻る。
        /// </summary>
        public void Init()
        {
            Debug.Assert(position != null, "Bind(Position)を呼び出してからInit()を呼ぶようにしてください。");

            position.InitBoard();

            currentNode = rootNode = new KifuNode(null);
            //    UsiMoveStringList.Clear();
            rootBoardType = BoardType.NoHandicap;
            rootSfen      = Position.SFEN_HIRATE;
        }
예제 #7
0
        /// <summary>
        /// 現在の局面(currentMove)に対して、指し手moveが登録されていないなら、その指し手を追加する。
        /// すでに存在しているなら、その指し手は追加しない。
        ///
        /// thinkingTimeは考慮に要した時間。新たにnodeを追加しないときは、この値は無視される。
        /// ミリ秒まで計測して突っ込んでおいて良い。(棋譜出力時には秒単位で繰り上げられる)
        ///
        /// totalTimeは総消費時間。nullを指定した場合は、ここまでの総消費時間(TotalConsumptionTime()で取得できる)に
        /// thinkingTimeを秒単位に繰り上げたものが入る。
        ///
        /// moveがspecial moveもありうる。
        /// </summary>
        /// <param name="move"></param>
        /// <param name="thinkingTime"></param>
        public void AddNode(Move move, KifuMoveTimes kifuMoveTimes)
        {
            var m = currentNode.moves.FirstOrDefault((x) => x.nextMove == move);

            if (m == null)
            {
                // -- 見つからなかったので次のnodeを追加してやる

                KifuNode nextNode = new KifuNode(currentNode);
                currentNode.moves.Add(new KifuMove(move, nextNode, kifuMoveTimes));
            }
        }
예제 #8
0
파일: KifuTree.cs 프로젝트: ruhiel/MyShogi
        /// <summary>
        /// 現在の局面(currentMove)に対して、指し手moveが登録されていないなら、その指し手を追加する。
        /// すでに存在しているなら、その指し手は追加しない。
        ///
        /// thinkingTimeは考慮に要した時間。新たにnodeを追加しないときは、この値は無視される。
        /// ミリ秒まで計測して突っ込んでおいて良い。(棋譜出力時には秒単位で繰り上げられる)
        ///
        /// totalTimeは総消費時間。nullを指定した場合は、ここまでの総消費時間(TotalConsumptionTime()で取得できる)に
        /// thinkingTimeを秒単位に繰り上げたものが入る。
        /// </summary>
        /// <param name="move"></param>
        /// <param name="thinkingTime"></param>
        public void Add(Move move, TimeSpan thinkingTime, TimeSpan?totalTime = null)
        {
            var m = currentNode.moves.FirstOrDefault((x) => x.nextMove == move);

            if (m == null)
            {
                // -- 見つからなかったので次のnodeを追加してやる

                KifuNode nextNode = new KifuNode(currentNode);
                currentNode.moves.Add(new KifuMove(move, nextNode, thinkingTime
                                                   , totalTime ?? TotalConsumptionTime() + RoundTime(thinkingTime)));
            }
        }
예제 #9
0
        /// <summary>
        /// posを1手前の局面に移動する
        /// </summary>
        public void UndoMove()
        {
            // speical moveでこの局面に来たのであればPosition.UndoMove()は呼び出さない。
            if (!IsSpecialNode())
            {
                position.UndoMove();
                RaisePropertyChanged("Position", position);
            }

            --pliesFromRoot;

            currentNode = currentNode.prevNode;

            // 棋譜の更新
            RemoveKifu();
        }
예제 #10
0
        /// <summary>
        /// posを1手前の局面に移動する
        /// </summary>
        public void UndoMove()
        {
            // 棋譜の末端にspecial moveを積んでいたのであればそれを取り除く。
            if (currentNode.moves.Count != 0 && currentNode.moves[0].nextMove.IsSpecial())
            {
                RemoveKifu(true);
            }

            position.UndoMove();
            RaisePropertyChanged("Position", position);

            currentNode = currentNode.prevNode;

            // 棋譜の更新
            RemoveKifu();
        }
예제 #11
0
        // -------------------------------------------------------------------------
        // 局面に対する操作子
        // -------------------------------------------------------------------------

        // DoMove(),UndoMove()以外はcurrentNode.movesに自分で足すなり引くなりすれば良い
        // CurrentNodeが設定されていないと局面を進められない。

        /// <summary>
        /// posの現在の局面から指し手mで進める。
        /// mは、currentNodeのもつ指し手の一つであるものとする
        /// </summary>
        /// <param name="m"></param>
        public void DoMove(KifuMove m)
        {
            Debug.Assert(m != null);

            // 棋譜の更新
            AddKifu(m.nextMove, m.thinkingTime);

            position.DoMove(m.nextMove);
            RaisePropertyChanged("Position", position);

            currentNode = m.nextNode;

            // もし次がSpecialMoveの局面に到達したのであれば、棋譜に積む。
            if (currentNode.moves.Count != 0 && currentNode.moves[0].nextMove.IsSpecial())
            {
                AddKifuSpecialMove(currentNode.moves[0].nextMove, TimeSpan.Zero);
            }
        }
예제 #12
0
        /// <summary>
        /// 初期化する。new KifuTree()した状態に戻る。
        /// ただし、EnableKifuList == falseだと棋譜リストの初期化されないので、リセットしたいならResetKifuList()を明示的に呼び出す必要がある。
        /// </summary>
        public void Init()
        {
            // root nodeを作る
            currentNode   = rootNode = new KifuNode(null);
            pliesFromRoot = 0;

            SetRootBoardType(BoardType.NoHandicap);

            // rootSfenのsetterで初期化されているのでここではKifuList、UsiMoveListの初期化はしない
            //KifuList = new List<string>();
            //UsiMoveList = new List<string>();

            // 対局情報などを保存するためにここを確保する。
            rootKifuMove = new KifuMove(Move.NONE, rootNode, KifuMoveTimes.Zero);

            kifuWindowMoves  = new List <KifuMove>();
            KifuTimeSettings = KifuTimeSettings.TimeLimitless;
            KifuBranch       = -1;
        }
예제 #13
0
        /// <summary>
        /// posを1手前の局面に移動する
        /// </summary>
        public void UndoMove()
        {
            // speical moveでこの局面に来たのであればPosition.UndoMove()は呼び出さない。
            if (!IsSpecialNode())
            {
                position.UndoMove();

                // これ、RemoveKifu()で棋譜リストの更新を行うならばKifuListSelectedIndexが変化するので
                // 再度このイベントが発生する。無駄と言えば無駄だが…。
                RaisePropertyChanged("Position", position.Clone());
            }

            --pliesFromRoot;

            currentNode = currentNode.prevNode;

            // 棋譜の更新
            RemoveKifu();
        }
예제 #14
0
        /// <summary>
        /// 現在の局面(currentMove)に対して、指し手moveが登録されていないなら、その指し手を追加する。
        /// すでに存在しているなら、その指し手は追加しない。
        ///
        /// thinkingTimeは考慮に要した時間。新たにnodeを追加しないときは、この値は無視される。
        /// ミリ秒まで計測して突っ込んでおいて良い。(棋譜出力時には秒単位で繰り上げられる)
        ///
        /// totalTimeは総消費時間。nullを指定した場合は、ここまでの総消費時間(TotalConsumptionTime()で取得できる)に
        /// thinkingTimeを秒単位に繰り上げたものが入る。
        /// </summary>
        /// <param name="move"></param>
        /// <param name="thinkingTime"></param>
        public void AddNode(Move move, TimeSpan thinkingTime, TimeSpan?totalTime = null)
        {
            var m = currentNode.moves.FirstOrDefault((x) => x.nextMove == move);

            if (m == null)
            {
                // -- 見つからなかったので次のnodeを追加してやる

                KifuNode nextNode = new KifuNode(currentNode);
                currentNode.moves.Add(new KifuMove(move, nextNode, thinkingTime
                                                   , totalTime ?? TotalConsumptionTime() + RoundTime(thinkingTime)));

                // 特殊な指し手であるなら、この時点で棋譜の終端にその旨を記録しておく。
                if (move.IsSpecial())
                {
                    AddKifuSpecialMove(move, thinkingTime);
                }
            }
        }
예제 #15
0
        // -------------------------------------------------------------------------
        // 局面に対する操作子
        // -------------------------------------------------------------------------

        // DoMove(),UndoMove()以外はcurrentNode.movesに自分で足すなり引くなりすれば良い
        // CurrentNodeが設定されていないと局面を進められない。

        /// <summary>
        /// posの現在の局面から指し手mで進める。
        /// mは、currentNodeのもつ指し手の一つであるものとする
        ///
        /// speical moveの時は、Position.DoMove()は呼び出さないが次のnodeに到達できることは保証される。
        /// (そうしないとcurrentNodeが更新されないため)
        /// </summary>
        /// <param name="m"></param>
        public void DoMove(KifuMove m)
        {
            Debug.Assert(m != null);

            // 棋譜の更新
            var stm          = position.sideToMove;
            var thinkingTime = m.kifuMoveTimes.Player(stm).ThinkingTime;

            AddKifu(m, thinkingTime);

            // special moveに対してはDoMove()を行わない。(行っても良いが盤面が変わらないのでやるだけ無駄である)
            if (!m.nextMove.IsSpecial())
            {
                position.DoMove(m.nextMove);
                RaisePropertyChanged("Position", position);
            }

            ++pliesFromRoot;

            currentNode = m.nextNode;
        }
예제 #16
0
 /// <summary>
 /// currentNode(現在のnode)から、次のnodeがnextNodeである枝を削除する。
 /// 対局時の待ったの処理用。
 /// </summary>
 /// <param name="nextNode"></param>
 public void Remove(KifuNode nextNode)
 {
     currentNode.moves.RemoveAll((x) => x.nextNode == nextNode);
 }
예제 #17
0
 public KifuNode(KifuNode prevNode_)
 {
     prevNode = prevNode_;
 }
예제 #18
0
파일: KifuTree.cs 프로젝트: ruhiel/MyShogi
 /// <summary>
 /// posを1手前の局面に移動する
 /// </summary>
 public void UndoMove()
 {
     position.UndoMove();
     currentNode = currentNode.prevNode;
     //    UsiMoveStringList.RemoveAt(UsiMoveStringList.Count-1); // RemoveLast()
 }
예제 #19
0
 public KifuMove(Move nextMove_, KifuNode nextNode_, KifuMoveTimes kifuMoveTimes_)
 {
     nextMove      = nextMove_;
     nextNode      = nextNode_;
     kifuMoveTimes = kifuMoveTimes_;
 }