Пример #1
0
        public static int CountAllElements(Maps_OneAndMulti <Finger, IMove> collection)
        {
            int count = 0;

            foreach (KeyValuePair <Finger, List <IMove> > entry in collection.Items)
            {
                foreach (IMove starbeam in entry.Value)
                {
                    count++;
                }
            }

            return(count);
        }
Пример #2
0
 /// <summary>
 /// 無ければ追加、あれば上書き。
 /// </summary>
 /// <param name="hKoma"></param>
 /// <param name="masus"></param>
 public static void AddOverwrite(
     Maps_OneAndMulti <Finger, SyElement> komabetuMasu,
     Finger finger, SyElement masu)
 {
     if (komabetuMasu.Items.ContainsKey(finger))
     {
         komabetuMasu.Items[finger].Add(masu);//追加します。
     }
     else
     {
         // 無かったので、新しく追加します。
         List <SyElement> list = new List <SyElement>();
         list.Add(masu);
         komabetuMasu.Items.Add(finger, list);
     }
 }
Пример #3
0
        /// <summary>
        /// FIXME: 使ってない?
        ///
        /// 変換「自駒が動ける升」→「自駒が動ける手」
        /// </summary>
        /// <param name="kmDic_Self"></param>
        /// <returns></returns>
        public static Maps_OneAndMulti <Finger, IMove> ToKomabetuMove(
            Maps_OneAndOne <Finger, SySet <SyElement> > kmDic_Self,
            Node <IMove, KyokumenWrapper> siteiNode_genzai
            )
        {
            Maps_OneAndMulti <Finger, IMove> komaTe = new Maps_OneAndMulti <Finger, IMove>();

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


                    IMove move = new RO_Starbeam(
                        //key,
                        // 元
                        koma,
                        // 先
                        new RO_Star(
                            koma.Pside,
                            Masu_Honshogi.Masus_All[Conv_SyElement.ToMasuNumber(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);
        }
Пример #4
0
        /// <summary>
        /// 指し手一覧を、駒毎に分けます。
        /// TODO: これ、SkyConstに移動できないか☆?
        /// </summary>
        /// <param name="hubNode">指し手一覧</param>
        /// <returns>駒毎の、全指し手</returns>
        public static Maps_OneAndMulti <Finger, IMove> SplitMoveByStar(
            SkyConst src_Sky,
            Node <IMove, KyokumenWrapper> hubNode)
        {
            Maps_OneAndMulti <Finger, IMove> enable_teMap = new Maps_OneAndMulti <Finger, IMove>();


            hubNode.Foreach_ChildNodes((string key, Node <IMove, KyokumenWrapper> nextNode, ref bool toBreak) =>
            {
                IMove nextMove = nextNode.Key;

                Finger figKoma = Util_Sky_FingersQuery.InMasuNow(src_Sky, Util_Starlightable.AsKoma(nextMove.LongTimeAgo).Masu).ToFirst();

                enable_teMap.Put_NewOrOverwrite(figKoma, nextMove);
            });

            return(enable_teMap);
        }
Пример #5
0
        /// <summary>
        /// 変換「各(自駒が動ける升)」→「各(自駒が動ける手)」
        /// </summary>
        /// <param name="komaBETUSusumeruMasus">駒別の進める升</param>
        /// <param name="siteiNode">指定ノード</param>
        /// <returns></returns>
        public static Maps_OneAndMulti <Finger, IMove> ToKomaBetuAllMoves(
            List_OneAndMulti <Finger, SySet <SyElement> > komaBETUSusumeruMasus,
            SkyConst src_Sky//Node<Starbeamable, KyokumenWrapper> siteiNode
            )
        {
            Maps_OneAndMulti <Finger, IMove> result_komabetuAllMove = new Maps_OneAndMulti <Finger, IMove>();

            komaBETUSusumeruMasus.Foreach_Entry((Finger figKoma, SySet <SyElement> susumuMasuSet, ref bool toBreak) =>
            {
                // 動かす星。
                RO_Star srcStar = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now);

                foreach (SyElement susumuMasu in susumuMasuSet.Elements)// 星が進める升。
                {
                    // 移動先の星(升の変更)
                    RO_Star dstStar = new RO_Star(
                        srcStar.Pside,
                        susumuMasu,        //Masu_Honshogi.Items_All[Util_Masu10.AsMasuNumber(susumuMasu)],
                        srcStar.Komasyurui // srcStar.Haiyaku//TODO:ここで、駒の種類が「成り」に上書きされているバージョンも考えたい
                        );

                    IMove move = new RO_Starbeam(
                        srcStar,                                              // 移動元
                        dstStar,                                              // 移動先
                        PieceType.None                                        //取った駒不明
                        );
                    result_komabetuAllMove.Put_NewOrOverwrite(figKoma, move); //FIXME: 1つの駒に指し手は1つ??

                    // これが通称【水際のいんちきプログラム】なんだぜ☆
                    // 必要により、【成り】の指し手を追加します。
                    Util_Sasu269.Add_KomaBETUAllNariMoves(
                        result_komabetuAllMove,
                        figKoma, //動かす駒
                        srcStar, //動かす星
                        dstStar  //移動先の星
                        );
                }
            });

            return(result_komabetuAllMove);
        }
Пример #6
0
        /// <summary>
        /// 変換:星別指し手一覧 → 次の局面の一覧をもった、入れ物ノード。
        /// </summary>
        /// <param name="kifu"></param>
        /// <param name="pside_genTeban"></param>
        /// <returns>次の局面一覧を持った、入れ物ノード(ハブ・ノード)</returns>
        public static KifuNode ToNextNodes_AsHubNode(
            Maps_OneAndMulti <Finger, IMove> komabetuAllMove,
            SkyConst src_Sky//Node<Starbeamable, KyokumenWrapper> to_parentNode,//親となる予定のノード
            )
        {
            KifuNode hubNode = new KifuNodeImpl(null, null);//蝶番

#if DEBUG
            string dump = komabetuAllMove.Dump();
#endif

            foreach (KeyValuePair <Finger, List <IMove> > entry1 in komabetuAllMove.Items)
            {
                Finger figKoma = entry1.Key;         // 動かす駒

                foreach (IMove move in entry1.Value) // 駒の動ける升
                {
                    string sfenText = ConvMoveStrSfen.ToMoveStrSfen(move);
                    if (hubNode.ContainsKey_ChildNodes(sfenText))
                    {
                        // 既存の指し手なら無視
                        Logger.Trace($"既存の指し手なので無視します1。sfenText=[{sfenText}]");
                    }
                    else
                    {
                        // 指したあとの次の局面を作るだけ☆
                        hubNode.PutAdd_ChildNode(ConvMoveStrSfen.ToMoveStrSfen(move), new KifuNodeImpl(move, new KyokumenWrapper(
                                                                                                           Util_Sasu341.Sasu(
                                                                                                               src_Sky,                                  // to_parentNode.Value.ToKyokumenConst,//指定局面
                                                                                                               figKoma,                                  //動かす駒
                                                                                                               Util_Starlightable.AsKoma(move.Now).Masu, //移動先升
                                                                                                               false                                     //成りません。
                                                                                                               ))));
                    }
                }
            }

            return(hubNode);
        }
Пример #7
0
 public static void AssertNariMove(Maps_OneAndMulti <Finger, IMove> komabetuAllMove, string hint)
 {
     /*
      * foreach(KeyValuePair<Finger, List<ShootingStarlightable>> komaAllMove in komabetuAllMove.Items)
      * {
      *  foreach(ShootingStarlightable move in komaAllMove.Value)
      *  {
      *      Starlightable lightable = move.Now;
      *      RO_Star_Koma koma = Util_Starlightable.AsKoma(lightable);
      *
      *      if (KomaSyurui14Array.IsNari(koma.Syurui))
      *      {
      *          MessageBox.Show($"指し手に成りが含まれています。[{koma.Masu.Word}][{koma.Syurui}]", $"デバッグ:{hint}");
      *          //Logger.Trace("指し手に成りが含まれています。");
      *          goto gt_EndMethod;
      *      }
      *  }
      * }
      * gt_EndMethod:
      * ;
      */
 }
Пример #8
0
        /// <summary>
        /// これが通称【水際のいんちきプログラム】なんだぜ☆
        /// 必要により、【成り】の指し手を追加します。
        /// </summary>
        public static void Add_KomaBETUAllNariMoves(
            Maps_OneAndMulti <Finger, IMove> komaBETUAllMoves,
            Finger figKoma,
            RO_Star srcKoma,
            RO_Star dstKoma
            )
        {
            bool isPromotionable;

            if (!Util_Sasu269.IsPromotionable(out isPromotionable, srcKoma, dstKoma))
            {
                goto gt_EndMethod;
            }

            // 成りの資格があれば、成りの指し手を作ります。
            if (isPromotionable)
            {
                //MessageBox.Show($"成りの資格がある駒がありました。 src=[{srcKoma.Masu.Word}][{srcKoma.Syurui}]");

                IMove move = new RO_Starbeam(
                    //figKoma,//駒
                    srcKoma,// 移動元
                    new RO_Star(
                        dstKoma.Pside,
                        dstKoma.Masu,
                        Util_Komasyurui14.ToNariCase(dstKoma.Komasyurui) //強制的に【成り】に駒の種類を変更
                        ),                                               // 移動先
                    PieceType.None                                       //取った駒不明
                    );

                // TODO: 一段目の香車のように、既に駒は成っている場合があります。無い指し手だけ追加するようにします。
                komaBETUAllMoves.AddNotOverwrite(figKoma, move);
            }

gt_EndMethod:
            ;
        }
Пример #9
0
        public Maps_OneAndMulti <T1, T2> ToClone()
        {
            Maps_OneAndMulti <T1, T2> map2 = new Maps_OneAndMulti <T1, T2>();

            foreach (KeyValuePair <T1, List <T2> > entry1 in this.Items)
            {
                T1        key1    = entry1.Key;
                List <T2> values1 = entry1.Value;

                foreach (T2 value1 in values1)
                {
                    if (map2.ContainsKey(key1))
                    {
                        map2.AddExists(key1, value1);
                    }
                    else
                    {
                        map2.AddNew(key1, value1);
                    }
                }
            }

            return(map2);
        }
Пример #10
0
        /// <summary>
        /// 指定された手の中から、王手局面を除外します。
        ///
        /// 王手回避漏れを防ぎたいんだぜ☆
        /// </summary>
        /// <param name="km_available">自軍の各駒の移動できる升セット</param>
        /// <param name="sbGohosyu"></param>
        public static Maps_OneAndOne <Finger, SySet <SyElement> > LA_RemoveMate(
            int yomikaisiTemezumi,
            bool isHonshogi,
            Maps_OneAndMulti <Finger, IMove> genTeban_komabetuAllMove1, // 指定局面で、どの駒が、どんな手を指すことができるか
            SkyConst src_Sky,                                           //指定局面。

#if DEBUG
            KaisetuBoards logF_kiki,
#endif

            string hint)
        {
            Node <IMove, KyokumenWrapper> hubNode = ConvStarbetuMoves.ToNextNodes_AsHubNode(
                genTeban_komabetuAllMove1,
                src_Sky
                );                                                           // ハブ・ノード自身はダミーノードなんだが、子ノードに、次のノードが入っている。

            Util_NodeAssert361.AssertNariMove(hubNode, "#LA_RemoveMate(1)"); //ここはok
#if DEBUG
            Util_LegalMove.Log1(hubNode, src_Sky.Temezumi, hint);
#endif

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

                Util_LegalMove.LAA_RemoveNextNode_IfMate(
                    yomikaisiTemezumi,
                    hubNode,
                    src_Sky.Temezumi,
                    src_Sky.KaisiPside

#if DEBUG
                    , logF_kiki
#endif
                    );
            }
            Util_NodeAssert361.AssertNariMove(hubNode, "#LA_RemoveMate(2)王手局面削除直後");//ここはok


            // 「指し手一覧」を、「星別の全指し手」に分けます。
            Maps_OneAndMulti <Finger, IMove> starbetuAllMoves2 = Util_Sky258A.SplitMoveByStar(src_Sky, hubNode);
            Util_Sasu269.AssertNariMove(starbetuAllMoves2, "#LA_RemoveMate(3)更に変換後");//ここはok

            //
            // 「星別の指し手一覧」を、「星別の進むマス一覧」になるよう、データ構造を変換します。
            //
            Maps_OneAndOne <Finger, SySet <SyElement> > starbetuSusumuMasus = new Maps_OneAndOne <Finger, SySet <SyElement> >();// 「どの星を、どこに進める」の一覧
            foreach (KeyValuePair <Finger, List <IMove> > entry in starbetuAllMoves2.Items)
            {
                Finger       finger = entry.Key;
                List <IMove> teList = entry.Value;

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

                    masus_PotentialMove.AddElement(koma.Masu);
                }

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

            return(starbetuSusumuMasus);
        }