Exemplo n.º 1
0
        /// <summary>
        /// 駒の利き
        /// </summary>
        /// <param name="bbItiran_kikiZenbu"></param>
        /// <param name="bbItiran_kikiKomabetu"></param>
        /// <param name="syuturyoku"></param>
        public static void HyojiKomanoKiki(Shogiban shogiban, StringBuilder syuturyoku)
        {
            Debug.Assert(shogiban.IsActiveBBKiki(), "");

            // 利き全部
            {
                syuturyoku.AppendLine("利き(全部)");
                Bitboard[] bbHairetu = new Bitboard[Conv_Taikyokusya.AllOptionalPhaseList.Length];
                foreach (var optionalPhase65 in Conv_Taikyokusya.AllOptionalPhaseList)
                {
                    bbHairetu[OptionalPhase.IndexOf(optionalPhase65)] = shogiban.GetBBKikiZenbu(optionalPhase65);
                }
                Setumei_Bitboards(Conv_Taikyokusya.NamaeItiran, bbHairetu, syuturyoku);
            }
            // 駒別
            {
                syuturyoku.AppendLine("利き(駒別)");
                foreach (var optionalPhase74 in Conv_Taikyokusya.AllOptionalPhaseList)// 対局者1、対局者2
                {
                    // 盤上
                    Bitboard[] bbHairetu = new Bitboard[Conv_Komasyurui.Itiran.Length];
                    foreach (Komasyurui ks in Conv_Komasyurui.Itiran)
                    {
                        bbHairetu[(int)ks] = shogiban.GetBBKiki(Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, optionalPhase74));
                    }

                    Setumei_Bitboards(Med_Koma.GetKomasyuruiNamaeItiran(optionalPhase74), bbHairetu, syuturyoku);
                }
            }
        }
Exemplo n.º 2
0
        public static void Update(Hyokati hyokati, Option <Phase> optionalPhase, int teme)
        {
            var phaseIndex = OptionalPhase.IndexOf(optionalPhase);

            if (Conv_Hyokati.InTumeTesu(hyokati))
            {
                // 詰め手数が表示されているぜ☆

                if (Util_Taikyoku.PNNantedume_Teme[phaseIndex] == int.MaxValue)
                {
                    // 詰め手数が新たに表示されたようだぜ☆
                    Util_Taikyoku.PNNantedume_Teme[phaseIndex] = teme;
                }
                // 前から表示されていたのなら、そのままだぜ☆(^▽^)
            }
            else
            {
                // 詰め手数は、表示されていないぜ☆

                if (Util_Taikyoku.PNNantedume_Teme[phaseIndex] != int.MaxValue)
                {
                    // 詰め手数が消えたようだぜ☆
                    Util_Taikyoku.PNNantedume_Teme[phaseIndex] = int.MaxValue;
                }
                // もともと表示されていなかったのなら、そのままだぜ☆(^▽^)
            }
        }
Exemplo n.º 3
0
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public static ulong GetTaikyokusyaKey(Option <Phase> optionalPhase, Kyokumen.Sindanyo kys)
        {
            if (Util_ZobristHashing.Dirty)
            {
                Util_ZobristHashing.Tukurinaosi(kys);
            }

            return(Util_ZobristHashing.m_tbTaikyokusya_[OptionalPhase.IndexOf(optionalPhase)]);
        }
Exemplo n.º 4
0
        /// <summary>
        /// コンピューター思考中表示☆(^~^)
        /// </summary>
        public static void AppendMessage_ComputerSikochu(Kyokumen ky, StringBuilder syuturyoku)
        {
#if DEBUG
            syuturyoku.Append("**デバッグ・モード** ");//注意喚起☆(^▽^)
#endif
            Conv_Taikyokusya.Setumei_Name(ky.CurrentOptionalPhase, syuturyoku);
            syuturyoku.Append("(");
            syuturyoku.Append(Option_Application.Optionlist.PNChar[OptionalPhase.IndexOf(ky.CurrentOptionalPhase)].ToString());
            syuturyoku.Append(")の思考中(^~^)");
            Logger.Flush(syuturyoku.ToString());
            syuturyoku.Clear();
        }
Exemplo n.º 5
0
        public static void Assert_Sabun_Kiki(string message, Kyokumen.Sindanyo kys)
        {
            // 駒の利き☆
            bool safe = true;

            // 再計算 Recalculate
            Shogiban saikeisan = new Shogiban(kys);

            saikeisan.Tukurinaosi_1_Clear_KikiKomabetu();
            saikeisan.Tukurinaosi_2_Input_KikiKomabetu(kys);

            foreach (var optionalPhase in Conv_Taikyokusya.AllOptionalPhaseList) // 対局者1、対局者2
            {
                int iKm = 0;                                                     //どの駒でエラーがあったか
                foreach (Koma km in Conv_Koma.ItiranTai[OptionalPhase.IndexOf(optionalPhase)])
                {
                    if (!kys.EqualsKiki(km, saikeisan))//現行版と、再計算版の比較
                    {
                        safe = false;
                        break;
                    }
                    iKm++;
                }

                // ダイアログボックスに収まるように分けるぜ☆
                if (!safe)
                {
                    StringBuilder sindan1 = new StringBuilder();

                    //// 参考:駒の居場所
                    //{
                    //    sindan1.Append(message);
                    //    sindan1.AppendLine("参考:駒の居場所");
                    //    Util_Information.HyojiKomanoIbasho(ky.BB_KomaZenbu, ky.BB_Koma, sindan1);
                    //    sindan1.AppendLine($"Util_Tansaku.TansakuTyakusyuEdas=[{Util_Tansaku.TansakuTyakusyuEdas}]");
                    //}

                    sindan1.Append(message); sindan1.Append("【エラー】"); Conv_Taikyokusya.Setumei_Name(optionalPhase, sindan1); sindan1.AppendLine();
                    sindan1.AppendLine($"iKm=[{iKm}]");

                    sindan1.AppendLine("利き:(再計算)");
                    Util_Information.Setumei_Bitboards(Med_Koma.GetKomasyuruiNamaeItiran(optionalPhase), saikeisan.WhereBBKiki(optionalPhase), sindan1);

                    kys.Setumei_GenkoKiki(optionalPhase, sindan1); // 利き:(現行)

                    var msg = sindan1.ToString();
                    sindan1.Clear();
                    Logger.Flush(msg);
                    Debug.Assert(safe, msg);
                }
            }
        }
Exemplo n.º 6
0
 public static void AppendLine_Data_Countboard(Shogiban sg, int ms_hidariHasi, StringBuilder syuturyoku)
 {
     for (int iTai = 0; iTai < Conv_Taikyokusya.AllOptionalPhaseList.Length; iTai++)
     {
         syuturyoku.Append("│");
         for (int iMs_offset = 0; iMs_offset < Option_Application.Optionlist.BanYokoHaba; iMs_offset++)
         {
             int kikisuZenbu = sg.CountKikisuZenbu(OptionalPhase.From(iTai), (Masu)(ms_hidariHasi + iMs_offset));
             syuturyoku.Append(0 < kikisuZenbu ? string.Format(" {0,2} ", kikisuZenbu) : "  ");
             syuturyoku.Append("│");
         }
     }
     syuturyoku.AppendLine();
 }
Exemplo n.º 7
0
        /// <summary>
        /// 駒の利き数☆(^~^)
        /// </summary>
        /// <returns></returns>
        public static void HyojiKomanoKikiSu(Shogiban shogiban, StringBuilder syuturyoku)
        {
            //, KikisuKomabetuCountboardItiran kikiKomabetuCB
            // KikisuZenbuCountboardItiran kikiZenbuCB

            syuturyoku.AppendLine("重ね利き数全部");
            // 対局者別 全部
            {
                // 見出し
                Setumei_Headers(Conv_Taikyokusya.NamaeItiran, syuturyoku);

                Util_Information.AppendLine_Top_Kyokumen(Conv_Taikyokusya.AllOptionalPhaseList.Length, syuturyoku); // ┌──┬──┬──┐みたいな線☆
                for (int dan = 0; dan < Option_Application.Optionlist.BanTateHaba; dan++)
                {
                    AppendLine_Data_Countboard(shogiban, dan * Option_Application.Optionlist.BanYokoHaba, syuturyoku);

                    if (dan + 1 < Option_Application.Optionlist.BanTateHaba)
                    {
                        Util_Information.AppendLine_Middle(Conv_Taikyokusya.AllOptionalPhaseList.Length, syuturyoku); // ├──┼──┼──┤みたいな線☆
                    }
                }
                Util_Information.AppendLine_Bottom(Conv_Taikyokusya.AllOptionalPhaseList.Length, syuturyoku); // └──┴──┴──┘みたいな線☆
            }
            // 駒別
            foreach (var optionalPhase29 in Conv_Taikyokusya.AllOptionalPhaseList) // 対局者1、対局者2
            {
                foreach (Koma km in Conv_Koma.ItiranTai[OptionalPhase.IndexOf(optionalPhase29)])
                {
                    syuturyoku.Append(Util_Information.FormatBanWidthZenkaku(Conv_Koma.GetName(km)));
                }
                syuturyoku.AppendLine();

                Util_Information.AppendLine_Top_Kyokumen(Conv_Komasyurui.Itiran.Length, syuturyoku);

                for (int dan = 0; dan < Option_Application.Optionlist.BanTateHaba; dan++)
                {
                    AppendLine_Data_Countboard(optionalPhase29, shogiban, dan * Option_Application.Optionlist.BanYokoHaba, syuturyoku);

                    if (dan + 1 < Option_Application.Optionlist.BanTateHaba)
                    {
                        Util_Information.AppendLine_Middle(Conv_Komasyurui.Itiran.Length, syuturyoku);
                    }
                }
                Util_Information.AppendLine_Bottom(Conv_Komasyurui.Itiran.Length, syuturyoku);
            }
        }
Exemplo n.º 8
0
        /// <summary>
        /// 局面に点数を付けるぜ☆(^▽^)
        ///
        /// どちらの対局者でも、自分に有利と思っていれば正の数の方向に点数が付くぜ☆(^▽^)
        /// </summary>
        /// <param name="ky_base"></param>
        /// <returns></returns>
        public void Tukurinaosi(Kyokumen.Sindanyo kys)
        {
            Hyokati[] hyokati = new Hyokati[] { Hyokati.Hyokati_Rei, Hyokati.Hyokati_Rei
                                                , Hyokati.Hyokati_Rei // 空白は手番なしで ここに入れるぜ☆(^~^)
            };

            // 盤上
            Bitboard komaBB = new Bitboard();

            for (int iTai = 0; iTai < Conv_Taikyokusya.AllOptionalPhaseList.Length; iTai++)
            {
                var optionalPhase = Conv_Taikyokusya.AllOptionalPhaseList[iTai];
                for (int iKs = 0; iKs < Conv_Komasyurui.Itiran.Length; iKs++)
                {
                    Komasyurui ks = Conv_Komasyurui.Itiran[iKs];

                    kys.ToSetIbasho(Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, optionalPhase), komaBB);
                    while (komaBB.Ref_PopNTZ(out Masu ms_jissai))
                    {
                        hyokati[iTai] += Conv_Koma.BanjoKomaHyokatiNumber[(int)Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, optionalPhase)];
                    }
                }
            }

            // 持ち駒
            foreach (MotiKoma mk in Conv_MotiKoma.Itiran)
            {
                var            optionalPhase = Med_Koma.MotiKomaToPhase(mk);
                var            phaseIndex    = OptionalPhase.IndexOf(optionalPhase);
                MotiKomasyurui mks           = Med_Koma.MotiKomaToMotiKomasyrui(mk);
                Hyokati        komaHyokati   = Conv_Hyokati.KomaHyokati[(int)Med_Koma.MotiKomasyuruiAndPhaseToKoma(mks, optionalPhase)];

                hyokati[phaseIndex] += (int)komaHyokati * kys.CountMotikoma(mk);
            }

            // 手番 - 相手番
            Hyokati hyokatiP1 = hyokati[(int)Phase.Black];

            hyokati[(int)Phase.Black] -= hyokati[(int)Phase.White];
            hyokati[(int)Phase.White] -= hyokatiP1;
            KomawariHyokati_Sabun      = hyokati;
        }
Exemplo n.º 9
0
        public Task <bool> CreateConvertTask(CancellationToken cancellationToken, string mkvPath = null)
        {
            if (!string.IsNullOrWhiteSpace(mkvPath))
            {
                Job.OutputPath = mkvPath;
            }

            var token          = cancellationToken;
            var muxPhase       = new CriticalPhase(() => Mux(token));
            var optionalPhases = new OptionalPhase[] { () => PostProcess(token) };

            return(CreateStageTask(
                       token,
                       ConvertStart,
                       muxPhase,
                       optionalPhases,
                       ConvertFail,
                       ConvertSucceed
                       ));
        }
Exemplo n.º 10
0
        /// <summary>
        /// 現局面の盤上、駒台に置いてある駒を 駒の種類別に数え、
        /// 片方の対局者の駒台に全部乗れるよう、拡張する。
        /// </summary>
        public static void Tukurinaosi(Kyokumen.Sindanyo kys)
        {
            // 盤上
            m_banjoKeys_ = new ulong[kys.MASU_YOSOSU, Conv_Koma.Itiran.Length];
            for (int iMs = 0; iMs < kys.MASU_YOSOSU; iMs++)
            {
                foreach (Komasyurui ks in Conv_Komasyurui.Itiran)
                {
                    // 対局者1
                    m_banjoKeys_[iMs, (int)Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, OptionalPhase.Black)] = (ulong)(Option_Application.Random.NextDouble() * ulong.MaxValue);
                    // 対局者2
                    m_banjoKeys_[iMs, (int)Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, OptionalPhase.White)] = (ulong)(Option_Application.Random.NextDouble() * ulong.MaxValue);
                }
            }

            // 持ち駒
            {
                m_motiKeys_ = new ulong[Conv_MotiKoma.Itiran.Length][];

                int[] counts = kys.CountMotikomaHashSize();
                foreach (MotiKoma mk in Conv_MotiKoma.Itiran)
                {
                    MotiKomasyurui mks = Med_Koma.MotiKomaToMotiKomasyrui(mk);
                    m_motiKeys_[(int)mk] = new ulong[counts[(int)mks]];
                    for (int iCount = 0; iCount < counts[(int)mks]; iCount++)
                    {
                        m_motiKeys_[(int)mk][iCount] = (ulong)(Option_Application.Random.NextDouble() * ulong.MaxValue);
                    }
                }
            }

            // 手番
            m_tbTaikyokusya_ = new ulong[Conv_Taikyokusya.AllOptionalPhaseList.Length];
            foreach (var optionalPhase78 in Conv_Taikyokusya.AllOptionalPhaseList)
            {
                m_tbTaikyokusya_[OptionalPhase.IndexOf(optionalPhase78)] = (ulong)(Option_Application.Random.NextDouble() * ulong.MaxValue);
            }

            Dirty = false;
        }
Exemplo n.º 11
0
        public static void InLoop_SeisekiKosin(Move ss_after, Kyokumen ky, StringBuilder syuturyoku)
        {
            if (Option_Application.Optionlist.SeisekiRec)// 今回指した手全てに、成績を付けたいぜ☆(^~^)
            {
                int teme = ky.Konoteme.ScanNantemadeBango();
                if (Util_Taikyoku.PNNantedume_Teme[OptionalPhase.IndexOf(ky.CurrentOptionalPhase)] <= teme)
                {
                    // 何手詰め、何手詰められ の表記が出て以降の成績を記録するぜ☆(^~^)

                    // 一手前の局面と、指したあとの指し手で成績更新☆(^▽^)
                    Conv_Seiseki.ResultToCount(ky.CurrentOptionalPhase, Util_Application.Result(ky), out int kati, out int hikiwake, out int make);

                    StringBuilder kyMojiretu = new StringBuilder();
                    ky.AppendFenTo(Option_Application.Optionlist.USI, kyMojiretu);
                    Option_Application.Seiseki.AddMove(
                        kyMojiretu.ToString(),
                        ky.KyokumenHash.Value,
                        ky.CurrentOptionalPhase,
                        ss_after,
                        Util_Application.VERSION,
                        kati,
                        hikiwake,
                        make
                        );
                    syuturyoku.Append("|");
                    Logger.Flush(syuturyoku.ToString());
                    syuturyoku.Clear();
                }
                else
                {
                    syuturyoku.Append(".");
                    Logger.Flush(syuturyoku.ToString());
                    syuturyoku.Clear();
                }
            }//成績の記録☆
        }
Exemplo n.º 12
0
        /// <summary>
        /// 駒の居場所
        /// </summary>
        /// <param name="syuturyoku"></param>
        public static void HyojiKomanoIbasho(Shogiban shogiban, StringBuilder syuturyoku)
        {
            //IbasyoKomabetuBitboardItiran bb_koma,
            //  KomaZenbuIbasyoBitboardItiran bb_komaZenbu
            syuturyoku.AppendLine("駒の居場所");

            // 駒全部☆
            {
                Setumei_Bitboards(new string[] { "対局者1", "対局者2" },
                                  new Bitboard[] {
                    shogiban.GetBBKomaZenbu(OptionalPhase.Black),
                    shogiban.GetBBKomaZenbu(OptionalPhase.White)
                }, syuturyoku);
                syuturyoku.AppendLine();
            }

            foreach (var optionalPhase81 in Conv_Taikyokusya.AllOptionalPhaseList)// 対局者1、対局者2
            {
                // 見出し
                foreach (Koma km in Conv_Koma.ItiranTai[OptionalPhase.IndexOf(optionalPhase81)])
                {
                    syuturyoku.Append(FormatBanWidthZenkaku(Conv_Koma.GetName(km)));
                }
                syuturyoku.AppendLine();

                // 盤
                Bitboard[] bbHairetu = new Bitboard[Conv_Komasyurui.Itiran.Length];
                int        i         = 0;
                foreach (Komasyurui ks in Conv_Komasyurui.Itiran)
                {
                    bbHairetu[i] = shogiban.GetBBKoma(Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, optionalPhase81));
                    i++;
                }
                Setumei_Bitboards(bbHairetu, syuturyoku);
            }
        }
Exemplo n.º 13
0
 public static void TusinYo(Option <Phase> optionalPhase, StringBuilder syuturyoku)
 {
     syuturyoku.Append(Conv_Taikyokusya.m_tusinYo_[OptionalPhase.IndexOf(optionalPhase)]);
 }
Exemplo n.º 14
0
        public static string ToFen(bool isSfen, Option <Phase> optionalPhase)
        {
            var phaseIndex = OptionalPhase.IndexOf(optionalPhase);

            return(isSfen ? Conv_Taikyokusya.m_sfen_[phaseIndex] : Conv_Taikyokusya.m_dfen_[phaseIndex]);
        }
Exemplo n.º 15
0
 public void Increase(Option <Phase> optionalPhase, Hyokati henkaRyo)
 {
     this.KomawariHyokati_Sabun[OptionalPhase.IndexOf(optionalPhase)] += (int)henkaRyo;
 }
Exemplo n.º 16
0
 public Hyokati Get(Option <Phase> phase)
 {
     return(this.KomawariHyokati_Sabun[OptionalPhase.IndexOf(phase)]);
 }
Exemplo n.º 17
0
 public static string[] GetKomasyuruiNamaeItiran(Option <Phase> optionalPhase)
 {
     return(komasyuruiNamaeItiran[OptionalPhase.IndexOf(optionalPhase)]);
 }
Exemplo n.º 18
0
 public static Koma KomasyuruiAndTaikyokusyaToKoma(Komasyurui ks, Option <Phase> optionalPhase)
 {
     return(Med_Koma.m_KomasyuruiAndTaikyokusyaToKoma_[(int)ks, OptionalPhase.IndexOf(optionalPhase)]);
 }
Exemplo n.º 19
0
        public Task<bool> CreateConvertTask(CancellationToken cancellationToken, string mkvPath = null)
        {
            if (!string.IsNullOrWhiteSpace(mkvPath))
                Job.OutputPath = mkvPath;

            var token = cancellationToken;
            var muxPhase = new CriticalPhase(() => Mux(token));
            var optionalPhases = new OptionalPhase[] { () => PostProcess(token) };
            return CreateStageTask(
                token,
                ConvertStart,
                muxPhase,
                optionalPhases,
                ConvertFail,
                ConvertSucceed
            );
        }
Exemplo n.º 20
0
 public static string GetKomasyuruiNamae(Option <Phase> optionalPhase, Komasyurui ks)
 {
     return(komasyuruiNamaeItiran[OptionalPhase.IndexOf(optionalPhase)][(int)ks]);
 }
Exemplo n.º 21
0
 public static MotiKoma MotiKomasyuruiAndPhaseToMotiKoma(MotiKomasyurui mks, Option <Phase> phase)
 {
     return(m_MotiKomasyuruiAndPhaseToMotiKoma_[(int)mks, OptionalPhase.IndexOf(phase)]);
 }
Exemplo n.º 22
0
 public static Koma MotiKomasyuruiAndPhaseToKoma(MotiKomasyurui mks, Option <Phase> optionalPhase)
 {
     return(Med_Koma.m_MotiKomasyuruiAndPhaseToKoma_[(int)mks, OptionalPhase.IndexOf(optionalPhase)]);
 }
Exemplo n.º 23
0
        public static bool IsOk(Option <Phase> optionalPhase)
        {
            var phaseIndex = OptionalPhase.IndexOf(optionalPhase);

            return((int)Phase.Black <= phaseIndex && phaseIndex <= (int)Phase.White);
        }
Exemplo n.º 24
0
        /// <summary>
        /// トライできる先。
        /// </summary>
        /// <param name="ky">局面</param>
        /// <param name="kikiBB">手番らいおんの利きビットボード</param>
        /// <param name="tb">手番</param>
        /// <param name="ms1">手番らいおんがいる升</param>
        /// <returns></returns>
        public static Bitboard GetTrySaki(Kyokumen ky, Bitboard kikiBB, Option <Phase> optionalPhase, Masu ms1, StringBuilder syuturyoku)
        {
            var phaseIndex = OptionalPhase.IndexOf(optionalPhase);

            Util_Test.AppendLine("テスト: トライルール", syuturyoku);
            m_trySakiBB_.Clear();

            // 自分はN段目にいる☆
            int  dan     = Conv_Masu.ToDan_JibunSiten(optionalPhase, ms1, ky.Sindan);
            bool nidanme = 2 == dan;

            Util_Test.AppendLine("2段目にいるか☆?[{ nidanme }] わたしは[{ dan }]段目にいるぜ☆", syuturyoku);
            if (!nidanme)
            {
                Util_Test.AppendLine("むりだぜ☆", syuturyoku);
                Util_Test.Flush(syuturyoku);
                return(m_trySakiBB_);
            }

            // 1段目に移動できる升☆

            m_trySakiBB_.Set(kikiBB);
            m_trySakiBB_.Select(ky.BB_Try[phaseIndex]);
            Util_Test.TestCode((StringBuilder syuturyoku2) =>
            {
                Util_Information.Setumei_Bitboards(new string[] { "らいおんの利き", "1段目に移動できる升" },
                                                   new Bitboard[] { kikiBB, m_trySakiBB_ }, syuturyoku2);
            });

            // 味方の駒がないところ☆
            Bitboard spaceBB = new Bitboard();

            spaceBB.Set(ky.BB_BoardArea);
            spaceBB.Sitdown(ky.Shogiban.GetBBKomaZenbu(optionalPhase));
            m_trySakiBB_.Select(spaceBB);
            Util_Test.TestCode((StringBuilder str) =>
            {
                Util_Information.Setumei_Bitboards(new string[] { "味方駒無い所", "トライ先" },
                                                   new Bitboard[] { spaceBB, m_trySakiBB_ }, str);
            });
            if (m_trySakiBB_.IsEmpty())
            {
                Util_Test.AppendLine("むりだぜ☆", syuturyoku);
                Util_Test.Flush(syuturyoku);
                return(m_trySakiBB_);
            }

            // 相手の利きが届いていないところ☆
            var      optionalOpponent2 = Conv_Taikyokusya.Reverse(optionalPhase);
            Bitboard safeBB            = new Bitboard();

            safeBB.Set(ky.BB_BoardArea);
            ky.Shogiban.ToSitdown_BBKikiZenbu(optionalOpponent2, safeBB);
            m_trySakiBB_.Select(safeBB);
            Util_Test.TestCode((StringBuilder syuturyoku2) =>
            {
                Util_Information.Setumei_Bitboards(new string[] { "相手利き無い所", "トライ先" },
                                                   new Bitboard[] { safeBB, m_trySakiBB_ }, syuturyoku2);
            });
            if (m_trySakiBB_.IsEmpty())
            {
                Util_Test.AppendLine("むりだぜ☆", syuturyoku);
                Util_Test.Flush(syuturyoku);
                return(m_trySakiBB_);
            }

            Util_Test.AppendLine("トライできるぜ☆", syuturyoku);
            Util_Test.Flush(syuturyoku);

            return(m_trySakiBB_);
        }