/// <summary> /// グローバル変数に結果を入れるぜ☆(^~^) /// </summary> /// <param name="out_list"></param> /// <param name="hyoji"></param> /// <returns></returns> public static bool TryFailMoveCmd1(StringBuilder hyoji) { //グローバル変数に指し手がセットされるぜ☆(^▽^) PureMemory.SetTnskFukasa(PureMemory.FUKASA_MANUAL); MoveGenAccessor.DoMovePickerBegin(MoveType.N21_All); MovePicker01.MovePickerN01(MoveType.N21_All, true); return(Pure.SUCCESSFUL_FALSE); }
public static bool Try_Rnd( #if DEBUG IDebugMojiretu dbg_reigai #endif ) { //グローバル変数に指し手がセットされるぜ☆(^▽^) PureMemory.SetTnskFukasa(PureMemory.FUKASA_MANUAL); MoveGenAccessor.DoMovePickerBegin(MoveType.N21_All); MovePicker01.MovePickerN01(MoveType.N21_All, true); if (PureMemory.ssss_moveList[PureMemory.FUKASA_MANUAL].listCount < 1) { Move ss = Move.Toryo; MoveType ssType = MoveType.N00_Karappo; if (DoMoveOpe.TryFailDoMoveAll(ss, ssType #if DEBUG , PureSettei.fenSyurui , dbg_reigai , false , "Try_Rnd(1)" #endif )) { return(false); } // 手番を進めるぜ☆(^~^) MoveGenAccessor.AddKifu(ss, ssType, PureMemory.dmv_ks_c); //#if DEBUG // Util_Tansaku.Snapshot("Rndコマンド", dbg_reigai); //#endif } else { Move ss = PureMemory.ssss_moveList[PureMemory.FUKASA_MANUAL].moveList[PureSettei.random.Next(PureMemory.ssss_moveList[PureMemory.FUKASA_MANUAL].listCount)]; MoveType ssType = MoveType.N00_Karappo; if (DoMoveOpe.TryFailDoMoveAll(ss, ssType #if DEBUG , PureSettei.fenSyurui , dbg_reigai , false , "Try_Rnd(2)" #endif )) { return(false); } // 手番を進めるぜ☆(^~^) MoveGenAccessor.AddKifu(ss, ssType, PureMemory.dmv_ks_c); //#if DEBUG // Util_Tansaku.Snapshot("Rnd(2)", dbg_reigai); //#endif } return(true); }
/// <summary> /// コンピューターの思考の開始だぜ☆(^▽^) /// ここが入り口だぜ☆(^~^) /// /// 最善手は yomisuji[0] に入っているぜ☆(^▽^) /// </summary> /// <returns></returns> public static bool TryFail_Go(StringBuilder hyoji) { tmp_bestHyokaSu.Clear(); if (PureMemory.gky_ky.shogiban.yomiIbashoBan_yoko.IsEmpty(Med_Koma.KomasyuruiAndTaikyokusyaToKoma(Komasyurui.R, PureMemory.kifu_teban))) { // 自分のらいおんがいない局面の場合、投了☆ #if DEBUG PureMemory.tnsk_syuryoRiyu = TansakuSyuryoRiyu.JibunRaionInai; PureMemory.tnsk_kohoMove = Move.Toryo; tmp_bestHyokaSu.tumeSu = Conv_Tumesu.Stalemate; #endif } else { //──────────────────────────────────────── // 反復深化ループ☆(^~^) //──────────────────────────────────────── Move currMove = Move.Toryo; tmp_currHyokaSu.Clear(); for (HanpukuSinka.happaenoFukasa = 1; // まだ思考に時間を使っていい !ComSettei.timeManager.IsTimeOver_IterationDeeping() ; HanpukuSinka.happaenoFukasa++) { Debug.Assert(0 <= HanpukuSinka.happaenoFukasa && HanpukuSinka.happaenoFukasa < PureMemory.ssss_moveList.Length, ""); if (ComSettei.saidaiFukasa < HanpukuSinka.happaenoFukasa) { // 最大深さを超えた場合 Util_Joho.JohoMatome( HanpukuSinka.happaenoFukasa, tmp_bestHyokaSu, hyoji #if DEBUG , "SaidaiFukasaGoe" #endif ); break; } // ここでは現在の局面に盤面を戻してあると思えだぜ☆(^~^) Debug.Assert(1 <= HanpukuSinka.happaenoFukasa && HanpukuSinka.happaenoFukasa < PureMemory.ssss_moveList.Length, ""); ComSettei.SetSikoJikan_KonkaiNoTansaku();//思考時間(ランダム込み)を確定させるぜ☆(^~^) PureMemory.SetTnskHyoji(hyoji); //カウントダウン式の数字☆(^▽^) 反復深化探索の1週目は 1、2週目は 2 だぜ☆(^▽^) PureMemory.SetTnskFukasa(HanpukuSinka.happaenoFukasa); Tansaku_( out currMove, out tmp_currHyokaSu// 相手番の指し手の評価値が入ってくるぜ☆(^~^) ); // TODO: 1手も読めていなければ、さっさと投了したいぜ☆(^~^) if (tmp_currHyokaSu.isHaki) { // 時間切れ等の中途半端探索のとき☆ // この計算結果は、無視するぜ☆(^~^) // ここに来るときは探索終了だぜ☆(^~^) break;// 読みを終了しようなんだぜ☆ } else { // 更新☆(^▽^) PureMemory.tnsk_itibanFukaiNekkoKaranoFukasa_JohoNoTameni = HanpukuSinka.happaenoFukasa; PureMemory.tnsk_kohoMove = currMove; tmp_bestHyokaSu.ToSet(tmp_currHyokaSu); if (Conv_Tumesu.CatchRaion == tmp_bestHyokaSu.tumeSu) { // 「0手詰められ」が返ってきているなら、負けました、をいう場面だぜ☆ #if DEBUG PureMemory.tnsk_syuryoRiyu = TansakuSyuryoRiyu.Minus2TeTumerare; #endif break;// 読みを終了しようなんだぜ☆ } } }//ループ // ストップウォッチ ComSettei.timeManager.stopwatch_Tansaku.Stop(); } //──────────────────────────────────────── // 詰め、詰められ //──────────────────────────────────────── { Util_Taikyoku.Update( tmp_bestHyokaSu, PureMemory.kifu_teban ); } //──────────────────────────────────────── // 指し手は決まった☆(^~^) // 指して、局面を進めておくぜ☆(^~^) //──────────────────────────────────────── // 何これ if (DoMoveOpe.TryFailDoMoveAll( PureMemory.tnsk_kohoMove, MoveType.N00_Karappo #if DEBUG , PureSettei.fenSyurui , (IDebugMojiretu)hyoji , true//アサート抑制 , "TryFail_Go(1)" #endif )) { return(Pure.FailTrue("GenkyokuOpe.Try_DoMove(1)")); } // 手番を進めるぜ☆(^~^) MoveGenAccessor.AddKifu(PureMemory.tnsk_kohoMove, MoveType.N00_Karappo, PureMemory.dmv_ks_c); #if DEBUG Util_Tansaku.Snapshot("Go(1)確定指し", PureMemory.tnsk_kohoMove); #endif // 指し手が決まったときにも、強制情報表示 { if (0 == PureMemory.tnsk_itibanFukaiNekkoKaranoFukasa_JohoNoTameni) { #if DEBUG hyoji.AppendLine($@"0手投了してないかだぜ☆?(^~^) tansakuSyuryoRiyu=[{PureMemory.tnsk_syuryoRiyu}] Option_Application.Optionlist.SaidaiFukasa=[{ComSettei.saidaiFukasa}] Option_Application.Optionlist.SikoJikan_KonkaiNoTansaku=[{ComSettei.sikoJikan_KonkaiNoTansaku}] Option_Application.Optionlist.SikoJikan=[{ComSettei.sikoJikan}] Option_Application.Optionlist.SikoJikanRandom=[{ComSettei.sikoJikanRandom}] "); return(Pure.FailTrue("0手投了")); #endif } } #if DEBUG hyoji.AppendLine(string.Format("bestMove: [{0}] ss={1}", PureMemory.tnsk_kaisiTeme, SpkMove.ToString_Fen(PureSettei.fenSyurui, PureMemory.tnsk_kohoMove) )); #endif return(Pure.SUCCESSFUL_FALSE); }