/// <summary> /// 用途例:持ち駒を確認するために使います。 /// </summary> /// <param name="hkomas_gen_MOTI"></param> /// <returns></returns> public static string JsonElements_KomaHandles(bool enableLog, SkyConst src_Sky, List <int> hKomas, string comment) { StringBuilder sb = new StringBuilder(); if (!enableLog) { goto gt_EndMethod; } //sb.AppendLine(" ["); sb.AppendLine(" { act:\"colorMasu\", style:\"rgba(100,240,100,0.5)\" },"); foreach (int hKoma in hKomas) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(hKoma).Now); string komaImg = Util_GraphicalLog.Finger_ToString(src_Sky, hKoma, ""); sb.AppendLine(" { act:\"drawImg\", img:\"" + komaImg + "\", masu: " + Util_Masu.AsMasuNumber(koma.Masu) + " },");//FIXME:おかしい? } sb.AppendLine(" { act:\"drawText\", text:\"" + comment + "\" , x:0, y:20 },"); //sb.AppendLine(" ],"); gt_EndMethod: return(sb.ToString()); }
public void Log3( SkyConst src_Sky, Playerside tebanKurau, //手番(喰らう側) Playerside tebanSeme, //手番(利きを調べる側) Fingers fingers_kurau_IKUSA, //戦駒(喰らう側) Fingers fingers_kurau_MOTI, // 持駒(喰らう側) Fingers fingers_seme_IKUSA, //戦駒(利きを調べる側) Fingers fingers_seme_MOTI // 持駒(利きを調べる側) ) { // 攻め手の駒の位置 GraphicalLog_Board boardLog_clone = new GraphicalLog_Board(this.BrdMove); foreach (Finger finger in fingers_seme_IKUSA.Items) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now); Gkl_KomaMasu km = new Gkl_KomaMasu( Util_GraphicalLog.PsideKs14_ToString(tebanSeme, Haiyaku184Array.Syurui(koma.Haiyaku), ""), Util_Masu.AsMasuNumber(koma.Masu) ); boardLog_clone.KomaMasu1.Add(km); } foreach (Finger finger in fingers_kurau_IKUSA.Items) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now); this.BrdMove.KomaMasu2.Add(new Gkl_KomaMasu( Util_GraphicalLog.PsideKs14_ToString(tebanKurau, Haiyaku184Array.Syurui(koma.Haiyaku), ""), Util_Masu.AsMasuNumber(koma.Masu) )); } foreach (Finger finger in fingers_seme_MOTI.Items) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now); Gkl_KomaMasu km = new Gkl_KomaMasu( Util_GraphicalLog.PsideKs14_ToString(tebanSeme, Haiyaku184Array.Syurui(koma.Haiyaku), ""), Util_Masu.AsMasuNumber(koma.Masu) ); this.BrdMove.KomaMasu3.Add(km); } foreach (Finger finger in fingers_kurau_MOTI.Items) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now); this.BrdMove.KomaMasu4.Add(new Gkl_KomaMasu( Util_GraphicalLog.PsideKs14_ToString(tebanKurau, Haiyaku184Array.Syurui(koma.Haiyaku), ""), Util_Masu.AsMasuNumber(koma.Masu) )); } this.BrdMove = boardLog_clone; }
private static void Log1( Node <ShootingStarlightable, KyokumenWrapper> hubNode, bool enableLog, int tesumi_yomiGenTeban, string hint ) { Util_GraphicalLog.Log(enableLog, "Util_LegalMove(王手回避漏れ02)王手を回避するかどうかに関わらず、ひとまず全ての次の手", "[" + ((KifuNode)hubNode).Json_NextNodes_MultiSky( "(王手回避漏れ02." + tesumi_yomiGenTeban + "手目)", hint + "_Lv3_RMHO", tesumi_yomiGenTeban ) + "]");// ログ出力 }
/// <summary> /// ハブ・ノードの次ノード・リストをJSON化します。 /// </summary> /// <param name="enableLog"></param> /// <param name="src_Sky_base"></param> /// <param name="hubNode"></param> /// <param name="comment"></param> /// <param name="logTag"></param> /// <returns></returns> public static string JsonKyokumens_NextNodes(bool enableLog, SkyConst src_Sky_base, Node <ShootingStarlightable, KyokumenWrapper> hubNode, string comment) { StringBuilder sb = new StringBuilder(); if (!enableLog) { goto gt_EndMethod; } hubNode.Foreach_NextNodes((string key, Node <ShootingStarlightable, KyokumenWrapper> node, ref bool toBreak) => { ShootingStarlightable move = node.Key; RO_Star_Koma srcKoma1 = Util_Koma.AsKoma(move.LongTimeAgo); RO_Star_Koma dstKoma = Util_Koma.AsKoma(move.Now); Finger srcKoma2 = Util_Sky.Fingers_AtMasuNow(src_Sky_base, srcKoma1.Masu).ToFirst(); // 駒1つ PieceType ks14 = Haiyaku184Array.Syurui(dstKoma.Haiyaku); sb.AppendLine(" ["); // マスの色 sb.AppendLine(" { act:\"colorMasu\", style:\"rgba(100,240,100,0.5)\" },"); // マス sb.AppendLine(" { act:\"drawMasu\" , masu:" + Util_Masu.AsMasuNumber(dstKoma.Masu) + " },"); string komaImg = Util_GraphicalLog.Finger_ToString(src_Sky_base, srcKoma2, ""); sb.AppendLine(" { act:\"drawImg\", img:\"" + komaImg + "\", masu: " + Util_Masu.AsMasuNumber(dstKoma.Masu) + " },");//FIXME:おかしい? // コメント sb.AppendLine(" { act:\"drawText\", text:\"" + comment + "\" , x:0, y:20 },"); sb.AppendLine(" ],"); }); gt_EndMethod: return(sb.ToString()); }
/// <summary> /// 駒別マスをJSON化します。 /// </summary> /// <param name="enableLog"></param> /// <param name="src_Sky_base"></param> /// <param name="km_move"></param> /// <param name="comment"></param> /// <returns></returns> public static string JsonKyokumens_MultiKomabetuMasus(bool enableLog, SkyConst src_Sky_base, Maps_OneAndOne <Finger, SySet <SyElement> > km_move, string comment) { StringBuilder sb = new StringBuilder(); if (!enableLog) { goto gt_EndMethod; } km_move.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) => { // 駒1つ RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky_base.StarlightIndexOf(key).Now); PieceType ks14 = Haiyaku184Array.Syurui(koma.Haiyaku); sb.AppendLine(" ["); // マスの色 sb.AppendLine(" { act:\"colorMasu\", style:\"rgba(100,240,100,0.5)\" },"); // 全マス foreach (Basho masu in value.Elements) { sb.AppendLine(" { act:\"drawMasu\" , masu:" + Util_Masu.AsMasuNumber(masu) + " },"); } string komaImg = Util_GraphicalLog.Finger_ToString(src_Sky_base, key, ""); sb.AppendLine(" { act:\"drawImg\", img:\"" + komaImg + "\", masu: " + Util_Masu.AsMasuNumber(koma.Masu) + " },");//FIXME:おかしい? // コメント sb.AppendLine(" { act:\"drawText\", text:\"" + comment + "\" , x:0, y:20 },"); sb.AppendLine(" ],"); }); gt_EndMethod: return(sb.ToString()); }
/// <summary> /// a - b = c /// </summary> /// <param name="a"></param> /// <param name="b"></param> /// <param name="sbGohosyu"></param> public static Maps_OneAndOne <Finger, SySet <SyElement> > Minus_OverThereMasus( bool enableLog, SkyConst src_srcSky_forLog, Maps_OneAndOne <Finger, SySet <SyElement> > a, SySet <SyElement> b ) { Maps_OneAndOne <Finger, SySet <SyElement> > c = new Maps_OneAndOne <Finger, SySet <SyElement> >(a); foreach (Finger selfKoma in c.ToKeyList())//調べたい側の全駒 { SySet <SyElement> srcMasus = c.ElementAt(selfKoma); // a -overThere b するぜ☆ Util_GraphicalLog.Log(enableLog, "Thought_KomaAndMove Minus_OverThereMasus", "[\n" + " [\n" + Util_GraphicalLog.JsonElements_Masus(enableLog, srcMasus, "(1)引く前") + " ],\n" + "],\n" ); SySet <SyElement> minusedMasus = srcMasus.Clone(); minusedMasus.MinusMe_Opened(b); // 差替え c.AddReplace(selfKoma, minusedMasus, false);//差分に差替えます。もともと無い駒なら何もしません。 } Util_GraphicalLog.Log(enableLog, "Thought_KomaAndMove Minus_OverThereMasus", "[\n" + " [\n" + Util_GraphicalLog.JsonKyokumens_MultiKomabetuMasus(enableLog, src_srcSky_forLog, a, "(1)a") + Util_GraphicalLog.JsonElements_Masus(enableLog, b, "(2)-overThere_b") + Util_GraphicalLog.JsonKyokumens_MultiKomabetuMasus(enableLog, src_srcSky_forLog, c, "(3)=c") + " ],\n" + "],\n" ); return(c); }
public static string Finger_ToString(SkyConst src_Sky, Finger finger, string extentionWithDot) { string komaImg = ""; if ((int)finger < Finger_Honshogi.Items_KomaOnly.Length) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now); Playerside pside = koma.Pside; PieceType ks14 = Haiyaku184Array.Syurui(koma.Haiyaku); komaImg = Util_GraphicalLog.PsideKs14_ToString(pside, ks14, extentionWithDot); } else { komaImg = Util_GraphicalLog.PsideKs14_ToString(Playerside.Empty, PieceType.None, extentionWithDot); } return(komaImg); }
public void Log4( SkyConst src_Sky, Playerside tebanSeme,//手番(利きを調べる側) Maps_OneAndOne <Finger, SySet <SyElement> > kmMove_seme_IKUSA ) { // 戦駒の移動可能場所 GraphicalLog_Board boardLog_clone = new GraphicalLog_Board(this.BrdMove); kmMove_seme_IKUSA.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) => { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(key).Now); string komaImg = Util_GraphicalLog.PsideKs14_ToString(tebanSeme, Haiyaku184Array.Syurui(koma.Haiyaku), ""); foreach (Basho masu in value.Elements) { boardLog_clone.Masu_theMove.Add((int)masu.MasuNumber); } }); this.BrdMove = boardLog_clone; }
/// <summary> /// 指定された局面で、指定された手番の駒の、利きマスを算出します。 /// 持ち駒は盤上にないので、利きを調べる必要はありません。 /// /// 「手目」は判定できません。 /// /// </summary> /// <param name="kouho"></param> /// <param name="sbGohosyu"></param> /// <param name="logger"></param> public static List_OneAndMulti <Finger, SySet <SyElement> > LAAAA_GetEffect( bool enableLog, bool isHonshogi, SkyConst src_Sky, Playerside pside_genTeban3, bool isAiteban, GraphicalLog_File logF_kiki, string logBrd_caption, int yomuDeep_forLog,//脳内読み手数 int tesumi_yomiCur_forLog, ShootingStarlightable move_forLog ) { GraphicalLog_Board logBrd_kiki = new GraphicalLog_Board(); logBrd_kiki.Caption = logBrd_caption;// "利き_" logBrd_kiki.Tesumi = tesumi_yomiCur_forLog; logBrd_kiki.NounaiYomiDeep = yomuDeep_forLog; //logBrd_kiki.Score = 0.0d; logBrd_kiki.GenTeban = pside_genTeban3;// 現手番 logF_kiki.boards.Add(logBrd_kiki); // 《1》 List_OneAndMulti <Finger, SySet <SyElement> > sMs_effect = new List_OneAndMulti <Finger, SySet <SyElement> >();//盤上の駒の利き { // 《1.1》 Playerside tebanSeme; //手番(利きを調べる側) Playerside tebanKurau; //手番(喰らう側) { if (isAiteban) { tebanSeme = Converter04.AlternatePside(pside_genTeban3); tebanKurau = pside_genTeban3; } else { tebanSeme = pside_genTeban3; tebanKurau = Converter04.AlternatePside(pside_genTeban3); } if (Playerside.P1 == tebanSeme) { logBrd_kiki.NounaiSeme = Gkl_NounaiSeme.Sente; } else if (Playerside.P2 == tebanSeme) { logBrd_kiki.NounaiSeme = Gkl_NounaiSeme.Gote; } } // 《1.2》 Fingers fingers_seme_IKUSA; //戦駒(利きを調べる側) Fingers fingers_kurau_IKUSA; //戦駒(喰らう側) Fingers dust1; Fingers dust2; Util_Things.AAABAAAA_SplitGroup( out fingers_seme_IKUSA, out fingers_kurau_IKUSA, out dust1, out dust2, src_Sky, tebanSeme, tebanKurau ); // 攻め手の駒の位置 GraphicalLog_Board boardLog_clone = new GraphicalLog_Board(logBrd_kiki); foreach (Finger finger in fingers_seme_IKUSA.Items) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now); Gkl_KomaMasu km = new Gkl_KomaMasu( Util_GraphicalLog.PsideKs14_ToString(tebanSeme, Haiyaku184Array.Syurui(koma.Haiyaku), ""), Util_Masu.AsMasuNumber(koma.Masu) ); boardLog_clone.KomaMasu1.Add(km); } foreach (Finger finger in fingers_kurau_IKUSA.Items) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now); logBrd_kiki.KomaMasu2.Add(new Gkl_KomaMasu( Util_GraphicalLog.PsideKs14_ToString(tebanKurau, Haiyaku184Array.Syurui(koma.Haiyaku), ""), Util_Masu.AsMasuNumber(koma.Masu) )); } logBrd_kiki = boardLog_clone; // 《1.3》 SySet <SyElement> masus_seme_IKUSA = Converter04.Fingers_ToMasus(fingers_seme_IKUSA, src_Sky); // 盤上のマス(利きを調べる側の駒) SySet <SyElement> masus_kurau_IKUSA = Converter04.Fingers_ToMasus(fingers_kurau_IKUSA, src_Sky); // 盤上のマス(喰らう側の駒) // 駒のマスの位置は、特にログに取らない。 // 《1.4》 Maps_OneAndOne <Finger, SySet <SyElement> > kmEffect_seme_IKUSA = Util_Things.Get_KmEffect_seme_IKUSA( fingers_seme_IKUSA,//この中身がおかしい。 masus_seme_IKUSA, masus_kurau_IKUSA, src_Sky, enableLog, Converter04.MoveToStringForLog(move_forLog, pside_genTeban3) );// 利きを調べる側の利き(戦駒) // 戦駒の利き logBrd_kiki = new GraphicalLog_Board(logBrd_kiki); kmEffect_seme_IKUSA.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) => { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(key).Now); string komaImg = Util_GraphicalLog.PsideKs14_ToString(tebanSeme, Haiyaku184Array.Syurui(koma.Haiyaku), ""); foreach (Basho masu in value.Elements) { boardLog_clone.Masu_theEffect.Add((int)masu.MasuNumber); } }); logBrd_kiki = boardLog_clone; // 《1》 = 《1.4》の戦駒+持駒 sMs_effect.AddRange_New(kmEffect_seme_IKUSA); } return(sMs_effect); }
/// <summary> /// 次の枝を読みます。 /// </summary> private static void WAAAA_Read_NextBranch( MoveGenGenjo yomiGenjo, Node <ShootingStarlightable, KyokumenWrapper> hubNode_genTeban, SsssLogGenjo log ) { // (3)次のノードをシャッフルします。 List <Node <ShootingStarlightable, KyokumenWrapper> > nextNodes_shuffled = Converter04.NextNodes_ToList(hubNode_genTeban); LarabeShuffle <Node <ShootingStarlightable, KyokumenWrapper> > .Shuffle_FisherYates(ref nextNodes_shuffled); // (4)次の局面 int wideCount = 0; foreach (KifuNode nextNode in nextNodes_shuffled) { // (5)読みの深さ2手目以降なら、横幅制限 if (1 < yomiGenjo.YomuDeep) { if (yomiGenjo.Args.YomuLimitter[yomiGenjo.YomuDeep] <= wideCount) { break;// もう次の手の横には読まない。 } } // 《8》カウンターを次局面へ(2手目の読み) // 《9》まだ深く読むなら if (yomiGenjo.YomuDeep + 1 < yomiGenjo.Args.YomuLimitter.Length) { yomiGenjo.YomuDeep++; yomiGenjo.Tesumi_yomiCur++; yomiGenjo.Pside_teban = yomiGenjo.Pside_teban == Playerside.P1 ? Playerside.P2 : Playerside.P1; //先後を反転します。 MoveGenRoutine.WAAA_Yomu_Loop(nextNode, yomiGenjo, log); yomiGenjo.YomuDeep--; //元に戻します。 yomiGenjo.Tesumi_yomiCur--; //元に戻します。 yomiGenjo.Pside_teban = yomiGenjo.Pside_teban == Playerside.P1 ? Playerside.P2 : Playerside.P1; //元に戻します。 } else { // もう深くよまないなら } wideCount++; } if (yomiGenjo.Args.YomuLimitter.Length <= yomiGenjo.YomuDeep + 1)//もう深く読まないなら { // // ログの書き出し // Util_GraphicalLog.Log( true,//enableLog, "指し手生成ログA", "[" + Util_GraphicalLog.BoardFileLog_ToJsonStr(yomiGenjo.Args.LogF_moveKiki) + "]" ); // 書き出した分はクリアーします。 yomiGenjo.Args.LogF_moveKiki.boards.Clear(); } }
/// <summary> /// 読む。 /// /// 棋譜ツリーを作成します。 /// </summary> /// <param name="kifu">この棋譜ツリーの現局面に、次局面をぶら下げて行きます。</param> /// <param name="enableLog"></param> /// <param name="isHonshogi"></param> /// <param name="logTag"></param> /// <returns></returns> public static void WAA_Yomu_Start( KifuTree kifu, bool isHonshogi, SsssLogGenjo log ) { //------------------------------------------------------------ // (>_<)次の1手の合法手の中からランダムに選ぶぜ☆! //------------------------------------------------------------ // // バグ探し: // ①次の1手の合法手のリスト作成 // ②ランダムに1手選ぶ // // の2つしかやっていないんだが、合法手ではない手を返してくるんだぜ☆ #if DEBUG_STOPPABLE MessageBox.Show("ここでブレイク☆!", "デバッグ"); System.Diagnostics.Debugger.Break(); //throw new Exception("デバッグだぜ☆! エラーはキャッチできたかな~☆?(^▽^)"); #endif KifuNode node_yomiNext = (KifuNode)kifu.CurNode;// このノードに、ツリーをぶら下げていきます。 int yomuIndex = 0; // TODO:ここではログを出力せずに、ツリーの先端で出力したい。 GraphicalLog_File logF_moveKiki = new GraphicalLog_File(); // TODO:「読む」と、ツリー構造が作成されます。 //int[] yomuLimitter = new int[]{ // 600, // 読みの1手目の横幅 // 王手回避漏れのために、合法手全読み(約600)は必要です。 // 100, // 読みの2手目の横幅 // 100, // 読みの3手目の横幅 // //2, // 読みの4手目の横幅 // //1 // 読みの5手目の横幅 //}; //// ↓これなら1手1秒で指せる☆ //int[] yomuLimitter = new int[]{ // 600, // 読みの1手目の横幅 // 王手回避漏れのために、合法手全読み(約600)は必要です。 // 150, // 読みの2手目の横幅 // 150, // 読みの3手目の横幅 // //2 // 読みの4手目の横幅 // //1 // 読みの5手目の横幅 //}; //int[] yomuLimitter = new int[]{ // 600, // 読みの1手目の横幅 // 王手回避漏れのために、合法手全読み(約600)は必要です。 // 600, // 読みの2手目の横幅 // 600, // 読みの3手目の横幅 //}; //ok //int[] yomuLimitter = new int[]{ // 0, // 現局面は無視します。 // 600, // 読みの1手目の横幅 // 王手回避漏れのために、合法手全読み(約600)は必要です。 // 600, // 読みの2手目の横幅 //}; int[] yomuLimitter = new int[] { 0, // 現局面は無視します。 600, // 読みの1手目の横幅 // 王手回避漏れのために、1手目は、合法手全読み(約600)は必要です。 600, // 読みの2手目の横幅 //600, // 読みの3手目の横幅 }; #if DEBUG // ログの出力数を減らすために、読みを弱くします。 //yomuLimitter = new int[]{ // 0, // 現局面は無視します。 // 600, // 読みの1手目の横幅 // 王手回避漏れのために、合法手全読み(約600)は必要です。 // 100, // 読みの2手目の横幅 // 100 // 読みの3手目の横幅 //}; yomuLimitter = new int[] { 0, // 現局面は無視します。 600, // 読みの1手目の横幅 // 王手回避漏れのために、1手目は、合法手全読み(約600)は必要です。 600, // 読みの2手目の横幅 //600 // 読みの3手目の横幅 }; //yomuLimitter = new int[]{ // 600, // 読みの1手目の横幅 // 王手回避漏れのために、合法手全読み(約600)は必要です。 // 600, // 読みの2手目の横幅 // 600, // 読みの3手目の横幅 // 100, // 100 //}; #endif MoveGenArgs yomiArgs = new MoveGenArgsImpl(isHonshogi, yomuLimitter, logF_moveKiki); MoveGenGenjo yomiGenjo = new MoveGenGenjoImpl(yomiArgs, yomuIndex + 1, kifu.CurrentTesumi(), kifu.CountPside(node_yomiNext)); MoveGenRoutine.WAAA_Yomu_Loop(node_yomiNext, yomiGenjo, log); if (0 < logF_moveKiki.boards.Count)//ログが残っているなら { // // ログの書き出し // Util_GraphicalLog.Log( true,//enableLog, "MoveRoutine#Yomi_NextNodes(00)新ログ", "[" + Util_GraphicalLog.BoardFileLog_ToJsonStr(logF_moveKiki) + "]" ); // 書き出した分はクリアーします。 logF_moveKiki.boards.Clear(); } }