Exemplo n.º 1
0
        /// <summary>
        /// 指定した駒全てについて、基本的な駒の動きを返します。(金は「前、ななめ前、横、下に進める」のような)
        /// </summary>
        /// <param name="srcSky"></param>
        /// <param name="fingers"></param>
        /// <returns></returns>
        public static Maps_OneAndOne <Finger, SySet <SyElement> > GetPotentialMoves(
            SkyConst srcSky,
            Fingers fingers
            )
        {
            if (fingers is null)
            {
                throw new ArgumentNullException(nameof(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_SyugoQuery.KomaKidou_Potential(finger, srcSky);//←ポテンシャル・ムーブ取得関数を選択。歩とか。

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

            return(kiki_fMs);
        }
Exemplo n.º 2
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_Sky258A.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);
                //}
            });
        }
Exemplo n.º 3
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);
        }