public ReportArgsImpl( ISfenPosition1 ro_Kyokumen1, string outFileFullName, ReportEnvironment reportEnvironment) { this.ro_Kyokumen1 = ro_Kyokumen1; // デバッグ { Debug.Assert(this.ro_Kyokumen1.Ban.Length == 10, "サイズ違反"); Debug.Assert(this.ro_Kyokumen1.Ban[0].Length == 10, "サイズ違反"); Debug.Assert(this.ro_Kyokumen1.Ban[1].Length == 10, "サイズ違反"); Debug.Assert(this.ro_Kyokumen1.Ban[2].Length == 10, "サイズ違反"); Debug.Assert(this.ro_Kyokumen1.Ban[3].Length == 10, "サイズ違反"); Debug.Assert(this.ro_Kyokumen1.Ban[4].Length == 10, "サイズ違反"); Debug.Assert(this.ro_Kyokumen1.Ban[5].Length == 10, "サイズ違反"); Debug.Assert(this.ro_Kyokumen1.Ban[6].Length == 10, "サイズ違反"); Debug.Assert(this.ro_Kyokumen1.Ban[7].Length == 10, "サイズ違反"); Debug.Assert(this.ro_Kyokumen1.Ban[8].Length == 10, "サイズ違反"); Debug.Assert(this.ro_Kyokumen1.Ban[9].Length == 10, "サイズ違反"); } this.OutFileFullName = outFileFullName; this.env = reportEnvironment; }
/// <summary> /// 盤1個分のログ。 /// </summary> private void Log_Board( IEngineConf engineConf, string nodePath, KifuNode node, KifuTree kifu, string logDirectory, ReportEnvironment reportEnvironment ) { // 出力先 string basename = $"#{((int)node.KyHyoka.Total())}点_{KyHyokaWriterImpl.logFileCounter}_{nodePath}.log.png"; // TODO // // 画像ログ // if (true) { //SFEN文字列と、出力ファイル名を指定することで、局面の画像ログを出力します。 KyokumenPngWriterImpl.Write1( engineConf, node.ToRO_Kyokumen1(), Path.Combine(logDirectory, basename), reportEnvironment ); KyHyokaWriterImpl.logFileCounter++; } // // スコア明細 // { KyHyokaListWriterImpl.Write(basename, node, logDirectory, reportEnvironment); } }
/// <summary> /// SFEN文字列と、出力ファイル名を指定することで、局面の画像ログを出力します。 /// </summary> /// <param name="sfenstring"></param> /// <param name="outFileFullName"></param> /// <param name="reportEnvironment"></param> /// <returns></returns> public static bool Write2( IEngineConf engineConf, string sfenstring, string outFileFullName, ReportEnvironment reportEnvironment ) { bool successful = true; //System.Windows.Forms.MessageBox.Show(sfenstring + "\n" + outFile, "局面PNG書き出し"); // // SFEN → RO_SfenStartpos // ISfenPosition2 ro_SfenStartpos; string rest; if (!SfenStringReader.ReadString(sfenstring, out rest, out ro_SfenStartpos)) { //System.Windows.Forms.MessageBox.Show(sfenstring,"sfenstringパース失敗"); successful = false; goto gt_EndMethod; } KyokumenPngWriterImpl.Write1( engineConf, ro_SfenStartpos.ToKyokumen1(), outFileFullName, reportEnvironment ); gt_EndMethod: return(successful); }
static ShogisasiImpl() { ShogisasiImpl.ReportEnvironment = new ReportEnvironmentImpl( "koma1.png", //argsDic["kmFile"], "suji1.png", //argsDic["sjFile"], "20", //argsDic["kmW"], "20", //argsDic["kmH"], "8", //argsDic["sjW"], "12" //argsDic["sjH"] ); }
/// <summary> /// 棋譜ツリーの、ノードに格納されている、局面評価明細を、出力していきます。 /// </summary> public void Write_ForeachLeafs( IEngineConf engine, string nodePath, KifuNode node, KifuTree kifu, PlayerInfo playerInfo, string relFolder, ReportEnvironment reportEnvironment ) { // 次ノードの有無 if (0 < node.Count_NextNodes) { // 先に奥の枝から。 node.Foreach_NextNodes((string key, Node <ShootingStarlightable, KyokumenWrapper> nextNode, ref bool toBreak) => { double score = ((KifuNode)nextNode).KyHyoka.Total(); this.Write_ForeachLeafs( engine, nodePath + " " + Util_Sky.ToSfenMoveTextForFilename(nextNode.Key), (KifuNode)nextNode, kifu, playerInfo, relFolder + ((int)score).ToString() + "点_" + Util_Sky.ToSfenMoveText(nextNode.Key) + "/", //relFolder + ((int)((KifuNode)nextNode).KyHyoka.Total()).ToString() + "点_" + Util_Sky.ToSfenMoveText(nextNode.Key) + "/", reportEnvironment ); }); } // このノード // // 盤1個分のログの準備 // this.Log_Board( engine, nodePath, node, kifu, relFolder, reportEnvironment ); }
/// <summary> /// 盤1個分のログ。 /// </summary> private void Log_Board( string nodePath, KifuNode node, KifuTree kifu, ReportEnvironment reportEnvironment, GraphicalLog_File logF_kiki ) { // // HTMLログ // if (logF_kiki.boards.Count < 30)//出力件数制限 { GraphicalLog_Board logBrd_move1 = new GraphicalLog_Board(); List_OneAndMulti <Finger, SySet <SyElement> > komaBETUSusumeruMasus; Util_MovableMove.LA_Get_KomaBETUSusumeruMasus( out komaBETUSusumeruMasus, new MmGenjo_MovableMasuImpl( true, //本将棋 node.Value.ToKyokumenConst, //現在の局面 kifu.CountPside(node), false ), new MmLogGenjoImpl( false, //ログなし logBrd_move1, 0, //読みの深さ 0, //現在の手済み node.Key ) ); logBrd_move1.moveOrNull = ((KifuNode)node).Key; logBrd_move1.NounaiYomiDeep = int.MinValue; logBrd_move1.Tesumi = int.MinValue; logBrd_move1.Score = (int)node.KyHyoka.Total(); logF_kiki.boards.Add(logBrd_move1); } }
/// <summary> /// SFEN文字列と、出力ファイル名を指定することで、局面の画像ログを出力します。 /// </summary> /// <param name="sfenstring"></param> /// <param name="outFileFullName"></param> /// <param name="reportEnvironment"></param> /// <returns></returns> public static bool Write1( IEngineConf engineConf, ISfenPosition1 ro_Kyokumen1, string outFileFullName, ReportEnvironment reportEnvironment ) { bool successful = true; KyokumenPngWriter repWriter = new KyokumenPngWriterImpl(engineConf); ReportArgs args = new ReportArgsImpl( ro_Kyokumen1, outFileFullName, reportEnvironment ); // 局面画像を描きだします。 Bitmap bmp = new Bitmap( 2 * (args.Env.KmW + 2 * args.Env.SjW) + BN_SUJIS * args.Env.KmW + BN_BRD_R_W, BN_DANS * args.Env.KmH + BN_BRD_B_W ); repWriter.Paint(Graphics.FromImage(bmp), args); //System.Windows.Forms.MessageBox.Show(args.Env.OutFolder + args.OutFile, "bmp.Save"); // フォルダーが無ければ、作る必要があります。 { DirectoryInfo dirInfo = Directory.GetParent(args.OutFileFullName); if (!Directory.Exists(dirInfo.FullName)) { Directory.CreateDirectory(dirInfo.FullName); } } bmp.Save(args.OutFileFullName); return(successful); }
public static void Write( string id, KifuNode node, string logDirectory, ReportEnvironment env ) { StringBuilder sb = new StringBuilder(); // 見出し sb.Append(id); sb.Append(" "); sb.Append(((int)node.KyHyoka.Total()).ToString()); sb.Append(" "); switch (node.Tebanside) { case Playerside.P1: sb.Append("P2が指し終えた局面。手番P1"); break; case Playerside.P2: sb.Append("P1が指し終えた局面。手番P2"); break; case Playerside.Empty: sb.Append("手番Empty"); break; } sb.AppendLine(); foreach (KeyValuePair <string, KyHyokaItem> entry in node.KyHyoka.Items) { sb.Append(" "); sb.Append(entry.Key); sb.Append(" "); sb.Append(((KyHyokaItem)entry.Value).Score); sb.Append(" "); sb.Append(((KyHyokaItem)entry.Value).Text); sb.AppendLine(); } sb.AppendLine(); File.AppendAllText(Path.Combine(logDirectory, "#スコア明細.log"), sb.ToString()); // TODO }
/// <summary> /// 棋譜ツリーの、ノードのネクストノードに、点数を付けていきます。 /// </summary> public void Tensuduke_ForeachLeafs( string nodePath, KifuNode node, KifuTree kifu, Kokoro kokoro, PlayerInfo playerInfo, ReportEnvironment reportEnvironment,//MinimaxEngineImpl.REPORT_ENVIRONMENT GraphicalLog_File logF_kiki ) { // 次ノードの有無 if (node.Count_NextNodes < 1) { // 次ノードが無ければ、このノードが、葉です。 // 点数を付けます。 // 局面スコア node.KyHyoka.Clear(); // 妄想と、指定のノードを比較し、点数付けします。 foreach (Tenonagare nagare in kokoro.TenonagareItems) { node.KyHyoka.Add( nagare.Name.ToString(), this.hyokaEngineImpl.LetHandan(nagare, node, playerInfo) ); } #if DEBUG // // 盤1個分のログの準備 // this.Log_Board( nodePath, node, kifu, reportEnvironment, logF_kiki ); #endif } else { node.Foreach_NextNodes((string key, Node <ShootingStarlightable, KyokumenWrapper> nextNode, ref bool toBreak) => { this.Tensuduke_ForeachLeafs( nodePath + " " + Util_Sky.ToSfenMoveText(nextNode.Key), (KifuNode)nextNode, kifu, kokoro, playerInfo, reportEnvironment, logF_kiki ); }); // このノードが、自分の手番かどうか。 bool jibun = playerInfo.Playerside == kifu.CountPside(node); if (jibun) { // 自分のノードの場合、次ノードの中で一番点数の高いもの。 double maxScore = double.MinValue; node.Foreach_NextNodes((string key, Node <ShootingStarlightable, KyokumenWrapper> nextNode, ref bool toBreak) => { double score = ((KifuNode)nextNode).KyHyoka.Total(); if (maxScore < score) { maxScore = score; } }); node.SetBranchKyHyoka(new KyHyokaImpl(maxScore)); } else { // 相手のノードの場合、次ノードの中で一番点数の低いもの。 double minScore = double.MaxValue; node.Foreach_NextNodes((string key, Node <ShootingStarlightable, KyokumenWrapper> nextNode, ref bool toBreak) => { double score = ((KifuNode)nextNode).KyHyoka.Total(); if (score < minScore) { minScore = score; } }); node.SetBranchKyHyoka(new KyHyokaImpl(minScore)); } } }