Example #1
0
        public static Dictionary <ShootingStarlightable, KyokumenWrapper> KomabetuMasus_ToMovebetuSky(
            Maps_OneAndOne <Finger, SySet <SyElement> > komabetuSusumuMasus,
            SkyConst src_Sky,
            Playerside pside
            )
        {
            Dictionary <ShootingStarlightable, KyokumenWrapper> resultMovebetuSky = new Dictionary <ShootingStarlightable, KyokumenWrapper>();


            komabetuSusumuMasus.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) =>
            {
                RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(key).Now);


                foreach (SyElement dstMasu in value.Elements)
                {
                    ShootingStarlightable move = Util_Sky.New(
                        //key,
                        new RO_Star_Koma(pside, koma.Masu, koma.Haiyaku),
                        new RO_Star_Koma(pside, dstMasu, koma.Haiyaku),//FIXME:配役は適当。
                        PieceType.None
                        );

                    resultMovebetuSky.Add(move, new KyokumenWrapper(Util_Sasu.Sasu(src_Sky, key, dstMasu, pside)));
                }
            });


            return(resultMovebetuSky);
        }
Example #2
0
        /// <summary>
        /// a - b = c
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <param name="sbGohosyu"></param>
        public static Maps_OneAndOne <Finger, SySet <SyElement> > MinusMasus(
            bool enableLog,
            SkyConst src_Sky_forLog,
            Maps_OneAndOne <Finger, SySet <SyElement> > a1,
            SySet <SyElement> b
            )
        {
            //GraphicalLogUtil.Log(enableLog, "Thought_KomaAndMove#MinusMasus",
            //    "["+
            //    GraphicalLogUtil.JsonKyokumens_MultiKomabetuMasus(enableLog, siteiSky_forLog, a1, "a1") +
            //    "]"
            //    );


            Maps_OneAndOne <Finger, SySet <SyElement> > c = new Maps_OneAndOne <Finger, SySet <SyElement> >(a1);

            List <Finger> list_koma = c.ToKeyList();//調べたい側の全駒


            foreach (Finger selfKoma in list_koma)
            {
                SySet <SyElement> srcMasus = c.ElementAt(selfKoma);

                SySet <SyElement> minusedMasus = srcMasus.Minus_Closed(b);

                // 差替え
                c.AddReplace(selfKoma, minusedMasus, false);//差分に差替えます。もともと無い駒なら何もしません。
            }

            return(c);
        }
Example #3
0
 public void AddRange_New(Maps_OneAndOne <T1, T2> oo)
 {
     oo.Foreach_Entry((T1 key, T2 value, ref bool toBreak) =>
     {
         this.AddNew(key, value);
     });
 }
Example #4
0
        public static string Kamd_ToTerm(Maps_OneAndOne <Finger, SySet <SyElement> > kamd)
        {
            StringBuilder sb = new StringBuilder();

            kamd.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) =>
            {
                sb.AppendLine("entry.Key=" + key);
                sb.AppendLine(ShogibanTermDisplay.Masus_ToTerm(value));
                sb.AppendLine("  ");//空行
            });

            return(sb.ToString());
        }
Example #5
0
 /// <summary>
 /// 無ければ追加、あれば上書き。
 /// </summary>
 /// <param name="hKoma"></param>
 /// <param name="masus"></param>
 public static void AddOverwrite(
     Maps_OneAndOne <Finger, SySet <SyElement> > komabetuMasus,
     Finger finger, SySet <SyElement> masus)
 {
     if (komabetuMasus.Items.ContainsKey(finger))
     {
         komabetuMasus.Items[finger].AddSupersets(masus);//追加します。
     }
     else
     {
         // 無かったので、新しく追加します。
         komabetuMasus.Items.Add(finger, masus);
     }
 }
Example #6
0
        public static string LogString_Set(
            Maps_OneAndOne <Finger, SySet <SyElement> > komabetuMasus
            )
        {
            StringBuilder sb = new StringBuilder();

            // 全要素
            komabetuMasus.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) =>
            {
                sb.AppendLine("駒=[" + key + "]");
                sb.AppendLine(Util_Masus <Basho> .LogString_Concrete(value));
            });

            return(sb.ToString());
        }
Example #7
0
        public static string Dump(
            Maps_OneAndOne <Finger, SySet <SyElement> > komabetuMasus
            )
        {
            StringBuilder sb = new StringBuilder();

            komabetuMasus.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) =>
            {
                foreach (Basho masu in value.Elements)
                {
                    sb.AppendLine("finger=[" + key.ToString() + "] masu=[" + value.ToString() + "]");
                }
            });

            return(sb.ToString());
        }
Example #8
0
        /// <summary>
        /// 変換「自駒が動ける升」→「自駒が動ける手」
        /// </summary>
        /// <param name="kmDic_Self"></param>
        /// <returns></returns>
        public static Maps_OneAndMulti <Finger, ShootingStarlightable> KomabetuMasusToKomabetuMove(
            Maps_OneAndOne <Finger, SySet <SyElement> > kmDic_Self,
            Node <ShootingStarlightable, KyokumenWrapper> siteiNode_genzai
            )
        {
            Maps_OneAndMulti <Finger, ShootingStarlightable> komaTe = new Maps_OneAndMulti <Finger, ShootingStarlightable>();

            //
            //
            kmDic_Self.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) =>
            {
                foreach (SyElement masuHandle in value.Elements)
                {
                    RO_Star_Koma koma = Util_Koma.AsKoma(siteiNode_genzai.Value.ToKyokumenConst.StarlightIndexOf(key).Now);


                    ShootingStarlightable move = new RO_ShootingStarlight(
                        //key,
                        // 元
                        koma,
                        // 先
                        new RO_Star_Koma(
                            koma.Pside,
                            Masu_Honshogi.Items_All[Util_Masu.AsMasuNumber(masuHandle)],
                            koma.Haiyaku    //TODO:成るとか考えたい
                            ),

                        PieceType.None    //取った駒不明
                        );
                    //sbSfen.Append(sbSfen.ToString());

                    if (komaTe.ContainsKey(key))
                    {
                        // すでに登録されている駒
                        komaTe.AddExists(key, move);
                    }
                    else
                    {
                        // まだ登録されていない駒
                        komaTe.AddNew(key, move);
                    }
                }
            });

            return(komaTe);
        }
Example #9
0
        /// <summary>
        /// 変換『「駒→手」のコレクション』→『「駒、指し手」のペアのリスト』
        /// </summary>
        public static List <Couple <Finger, SyElement> > KomabetuMasus_ToKamList(
            Maps_OneAndOne <Finger, SySet <SyElement> > km
            )
        {
            List <Couple <Finger, SyElement> > kmList = new List <Couple <Finger, SyElement> >();

            foreach (Finger koma in km.ToKeyList())
            {
                SySet <SyElement> masus = km.ElementAt(koma);

                foreach (SyElement masu in masus.Elements)
                {
                    // セットとして作っているので、重複エレメントは無いはず……☆
                    kmList.Add(new Couple <Finger, SyElement>(koma, masu));
                }
            }

            return(kmList);
        }
Example #10
0
        /// <summary>
        /// 戦駒の利き(利きを調べる側)
        /// </summary>
        /// <param name="enableLog"></param>
        /// <param name="fingers_seme_IKUSA"></param>
        /// <param name="masus_seme_IKUSA"></param>
        /// <param name="masus_kurau_IKUSA"></param>
        /// <param name="src_Sky"></param>
        /// <param name="hint"></param>
        /// <returns></returns>
        public static Maps_OneAndOne <Finger, SySet <SyElement> > Get_KmEffect_seme_IKUSA(
            Fingers fingers_seme_IKUSA,
            SySet <SyElement> masus_seme_IKUSA,
            SySet <SyElement> masus_kurau_IKUSA,
            SkyConst src_Sky,
            bool enableLog,
            string hint_orNull
            )
        {
            // 利きを調べる側の利き(戦駒)
            Maps_OneAndOne <Finger, SySet <SyElement> > km = Play.Get_PotentialMoves_Ikusa(src_Sky, fingers_seme_IKUSA);

            // 盤上の現手番の駒利きから、 現手番の駒がある枡を除外します。
            km = Play_KomaAndMove.MinusMasus(false, src_Sky, km, masus_seme_IKUSA);

            // そこから、相手番の駒がある枡「以降」を更に除外します。
            km = Play_KomaAndMove.Minus_OverThereMasus(enableLog, src_Sky, km, masus_kurau_IKUSA);

            return(km);
        }
Example #11
0
        /// <summary>
        /// 指定した駒全てについて、基本的な駒の動きを返します。(金は「前、ななめ前、横、下に進める」のような)
        /// </summary>
        /// <param name="src_Sky"></param>
        /// <param name="fingers"></param>
        /// <returns></returns>
        public static Maps_OneAndOne <Finger, SySet <SyElement> > Get_PotentialMoves_Ikusa(
            SkyConst src_Sky,
            Fingers fingers
            )
        {
            Maps_OneAndOne <Finger, SySet <SyElement> > kiki_fMs = new Maps_OneAndOne <Finger, SySet <SyElement> >();// 「どの駒を、どこに進める」の一覧

            foreach (Finger finger in fingers.Items)
            {
                // ポテンシャル・ムーブを調べます。
                SySet <SyElement> move = Util_Sky.KomaKidou_Potential(finger, src_Sky);//←ポテンシャル・ムーブ取得関数を選択。歩とか。

                if (!move.IsEmptySet())
                {
                    // 移動可能升があるなら
                    Util_KomabetuMasus.AddOverwrite(kiki_fMs, finger, move);
                }
            }

            return(kiki_fMs);
        }
Example #12
0
        /// <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);
        }
Example #13
0
        /// <summary>
        /// マージします。
        /// </summary>
        /// <param name="right"></param>
        public static void Merge(
            Maps_OneAndOne <Finger, SySet <SyElement> > komabetuMasus,
            Maps_OneAndOne <Finger, SySet <SyElement> > right
            )
        {
            right.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) =>
            {
                Util_KomabetuMasus.AddOverwrite(komabetuMasus, key, value);
                //if (komabetuMasus.entries.ContainsKey(entry.Key))
                //{
                //    // キーが重複していれば、value同士でマージします。

                //    komabetuMasus.entries[entry.Key].AddSupersets(entry.Value);

                //}
                //else
                //{
                //    // 新キーなら
                //    komabetuMasus.entries.Add(entry.Key, entry.Value);
                //}
            });
        }
Example #14
0
        public static string LogString_Concrete(
            Maps_OneAndOne <Finger, SySet <SyElement> > komabetuMasus
            )
        {
            StringBuilder sb = new StringBuilder();

            komabetuMasus.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) =>
            {
                sb.Append("[駒");
                sb.Append(key);
                sb.Append("]");

                foreach (Basho masu in value.Elements)
                {
                    sb.Append(Util_Masus <Basho> .LogString_Concrete(value));
                    //sb.Append(Masu81Array.Items[hMasu].ToString());
                }
            });


            return(sb.ToString());
        }
Example #15
0
        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;
        }
Example #16
0
        /// <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());
        }
Example #17
0
 /// <summary>
 /// クローンを作ります。
 /// </summary>
 /// <param name="entries"></param>
 public Maps_OneAndOne(Maps_OneAndOne <T1, T2> src)
 {
     this.items = src.items;
 }
Example #18
0
        /// <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);
        }
Example #19
0
        /// <summary>
        /// 指定された手の中から、王手局面を除外します。
        ///
        /// 王手回避漏れを防ぎたいんだぜ☆
        /// </summary>
        /// <param name="km_available">自軍の各駒の移動できる升セット</param>
        /// <param name="sbGohosyu"></param>
        /// <param name="logTag"></param>
        public static KifuNode LA_RemoveMate(
            bool isHonshogi,
            Maps_OneAndMulti <Finger, ShootingStarlightable> genTeban_komabetuAllMove1, // 現手番の、どの駒が、どんな手を指すことができるか
            int yomuDeep,                                                               //脳内読み手数
            int tesumi_yomiGenTeban,
            Playerside pside_yomiGenTeban,
            KifuNode siteiNode_yomiGenTeban,
            bool enableLog,
            GraphicalLog_File logF_kiki,
            string hint)
        {
            Node <ShootingStarlightable, KyokumenWrapper> hubNode = UtilKomabetuMove.ToNextNodes_AsHubNode(
                genTeban_komabetuAllMove1, siteiNode_yomiGenTeban, pside_yomiGenTeban
                );                                                    // ハブ・ノード自身はダミーノードなんだが、子ノードに、次のノードが入っている。

            Converter04.AssertNariMove(hubNode, "#LA_RemoveMate(1)"); //ここはok
            Util_LegalMove.Log1(hubNode, enableLog, tesumi_yomiGenTeban, hint);


            if (isHonshogi)
            {
                // 王手が掛かっている局面を除きます。

                Util_LegalMove.LAA_RemoveNextNode_IfMate(
                    hubNode,
                    enableLog,
                    yomuDeep,
                    tesumi_yomiGenTeban,
                    pside_yomiGenTeban,
                    logF_kiki);
            }
            Converter04.AssertNariMove(hubNode, "#LA_RemoveMate(2)王手局面削除直後");//ここはok


            // 「指し手一覧」を、「駒別の全指し手」に分けます。
            Maps_OneAndMulti <Finger, ShootingStarlightable> komabetuAllMoves2 = siteiNode_yomiGenTeban.SplitMoveByKoma(hubNode);

            Converter04.AssertNariMove(komabetuAllMoves2, "#LA_RemoveMate(3)更に変換後");//ここはok

            //
            // 「駒別の指し手一覧」を、「駒別の進むマス一覧」になるよう、データ構造を変換します。
            //
            Maps_OneAndOne <Finger, SySet <SyElement> > komabetuSusumuMasus = new Maps_OneAndOne <Finger, SySet <SyElement> >();// 「どの駒を、どこに進める」の一覧

            foreach (KeyValuePair <Finger, List <ShootingStarlightable> > entry in komabetuAllMoves2.Items)
            {
                Finger finger = entry.Key;
                List <ShootingStarlightable> teList = entry.Value;

                // ポテンシャル・ムーブを調べます。
                SySet <SyElement> masus_PotentialMove = new SySet_Default <SyElement>("ポテンシャルムーブ");
                foreach (ShootingStarlightable te in teList)
                {
                    RO_Star_Koma koma = Util_Koma.AsKoma(te.Now);

                    masus_PotentialMove.AddElement(koma.Masu);
                }

                if (!masus_PotentialMove.IsEmptySet())
                {
                    // 空でないなら
                    Util_KomabetuMasus.AddOverwrite(komabetuSusumuMasus, finger, masus_PotentialMove);
                }
            }

            // まず、ディクショナリー構造へ変換。
            Dictionary <ShootingStarlightable, KyokumenWrapper> movebetuSky = Converter04.KomabetuMasus_ToMovebetuSky(
                komabetuSusumuMasus, siteiNode_yomiGenTeban.Value.ToKyokumenConst, pside_yomiGenTeban);

            // 棋譜ノード構造へ変換。
            return(Converter04.MovebetuSky_ToHubNode(movebetuSky, KifuNodeImpl.GetReverseTebanside(pside_yomiGenTeban)));
        }