Esempio n. 1
0
 public void AddRange_New(List_OneAndMulti <T1, T2> om)
 {
     om.Foreach_Entry((T1 key, T2 value, ref bool toBreak) =>
     {
         this.AddNew(key, value);
     });
 }
Esempio n. 2
0
        //Dictionary<Starbeamable, KyokumenWrapper>
        public static Dictionary <string, SasuEntry> KomabetuMasusToMoveBetuSky(
            List_OneAndMulti <Finger, SySet <SyElement> > sMs, SkyConst src_Sky)
        {
            Dictionary <string, SasuEntry> moveBetuEntry = new Dictionary <string, SasuEntry>();


            sMs.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) =>
            {
                RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(key).Now);


                foreach (SyElement dstMasu in value.Elements)
                {
                    IMove move = Util_Sky258A.BuildMove(
                        new RO_Star(src_Sky.KaisiPside, koma.Masu, koma.Haiyaku),
                        new RO_Star(src_Sky.KaisiPside, dstMasu, koma.Haiyaku),//FIXME:配役は適当。
                        PieceType.None
                        );

                    string moveStr      = ConvMoveStrSfen.ToMoveStrSfen(move);//重複防止用のキー
                    SasuEntry sasuEntry = new SasuEntry(
                        move,
                        key,     //動かす駒
                        dstMasu, //移動先升
                        false    //成りません。
                        );
                    if (!moveBetuEntry.ContainsKey(moveStr))
                    {
                        moveBetuEntry.Add(moveStr, sasuEntry);
                    }
                }
            });

            return(moveBetuEntry);

            /*
             * Dictionary<Starbeamable, KyokumenWrapper> result = new Dictionary<Starbeamable, KyokumenWrapper>();
             * foreach (KeyValuePair<string, SasuEntry> entry in movebetuEntry)
             * {
             *  result.Add(
             *      entry.Value.NewMove,
             *      new KyokumenWrapper(Util_Sasu341.Sasu(
             *      src_Sky,//指定局面
             *      entry.Value.Finger,//動かす駒
             *      entry.Value.Masu,//移動先升
             *      entry.Value.Naru,//成りません。
             *      logTag
             *  )));
             * }
             *
             * return result;
             */
        }
Esempio n. 3
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);
        }
Esempio n. 4
0
        /// <summary>
        /// 利きに飛び込んでいないか(王手されていないか)、調べます。
        ///
        /// GetAvailableMove()の中では使わないでください。循環してしまいます。
        /// </summary>
        public static bool LAAA_KingSuicide(
            int yomikaisiTemezumi,
            SkyConst src_Sky,            //調べたい局面
            int temezumi_yomiCur_forLog, //読み進めている現在の手目
            Playerside pside_genTeban,   //現手番側

#if DEBUG
            KaisetuBoards logF_kiki,
#endif
            IMove move_forLog
            )
        {
            bool isHonshogi = true;

            System.Diagnostics.Debug.Assert(src_Sky.Count == Masu_Honshogi.HONSHOGI_KOMAS);

            // 「相手の駒を動かしたときの利き」リスト
            // 持ち駒はどう考える?「駒を置けば、思い出王手だってある」
            List_OneAndMulti <Finger, SySet <SyElement> > sMs_effect_aiTeban = Util_LegalMove.LAAAA_GetEffect(
                yomikaisiTemezumi,
                isHonshogi,
                src_Sky,
                pside_genTeban,
                true,// 相手盤の利きを調べます。
#if DEBUG
                logF_kiki,
#endif
                "玉自殺チェック",
                temezumi_yomiCur_forLog,
                move_forLog);


            // 現手番側が受け手に回ったとします。現手番の、王の座標
            int genTeban_kingMasuNumber;

            if (Playerside.P2 == pside_genTeban)
            {
                // 現手番は、後手

                RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(Finger_Honshogi.GoteOh).Now);

                genTeban_kingMasuNumber = Conv_SyElement.ToMasuNumber(koma.Masu);
            }
            else
            {
                // 現手番は、先手
                RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(Finger_Honshogi.SenteOh).Now);

                genTeban_kingMasuNumber = Conv_SyElement.ToMasuNumber(koma.Masu);
            }


            // 相手の利きに、自分の王がいるかどうか確認します。
            bool mate = false;

            sMs_effect_aiTeban.Foreach_Entry((Finger koma, SySet <SyElement> kikis, ref bool toBreak) =>
            {
                foreach (New_Basho kiki in kikis.Elements)
                {
                    if (genTeban_kingMasuNumber == kiki.MasuNumber)
                    {
                        mate    = true;
                        toBreak = true;
                    }
                }
            });

            return(mate);
        }