Beispiel #1
0
 public void Think(Kifu.KifuNode node, string usiPosition, UsiThinkLimit limit, Color sideToMove)
 {
     Engine.Think(node, usiPosition, limit, sideToMove);
 }
Beispiel #2
0
 public void Think(string usiPosition, UsiThinkLimit limit, Color sideToMove)
 {
     BestMove = Move.NONE; // いったんこのタイミングでクリアする。
 }
Beispiel #3
0
 public void Think(string usiPosition, UsiThinkLimit limit)
 {
 }
Beispiel #4
0
 public void Think(string usiPosition, UsiThinkLimit limit, Color sideToMove)
 {
     Engine.Think(usiPosition, limit, sideToMove);
 }
Beispiel #5
0
 public void Think(Kifu.KifuNode node, string usiPosition, UsiThinkLimit limit, Color sideToMove)
 {
 }
Beispiel #6
0
        /// <summary>
        /// 手番側のプレイヤーに自分の手番であることを通知するためにThink()を呼び出す。
        /// また、手番側のCanMove = trueにする。非手番側のプレイヤーに対してCanMove = falseにする。
        /// </summary>
        private void NotifyTurnChanged()
        {
            var stm = Position.sideToMove;

            // 検討モードでは、先手側のプレイヤーがエンジンに紐づけられている。
            if (GameMode.IsConsiderationWithEngine())
            {
                stm = Color.BLACK;
            }

            var stmPlayer = Player(stm);
            var isHuman   = stmPlayer.PlayerType == PlayerTypeEnum.Human;

            // 手番が変わった時に特殊な局面に至っていないかのチェック
            if (GameMode == GameModeEnum.InTheGame)
            {
                var  misc = TheApp.app.Config.GameSetting.MiscSettings;
                Move m    = kifuManager.Tree.IsNextNodeSpecialNode(isHuman, misc);

                // 上で判定された特殊な指し手であるか?
                if (m != Move.NONE)
                {
                    // この特殊な状況を棋譜に書き出して終了。
                    kifuManager.Tree.AddNode(m, KifuMoveTimes.Zero);
                    // speical moveでもDoMoveできることは保証されている。
                    kifuManager.Tree.DoMove(m);

                    GameEnd(m);
                    return;
                }
            }

            // USIエンジンのときだけ、"position"コマンドに渡す形で局面図が必要であるから、
            // 生成して、それをPlayer.Think()の引数として渡してやる。
            var    isUsiEngine = stmPlayer.PlayerType == PlayerTypeEnum.UsiEngine;
            string usiPosition = isUsiEngine ? kifuManager.UsiPositionString : null;

            stmPlayer.CanMove         = true;
            stmPlayer.SpecialMove     = Move.NONE;
            LastCheckedByoyomiReadOut = 0;

            // BestMove,PonderMoveは、Think()以降、正常に更新されることは、Playerクラス側で保証されているので、
            // ここではそれらの初期化は行わない。

            // -- MultiPVの設定

            if (GameMode == GameModeEnum.ConsiderationWithEngine)
            {
                // MultiPVは、GlobalConfigの設定を引き継ぐ
                (stmPlayer as UsiEnginePlayer).Engine.MultiPV = TheApp.app.Config.ConsiderationMultiPV;
            }
            // それ以外のGameModeなら、USIのoption設定を引き継ぐので変更しない。


            // -- Think()

            // 通常対局モードのはずなので現在の持ち時間設定を渡してやる。
            // エンジン検討モードなら検討エンジン設定に従う

            UsiThinkLimit limit = UsiThinkLimit.TimeLimitLess;

            switch (GameMode)
            {
            case GameModeEnum.InTheGame:
                limit = UsiThinkLimit.FromTimeSetting(PlayTimers, stm);
                break;

            case GameModeEnum.ConsiderationWithEngine:
            {
                var setting = TheApp.app.Config.ConsiderationEngineSetting;
                if (setting.Limitless)
                {
                    limit = UsiThinkLimit.TimeLimitLess;
                }
                else         // if (setting.TimeLimit)
                {
                    limit = UsiThinkLimit.FromSecond(setting.Second);
                }
            }
            break;

            case GameModeEnum.ConsiderationWithMateEngine:
            {
                var setting = TheApp.app.Config.MateEngineSetting;
                if (setting.Limitless)
                {
                    limit = UsiThinkLimit.TimeLimitLess;
                }
                else         // if (setting.TimeLimit)
                {
                    limit = UsiThinkLimit.FromSecond(setting.Second);
                }
            }
            break;
            }

            stmPlayer.Think(usiPosition, limit, stm);

            // -- 検討ウィンドウに対して、ここをrootSfenとして設定
            if (ThinkReportEnable && isUsiEngine)
            {
                ThinkReport = new UsiThinkReportMessage()
                {
                    type   = UsiEngineReportMessageType.SetRootSfen,
                    number = NumberOfEngine == 1  ? 0 : (int)stm, // CPU1つなら1番目の窓、CPU2つならColorに相当する窓に
                    data   = Position.ToSfen(),
                    // ここ、せめて前の局面からのsfenを渡さないと、
                    // PVの1手目に同金みたいな表現が出来なくなってしまう。
                };
            }

            // 手番側のプレイヤーの時間消費を開始
            if (GameMode == GameModeEnum.InTheGame)
            {
                // InTheGame == trueならば、PlayerTimeSettingは適切に設定されているはず。
                // (対局開始時に初期化するので)

                PlayTimer(stm).ChangeToOurTurn();
            }

            // 非手番側のCanMoveをfalseに

            var nextPlayer = Player(stm.Not());

            nextPlayer.CanMove = false;

            // -- 手番が変わった時の各種propertyの更新

            EngineTurn = stmPlayer.PlayerType == PlayerTypeEnum.UsiEngine;
            // 対局中でなければ自由に動かせる。対局中は人間のプレイヤーでなければ駒を動かせない。
            CanUserMove = stmPlayer.PlayerType == PlayerTypeEnum.Human || GameMode.CanUserMove();

            // 値が変わっていなくとも変更通知を送りたいので自力でハンドラを呼び出す。

            RaisePropertyChanged("TurnChanged", CanUserMove); // 仮想プロパティ"TurnChanged"
        }
Beispiel #7
0
 public void Think(string usiPosition, UsiThinkLimit limit)
 {
     engine.Think(usiPosition, limit);
 }
Beispiel #8
0
 public void Think(string usiPosition, UsiThinkLimit limit, Color sideToMove)
 {
 }