/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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)}"); } }
/// <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)}"); } }
/// <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); }
/// <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()}"); }