示例#1
0
        /// <summary>
        /// 定跡更新(ゲームセクション内)
        /// </summary>
        public static void Update2_JosekiToroku(Move bestMove, Hyokati bestHyokati, Kyokumen ky, StringBuilder syuturyoku)
        {
            if (Util_Machine.IsEnableBoardSize() && Option_Application.Optionlist.JosekiRec)
            {
                if (!IsJosekiTraced)// 定跡を使った指し手ではない場合に限り
                {
#if DEBUG
                    // 指し手の整合性をチェックしておきたいぜ☆(^▽^)
                    {
                        Kyokumen ky_forAssert = new Kyokumen();
                        int      caret_2      = 0;
                        if (!ky_forAssert.ParsePositionvalue(Option_Application.Optionlist.USI, KyFen_before, ref caret_2, true, false, out string moves, syuturyoku)) // ビットボードを更新したいので、適用する
                        {
                            syuturyoku.AppendLine("パースに失敗だぜ☆(^~^)! #鯰");
                            var msg = syuturyoku.ToString();
                            syuturyoku.Clear();
                            Logger.Flush(msg);
                            throw new Exception(msg);
                        }

                        if (!ky_forAssert.CanDoMove(bestMove, out MoveMatigaiRiyu riyu))
                        {
                            StringBuilder reigai1 = new StringBuilder();
                            reigai1.AppendLine("指せない指し手を定跡に登録しようとしたぜ☆(^~^)!:");
                            // reigai1.Append("理由:"); ConvMove.SetumeiLine(riyu, reigai1);
                            reigai1.Append("指し手:"); ConvMove.SetumeiLine(Option_Application.Optionlist.USI, bestMove, reigai1);
                            reigai1.Append("定跡にする1手前の局面 ("); reigai1.Append(KyFen_before); reigai1.AppendLine(")");
                            Util_Information.Setumei_Lines_Kyokumen(ky_forAssert, reigai1);
                            reigai1.AppendLine();
                            reigai1.Append("1手後は、現局面");
                            Util_Information.Setumei_Lines_Kyokumen(ky, reigai1);
                            syuturyoku.AppendLine(reigai1.ToString());
                            var msg = syuturyoku.ToString();
                            syuturyoku.Clear();
                            Logger.Flush(msg);
                            throw new Exception(msg);
                        }
                    }
#endif

                    Option_Application.Joseki.AddMove(KyFen_before, KyHash_before, OptionalPhaseBeforeMove, bestMove, bestHyokati, Util_Tansaku.NekkoKaranoFukasa, Util_Application.VERSION, syuturyoku);
                }
            }
        }
示例#2
0
        /// <summary>
        /// 定跡局面の中で、評価値が一番高い指し手を返すぜ☆(^▽^)
        /// </summary>
        /// <param name="ky"></param>
        /// <returns>なければ投了☆</returns>
        public Move GetMove(bool isSfen, Kyokumen ky, out Hyokati out_bestHyokati, StringBuilder syuturyoku
#if DEBUG
                            , out string fen_forTest
#endif
                            )
        {
            Move bestMove = Move.Toryo;

            out_bestHyokati = Hyokati.TumeTesu_GohosyuNasi;
            int bestFukasa = 0;

#if DEBUG
            fen_forTest = "";
#endif

            //Util_Machine.Assert_KyokumenSeigosei_SabunKosin("ゲット指し手 #鯨",true);
            ulong hash = ky.KyokumenHash.Value;
            if (this.KyItems.ContainsKey(hash))
            {
                JosekiKyokumen josekyKy = this.KyItems[hash];
                // 整合性の確認用だぜ☆(^~^)
#if DEBUG
                fen_forTest = josekyKy.Fen;
#endif
                foreach (KeyValuePair <Move, JosekiMove> entry in josekyKy.SsItems)
                {
                    if (out_bestHyokati < entry.Value.Hyokati)// 評価値が高い指し手を選ぶぜ☆(^▽^)
                    {
                        bestMove        = entry.Key;
                        out_bestHyokati = entry.Value.Hyokati;
                        bestFukasa      = entry.Value.Fukasa;
                    }
                    else if (out_bestHyokati == entry.Value.Hyokati && //評価値が同じ場合は、
                             bestFukasa < entry.Value.Fukasa           //深く読んでいる指し手を選ぶぜ☆(^▽^)
                             )
                    {
                        bestMove        = entry.Key;
                        out_bestHyokati = entry.Value.Hyokati;
                        bestFukasa      = entry.Value.Fukasa;
                    }
                }
            }

#if DEBUG
            // 指し手の整合性をチェックしておきたいぜ☆(^▽^)
            {
                Kyokumen      ky_forAssert = new Kyokumen();
                int           caret        = 0;
                StringBuilder sindan1      = new StringBuilder();
                ky.AppendFenTo(Option_Application.Optionlist.USI, sindan1);
                //if (!ky2.ParseFen(sindan1.ToString(), ref caret, false, syuturyoku))
                if (!ky_forAssert.ParsePositionvalue(isSfen, sindan1.ToString(), ref caret, true, false, out string moves, syuturyoku))// ビットボードを更新したいので、適用する
                {
                    syuturyoku.AppendLine("取得: パースに失敗だぜ☆(^~^)! #鰯");
                    var msg = syuturyoku.ToString();
                    syuturyoku.Clear();
                    Logger.Flush(msg);
                    throw new Exception(msg);
                }

                if (!ky_forAssert.CanDoMove(bestMove, out MoveMatigaiRiyu riyu))
                {
                    StringBuilder sindan2 = new StringBuilder();
                    sindan2.Append("取得: 指せない指し手を定跡から取り出そうとしたぜ☆(^~^)!:");
                    // sindan2.Append("理由:"); ConvMove.SetumeiLine(riyu,sindan2);
                    sindan2.Append("指し手:"); ConvMove.SetumeiLine(isSfen, bestMove, sindan2);
                    sindan2.Append("定跡局面 ("); ky_forAssert.AppendFenTo(Option_Application.Optionlist.USI, sindan2); sindan2.AppendLine(")");
                    Util_Information.Setumei_Lines_Kyokumen(ky_forAssert, sindan2);

                    //str2.AppendLine("以下、定跡メモリのダンプ");
                    //str2.AppendLine("┌──────────┐");
                    //str2.Append(this.ToString());
                    //str2.AppendLine("└──────────┘");

                    syuturyoku.AppendLine(sindan2.ToString());
                    var msg = syuturyoku.ToString();
                    syuturyoku.Clear();
                    Logger.Flush(msg);
                    throw new Exception(sindan2.ToString());
                }
            }
#endif

            return(bestMove);
        }