Пример #1
0
        /// <summary>
        /// 盤1個分のログ。
        /// </summary>
        public static void Build_LogBoard(
            Node <IMove, KyokumenWrapper> node_forLog,
            string nodePath,
            KifuNode niniNode, //任意のノード
                               //KifuTree kifu_forAssert,
            KyokumenPngEnvironment reportEnvironment,
            KaisetuBoards logF_kiki
            )
        {
            //
            // HTMLログ
            //
            if (logF_kiki.boards.Count < 30)//出力件数制限
            {
                KaisetuBoard logBrd_move1 = new KaisetuBoard();

                List_OneAndMulti <Finger, SySet <SyElement> > komaBETUSusumeruMasus;
                Playerside pside = niniNode.Value.KyokumenConst.KaisiPside;
                Util_KyokumenMoves.LA_Split_KomaBETUSusumeruMasus(
                    2,
                    //node_forLog,
                    out komaBETUSusumeruMasus,
                    true,                         //本将棋
                    niniNode.Value.KyokumenConst, //現在の局面
                    pside,
                    false
                    //#if DEBUG
                    ,
                    new MmLogGenjoImpl(
                        0, //読み開始手目済み
                        logBrd_move1,
                        0, //現在の手済み
                        niniNode.Key
                        )
                    //#endif
                    );

                logBrd_move1.moveOrNull = niniNode.Key;

                logBrd_move1.YomikaisiTemezumi = niniNode.Value.KyokumenConst.Temezumi;//読み開始手目済み    // int.MinValue;
                logBrd_move1.Temezumi          = int.MinValue;
                logBrd_move1.Score             = (int)niniNode.Score;

                logF_kiki.boards.Add(logBrd_move1);
            }
        }
Пример #2
0
        /// <summary>
        /// 指し手をぶら下げます。
        ///
        /// ぶらさがるのは、現手番から見た「被王手の次の一手の局面」だけです。
        /// ぶらさがりがなければ、「投了」を選んでください。
        /// </summary>
        /// <param name="enableLog"></param>
        /// <param name="isHonshogi"></param>
        /// <param name="yomuDeep"></param>
        /// <param name="pside_yomiCur"></param>
        /// <param name="node_yomiCur"></param>
        /// <param name="logF_moveKiki"></param>
        /// <returns>複数のノードを持つハブ・ノード</returns>
        private static Dictionary <string, SasuEntry> WAAAA_Create_ChildNodes(
            Tansaku_Genjo genjo,
            IMove src_Sky_move,
            SkyConst src_Sky
            )
        {
            //----------------------------------------
            // ハブ・ノードとは
            //----------------------------------------
            //
            // このハブ・ノード自身は空っぽで、ハブ・ノードの次ノードが、次局面のリストになっています。
            //
            Dictionary <string, SasuEntry> moveBetuEntry;

            //----------------------------------------
            // ①現手番の駒の移動可能場所_被王手含む
            //----------------------------------------

            //----------------------------------------
            // 盤1個分のログの準備
            //----------------------------------------
#if DEBUG
            MmLogGenjoImpl mm_log_orNull = null;
            KaisetuBoard   logBrd_move1;
            Tansaku_FukasaYusen_Routine.Log1(genjo, src_Sky_move, src_Sky, out mm_log_orNull, out logBrd_move1);
#endif

            //----------------------------------------
            // 進めるマス
            //----------------------------------------
            List_OneAndMulti <Finger, SySet <SyElement> > komaBETUSusumeruMasus;
            Util_KyokumenMoves.LA_Split_KomaBETUSusumeruMasus(
                1,
                out komaBETUSusumeruMasus,
                genjo.Args.IsHonshogi, //本将棋か
                src_Sky,               //現在の局面  // FIXME:Lockすると、ここでヌルになる☆
                src_Sky.KaisiPside,    //手番
                false                  //相手番か
#if DEBUG
                ,
                mm_log_orNull
#endif
                );

            //#if DEBUG
            //                Logger.Trace("komaBETUSusumeruMasusの全要素=" + Util_List_OneAndMultiEx<Finger, SySet<SyElement>>.CountAllElements(komaBETUSusumeruMasus));
            //#endif
            //#if DEBUG
            //                string jsaMoveStr = Util_Translator_Move.ToMove(genjo.Node_yomiNext, genjo.Node_yomiNext.Value);
            //                Logger.Trace($"[{jsaMoveStr}]の駒別置ける升 調べ\n{Util_List_OneAndMultiEx<Finger, SySet<SyElement>>.Dump(komaBETUSusumeruMasus, genjo.Node_yomiNext.Value.ToKyokumenConst)}");
            //#endif
            //Moveseisei_FukasaYusen_Routine.Log2(genjo, logBrd_move1);//ログ試し



            //----------------------------------------
            // ②利きから、被王手の局面を除いたハブノード
            //----------------------------------------
            if (genjo.Args.IsHonshogi)
            {
                //----------------------------------------
                // 本将棋
                //----------------------------------------

                //----------------------------------------
                // 指定局面での全ての指し手。
                //----------------------------------------
                Maps_OneAndMulti <Finger, IMove> komaBetuAllMoves = Conv_KomabetuSusumeruMasus.ToKomaBetuAllMoves(
                    komaBETUSusumeruMasus, src_Sky);

                //#if DEBUG
                //                    Logger.Trace("komaBETUAllMovesの全要素=" + Util_Maps_OneAndMultiEx<Finger, SySet<SyElement>>.CountAllElements(komaBETUAllMoves));
                //#endif


                //----------------------------------------
                // 本将棋の場合、王手されている局面は削除します。
                //----------------------------------------
                Maps_OneAndOne <Finger, SySet <SyElement> > starbetuSusumuMasus = Util_LegalMove.LA_RemoveMate(
                    genjo.YomikaisiTemezumi,
                    genjo.Args.IsHonshogi,
                    komaBetuAllMoves,//駒別の全ての指し手
                    src_Sky,
#if DEBUG
                    genjo.Args.LogF_moveKiki,    //利き用
#endif
                    "読みNextルーチン");

                //----------------------------------------
                // 『駒別升ズ』を、ハブ・ノードへ変換。
                //----------------------------------------
                //成り以外の手
                moveBetuEntry = Conv_KomabetuMasus.ToMoveBetuSky1(
                    starbetuSusumuMasus,
                    src_Sky
                    );

                //----------------------------------------
                // 成りの指し手を作成します。(拡張)
                //----------------------------------------
                //成りの手
                Dictionary <string, SasuEntry> b_moveBetuEntry = Util_SasuEx.CreateNariMove(src_Sky,
                                                                                            moveBetuEntry);

                // マージ
                foreach (KeyValuePair <string, SasuEntry> entry in b_moveBetuEntry)
                {
                    if (!moveBetuEntry.ContainsKey(entry.Key))
                    {
                        moveBetuEntry.Add(entry.Key, entry.Value);
                    }
                }
            }
            else
            {
                //----------------------------------------
                // 本将棋じゃないもの
                //----------------------------------------

                //----------------------------------------
                // 駒別置ける升 → 指し手別局面
                //----------------------------------------
                //
                // 1対1変換
                //
                moveBetuEntry = Conv_KomabetuMasus.KomabetuMasusToMoveBetuSky(
                    komaBETUSusumeruMasus,
                    src_Sky
                    );

                //#if DEBUG
                //                    Logger.Trace($"駒別置ける升={komaBETUSusumeruMasus.Items.Count}件。 指し手別局面={ss.Count}件。");
                //                    Debug.Assert(komaBETUSusumeruMasus.Items.Count == ss.Count, "変換後のデータ件数が異なります。[{komaBETUSusumeruMasus.Items.Count}]→[{ss.Count}]");
                //#endif
            }

            return(moveBetuEntry);// result_hubNode;
        }