Beispiel #1
0
        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;
        }
Beispiel #2
0
        /// <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);
            }
        }
Beispiel #3
0
        /// <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);
        }
Beispiel #4
0
 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"]
         );
 }
Beispiel #5
0
        /// <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
                );
        }
Beispiel #6
0
        /// <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);
            }
        }
Beispiel #7
0
        /// <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);
        }
Beispiel #8
0
        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
        }
Beispiel #9
0
        /// <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));
                }
            }
        }