Пример #1
0
        /// <summary>
        /// KifuTimeSettingから、このクラスのインスタンスを構築して返す。
        /// </summary>
        /// <param name="kifuTimeSettings"></param>
        public static UsiThinkLimit FromTimeSetting(PlayTimers timer, Color us)
        {
            var limit = new UsiThinkLimit();

            limit.LimitType = UsiThinkLimitEnum.Time;

            var blackPlayer = timer.Player(Color.BLACK).KifuTimeSetting;
            var whitePlayer = timer.Player(Color.WHITE).KifuTimeSetting;

            // USIプロトコルでは先後の秒読みの違いを表現できないが、無理やり表現する
            //limit.ByoyomiTime = new TimeSpan(0, 0, ourPlayer.Byoyomi);

            // byoyomiとinctimeを同時に選択は出来ないので、IncTimeEnableを見て代入するほうを切り替える。
            if (blackPlayer.IncTimeEnable)
            {
                limit.IncTimeBlack = new TimeSpan(0, 0, blackPlayer.IncTime);
            }
            else
            {
                limit.ByoyomiTimeBlack = new TimeSpan(0, 0, blackPlayer.Byoyomi);
            }

            if (whitePlayer.IncTimeEnable)
            {
                limit.IncTimeWhite = new TimeSpan(0, 0, whitePlayer.IncTime);
            }
            else
            {
                limit.ByoyomiTimeWhite = new TimeSpan(0, 0, whitePlayer.Byoyomi);
            }

            // 先後の残り時間を保存
            limit.RestTimeBlack = timer.GetKifuMoveTimes().Player(Color.BLACK).RestTime;
            limit.RestTimeWhite = timer.GetKifuMoveTimes().Player(Color.WHITE).RestTime;

            var ourPlayer = timer.Player(us).KifuTimeSetting;

            if (ourPlayer.TimeLimitless)
            {
                // 検討モードでもないのに無制限に思考するわけにはいかないので、1手5秒とかに設定しておいてやる。

                //limit.LimitType = UsiThinkLimitEnum.Infinite;

                limit.LimitType = UsiThinkLimitEnum.Time;
                if (us == Color.BLACK)
                {
                    limit.ByoyomiTimeBlack = new TimeSpan(0, 0, 5);
                    limit.IncTimeBlack     = TimeSpan.Zero;
                    limit.RestTimeBlack    = TimeSpan.Zero;
                }
                else
                {
                    limit.ByoyomiTimeWhite = new TimeSpan(0, 0, 5);
                    limit.IncTimeWhite     = TimeSpan.Zero;
                    limit.RestTimeWhite    = TimeSpan.Zero;
                }
            }

            return(limit);
        }
Пример #2
0
        /// <summary>
        /// 指定秒だけ思考するUsiTimeLimitを生成して返す。
        /// </summary>
        /// <param name="second"></param>
        /// <param name="us"></param>
        /// <returns></returns>
        public static UsiThinkLimit FromSecond(int second)
        {
            var limit = new UsiThinkLimit();

            limit.LimitType        = UsiThinkLimitEnum.Time;
            limit.ByoyomiTimeBlack = limit.ByoyomiTimeWhite = new TimeSpan(0, 0, second);

            return(limit);
        }
Пример #3
0
        /// <summary>
        /// Depthだけ思考するUsiThinkLimitを生成して返す。
        /// </summary>
        /// <param name="nodes"></param>
        /// <returns></returns>
        public static UsiThinkLimit FromDepth(int depth)
        {
            var limit = new UsiThinkLimit();

            limit.LimitType = UsiThinkLimitEnum.Depth;
            limit.Depth     = depth;

            return(limit);
        }
Пример #4
0
        /// <summary>
        /// Nodesだけ思考するUsiThinkLimitを生成して返す。
        /// </summary>
        /// <param name="nodes"></param>
        /// <returns></returns>
        public static UsiThinkLimit FromNodes(Int64 nodes)
        {
            var limit = new UsiThinkLimit();

            limit.LimitType = UsiThinkLimitEnum.Node;
            limit.Nodes     = nodes;

            return(limit);
        }
Пример #5
0
 /// <summary>
 /// エンジンに思考させる。
 /// Thinkingの時に呼び出された場合、現在のThinkに対してstopを呼び出して、
 /// bestmoveが返ってきてから次のthinkを行う。
 /// 現在の
 /// </summary>
 /// <param name="usiPositionString"></param>
 public void Think(string usiPositionString, UsiThinkLimit limit, Color sideToMove)
 {
     if (IsMateSearch)
     {
         ThinkingBridge.Think($"position {usiPositionString}", $"go mate {limit.ToUsiString(sideToMove)}");
     }
     else
     {
         ThinkingBridge.Think($"position {usiPositionString}", $"go {limit.ToUsiString(sideToMove)}");
     }
 }
Пример #6
0
        /// <summary>
        /// エンジンに思考させる。
        /// Thinkingの時に呼び出された場合、現在のThinkに対してstopを呼び出して、
        /// bestmoveが返ってきてから次のthinkを行う。
        /// </summary>
        /// <param name="usiPositionString"></param>
        public void Think(Kifu.KifuNode node, string usiPositionString, UsiThinkLimit limit, Color sideToMove)
        {
            if (State != UsiEngineState.InTheGame)
            {
                // ゲーム中以外でThinkを呼び出している。
                // 駒を持ち上げて、その状態で検討ボタンを押すとNotifyTurnChanged()が呼び出されて、
                // エンジン側が未初期化なのにこのメソッドが呼び出されるなど…。
                // このあと、エンジンの初期化が終わったタイミングで再度、NotifyTurnChanged()から
                // このメソッドが呼び出されるはずなので、今回は単に無視しておくだけで良い。

                Log.Write(LogInfoType.UsiServer, "InTheGameではないのにThink()を呼び出している。");
                return;
            }

            if (IsMateSearch)
            {
                ThinkingBridge.Think(node, $"position {usiPositionString}", $"go {limit.ToUsiMateString(sideToMove)}");
            }
            else
            {
                ThinkingBridge.Think(node, $"position {usiPositionString}", $"go {limit.ToUsiString(sideToMove)}");
            }
        }
Пример #7
0
        /// <summary>
        /// KifuTimeSettingから、このクラスのインスタンスを構築して返す。
        /// </summary>
        /// <param name="kifuTimeSettings"></param>
        public static UsiThinkLimit FromTimeSetting(PlayTimers timer, Color us)
        {
            var limit = new UsiThinkLimit();

            var ourPlayer = timer.Player(us).KifuTimeSetting;

            if (ourPlayer.IgnoreTime)
            {
                limit.LimitType = UsiThinkLimitEnum.Infinite;
            }
            else
            {
                limit.LimitType = UsiThinkLimitEnum.Time;

                // USIプロトコルでは先後の秒読みの違いを表現できない…。
                limit.ByoyomiTime = new TimeSpan(0, 0, ourPlayer.Byoyomi);

                var blackPlayer = timer.Player(Color.BLACK).KifuTimeSetting;
                var whitePlayer = timer.Player(Color.WHITE).KifuTimeSetting;

                if (blackPlayer.IncTimeEnable)
                {
                    limit.IncTimeBlack = new TimeSpan(0, 0, blackPlayer.IncTime);
                }
                if (whitePlayer.IncTimeEnable)
                {
                    limit.IncTimeBlack = new TimeSpan(0, 0, whitePlayer.IncTime);
                }

                // 先後の残り時間を保存
                limit.RestTimeBlack = timer.GetKifuMoveTimes().Player(Color.BLACK).RestTime;
                limit.RestTimeWhite = timer.GetKifuMoveTimes().Player(Color.WHITE).RestTime;
            }

            return(limit);
        }
Пример #8
0
 /// <summary>
 /// エンジンに思考させる。
 /// Thinkingの時に呼び出された場合、現在のThinkに対してstopを呼び出して、
 /// bestmoveが返ってきてから次のthinkを行う。
 /// 現在の
 /// </summary>
 /// <param name="usiPositionString"></param>
 public void Think(string usiPositionString, UsiThinkLimit limit)
 {
     ThinkingBridge.Think($"position {usiPositionString}", $"go {limit.ToUsiString()}");
 }