コード例 #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);
     });
 }
コード例 #2
0
        public static Dictionary <ShootingStarlightable, KyokumenWrapper> KomabetuMasusToMovebetuSky(
            List_OneAndMulti <Finger, SySet <SyElement> > sMs, SkyConst src_Sky, Playerside pside)
        {
            Dictionary <ShootingStarlightable, KyokumenWrapper> result = new Dictionary <ShootingStarlightable, KyokumenWrapper>();


            sMs.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
                        );

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


            return(result);
        }
コード例 #3
0
        /// <summary>
        /// 変換「各(自駒が動ける升)」→「各(自駒が動ける手)」
        /// </summary>
        /// <param name="komaBETUSusumeruMasus"></param>
        /// <returns></returns>
        public static Maps_OneAndMulti <Finger, ShootingStarlightable> KomaBETUSusumeruMasusToKomaBETUAllMoves(
            List_OneAndMulti <Finger, SySet <SyElement> > komaBETUSusumeruMasus,
            Node <ShootingStarlightable, KyokumenWrapper> siteiNode_genzai
            )
        {
            Maps_OneAndMulti <Finger, ShootingStarlightable> komabetuAllMove = new Maps_OneAndMulti <Finger, ShootingStarlightable>();

            komaBETUSusumeruMasus.Foreach_Entry((Finger figKoma, SySet <SyElement> susumuMasuSet, ref bool toBreak) =>
            {
                RO_Star_Koma srcKoma = Util_Koma.AsKoma(siteiNode_genzai.Value.ToKyokumenConst.StarlightIndexOf(figKoma).Now);

                foreach (SyElement susumuMasu in susumuMasuSet.Elements)
                {
                    // 移動先の駒
                    RO_Star_Koma dstKoma = new RO_Star_Koma(
                        srcKoma.Pside,
                        Masu_Honshogi.Items_All[Util_Masu.AsMasuNumber(susumuMasu)],
                        srcKoma.Haiyaku//TODO:ここで、駒の種類が「成り」に上書きされているバージョンも考えたい
                        );

                    ShootingStarlightable move = new RO_ShootingStarlight(
                        //figKoma,//駒
                        srcKoma,       // 移動元
                        dstKoma,       // 移動先
                        PieceType.None //取った駒不明
                        );
                    komabetuAllMove.AddOverwrite(figKoma, move);

                    // これが通称【水際のいんちきプログラム】なんだぜ☆
                    // 必要により、【成り】の指し手を追加します。
                    Converter04.AddKomaBETUAllNariMoves(
                        komabetuAllMove,
                        figKoma,
                        srcKoma,
                        dstKoma
                        );
                }
            });

            //Converter04.AssertNariMove(komabetuAllMove, "#KomabetuMasus_ToKomabetuAllMove");//ここはOK

            return(komabetuAllMove);
        }
コード例 #4
0
        /// <summary>
        /// 利きに飛び込んでいないか(王手されていないか)、調べます。
        ///
        /// GetAvailableMove()の中では使わないでください。循環してしまいます。
        /// </summary>
        public static bool LAAA_KingSuicide(
            bool enableLog,
            SkyConst src_Sky,          //調べたい局面
            int yomuDeep,              //脳内読み手数
            int tesumi_yomiCur_forLog, //読み進めている現在の手目
            Playerside pside_genTeban, //現手番側
            GraphicalLog_File logF_kiki,
            ShootingStarlightable 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(
                enableLog,
                isHonshogi,
                src_Sky,
                pside_genTeban,
                true,// 相手盤の利きを調べます。
                logF_kiki,
                "玉自殺チェック",
                yomuDeep,
                tesumi_yomiCur_forLog,
                move_forLog);


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

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

                RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(Finger_Honshogi.GoteOh).Now);

                genTeban_kingMasu = koma.Masu;
            }
            else
            {
                // 現手番は、先手
                RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(Finger_Honshogi.SenteOh).Now);

                genTeban_kingMasu = koma.Masu;
            }


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

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

            return(mate);
        }