Example #1
0
        /// <summary>
        /// Go する前に☆(^~^)
        /// </summary>
        public static void PreGo()
        {
            PureMemory.tnsk_itibanFukaiNekkoKaranoFukasa_JohoNoTameni = 0; // 読み筋情報に表示するための、読み終わった、一番深い根っこからの深さを覚えておくものだぜ☆(^▽^)
            // カウンターをクリアだぜ☆(^▽^)
            PureMemory.tnsk_tyakusyuEdas = 0;
            PureMemory.tnsk_kohoMove     = Move.Toryo;

            // ストップウォッチ
            ComSettei.timeManager.RestartStopwatch_Tansaku();
            ComSettei.timeManager.lastJohoTime = 0;

            // ループに入ると探索開始時にセットするんだが、最初の1回はループに入るために、何か設定しておく必要があるぜ☆(*^~^*)
            ComSettei.SetSikoJikan_KonkaiNoTansaku();

            PureMemory.InitTansaku();

#if DEBUG
            PureMemory.tnsk_syuryoRiyu = TansakuSyuryoRiyu.Kaisi;
#endif
        }
Example #2
0
        /// <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);
        }