Beispiel #1
0
 public MoveGenArgsImpl(
     bool isHonshogi,
     int[] yomuLimitter,
     GraphicalLog_File logF_moveKiki
     )
 {
     this.isHonshogi    = isHonshogi;
     this.yomuLimitter  = yomuLimitter;
     this.logF_moveKiki = logF_moveKiki;
 }
Beispiel #2
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 #3
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));
                }
            }
        }
Beispiel #4
0
        /// <summary>
        /// 指し手を決めます。
        /// </summary>
        /// <param name="enableLog"></param>
        /// <param name="isHonshogi"></param>
        /// <param name="kifu"></param>
        /// <param name="playerInfo"></param>
        /// <param name="logTag"></param>
        /// <returns></returns>
        public ShootingStarlightable WA_Bestmove(
            bool enableLog,
            bool isHonshogi,
            KifuTree kifu,
            PlayerInfo playerInfo
            )
        {
            // 「移動」タイプの狙いを、どんどん付け足します。
            this.Kokoro.Omoituki(
                playerInfo.Playerside, (KifuNode)kifu.CurNode, this.Seikaku);

            //
            // 指し手生成ルーチンで、棋譜ツリーを作ります。
            //
            SsssLogGenjo ssssLog = new SsssLogGenjoImpl(enableLog);

            MoveGenRoutine.WAA_Yomu_Start(kifu, isHonshogi, ssssLog);



            // デバッグ用だが、メソッドはこのオブジェクトを必要としてしまう。
            GraphicalLog_File logF_kiki = new GraphicalLog_File();

            // 点数を付ける(葉ノードに点数を付け、途中のノードの点数も出します)
            this.MinimaxEngine.Tensuduke_ForeachLeafs(
                Util_Sky.ToSfenMoveText(kifu.CurNode.Key),
                (KifuNode)kifu.CurNode,
                kifu,
                this.Kokoro,
                playerInfo,
                ShogisasiImpl.ReportEnvironment,
                logF_kiki
                );

#if DEBUG
            // 評価明細のログ出力。
            this.kyHyokaWriter.Write_ForeachLeafs(
                Util_Sky.ToSfenMoveText(kifu.CurNode.Key),
                (KifuNode)kifu.CurNode,
                kifu,
                playerInfo,
                "" + Util_Sky.ToSfenMoveText(kifu.CurNode.Key) + "/",
                ShogisasiImpl.ReportEnvironment
                );

            if (0 < logF_kiki.boards.Count)//ログが残っているなら
            {
                //
                // ログの書き出し
                //
                Util_GraphicalLog.Log(
                    true,//enableLog,
                    "#評価ログ",
                    "[" + Util_GraphicalLog.BoardFileLog_ToJsonStr(logF_kiki) + "]"
                    );

                // 書き出した分はクリアーします。
                logF_kiki.boards.Clear();
            }
#endif

            // 枝狩りする。
            this.EdagariEngine.ScoreSibori(kifu, this.Kokoro);

            // 1手に決める
            ShootingStarlightable bestMove = this.ErabuEngine.ChoiceBestMove(kifu, enableLog, isHonshogi);

            return(bestMove);
        }