예제 #1
0
        /// <summary>
        /// 駒別の進めるマスを返します。
        ///
        /// 指定された局面で、指定された手番の駒の、移動可能マスを算出します。
        /// 利きを調べる目的ではありません。
        ///
        /// 「手目」は判定できません。
        ///
        /// </summary>
        /// <param name="kouho"></param>
        /// <param name="sbGohosyu"></param>
        /// <param name="logger"></param>
        public static void LA_Split_KomaBETUSusumeruMasus(
            int caller_forLog,//デバッグ用。
            out List_OneAndMulti <Finger, SySet <SyElement> > out_komaBETUSusumeruMasus,

            bool isHonshogi,
            SkyConst src_Sky,
            Playerside pside_genTeban3,
            bool isAiteban
#if DEBUG
            ,
            MmLogGenjo mmLog_orNull
#endif
            )
        {
            //if (null != log_orNull)
            //{
            //    log_orNull.Log1(mmGenjo.Pside_genTeban3);
            //}


            // 《1》 移動可能場所
            out_komaBETUSusumeruMasus = new List_OneAndMulti <Finger, SySet <SyElement> >();
            {
                //
                // 《1.1》 手番を2つのグループに分類します。
                //
                //  ┌─手番──────┬──────┐
                //  │                  │            │
                //  │  利きを調べる側  │  喰らう側  │
                //  └─────────┴──────┘
                Playerside tebanSeme;   //手番(利きを調べる側)
                Playerside tebanKurau;  //手番(喰らう側)
                {
                    Util_KyokumenMoves.SplitGroup_Teban(out tebanSeme, out tebanKurau, isAiteban, pside_genTeban3);
                    //if (null != log_orNull)
                    //{
                    //    log_orNull.Log2(tebanSeme, tebanKurau);
                    //}
                }


                //
                // 《1.2》 駒を4つのグループに分類します。
                //
                //  ┌─駒──────────┬─────────┐
                //  │                        │                  │
                //  │  利きを調べる側の戦駒  │  喰らう側の戦駒  │
                //  ├────────────┼─────────┤
                //  │                        │                  │
                //  │  利きを調べる側の持駒  │  喰らう側の持駒  │
                //  └────────────┴─────────┘
                //
                Fingers fingers_seme_BANJO;  //盤上駒(利きを調べる側)
                Fingers fingers_kurau_BANJO; //盤上駒(喰らう側)
                Fingers fingers_seme_MOTI;   // 持駒(利きを調べる側)
                Fingers fingers_kurau_MOTI;  // 持駒(喰らう側)
                {
                    Util_Sky_FingersQueryFx.Split_BanjoSeme_BanjoKurau_MotiSeme_MotiKurau(
                        out fingers_seme_BANJO, out fingers_kurau_BANJO, out fingers_seme_MOTI, out fingers_kurau_MOTI, src_Sky, tebanSeme, tebanKurau);
                    //#if DEBUG
                    //                    Logger.Trace($"◇fingers_seme_BANJOの要素数={fingers_seme_BANJO.Count}");
                    //                    Logger.Trace($"◇fingers_kurau_BANJOの要素数={fingers_kurau_BANJO.Count}");
                    //                    Logger.Trace($"◇fingers_seme_MOTIの要素数={fingers_seme_MOTI.Count}");
                    //                    Logger.Trace($"◇fingers_kurau_MOTIの要素数={fingers_kurau_MOTI.Count}");
                    //#endif
                    //if (null != log_orNull)
                    //{
                    //    log_orNull.Log3(mmGenjo.Src_Sky, tebanKurau, tebanSeme, fingers_kurau_IKUSA, fingers_kurau_MOTI, fingers_seme_IKUSA, fingers_seme_MOTI);
                    //}
                }



                //
                // 《1.3》 駒を2つのグループに分類します。
                //
                //  ┌─盤上のマス───┬──────┐
                //  │                  │            │
                //  │  利きを調べる側  │  喰らう側  │
                //  └─────────┴──────┘
                //
                SySet <SyElement> masus_seme_BANJO;  // 盤上のマス(利きを調べる側の駒)
                SySet <SyElement> masus_kurau_BANJO; // 盤上のマス(喰らう側の駒)
                {
                    Util_KyokumenMoves.SplitGroup_Banjo(out masus_seme_BANJO, out masus_kurau_BANJO, src_Sky, fingers_kurau_BANJO, fingers_seme_BANJO);
                    // 駒のマスの位置は、特にログに取らない。
                }



                // 《1.4》
                Maps_OneAndOne <Finger, SySet <SyElement> > kmSusumeruMasus_seme_BANJO;
                kmSusumeruMasus_seme_BANJO = Query_FingersMasusSky.To_KomabetuKiki_OnBanjo(
                    fingers_seme_BANJO,
                    masus_seme_BANJO,
                    masus_kurau_BANJO,
                    src_Sky
                    );// 盤上の駒の移動できる場所

                //
                // 持ち駒(代表)を置ける場所
                //
                List_OneAndMulti <Finger, SySet <SyElement> > sMsSusumeruMasus_seme_MOTI;
                sMsSusumeruMasus_seme_MOTI = Util_KyokumenMoves.Get_MotiDaihyo_ToMove(
                    caller_forLog,
                    fingers_seme_MOTI,
                    masus_seme_BANJO,
                    masus_kurau_BANJO,
                    src_Sky//これは、どの局面?
                    );
                //#if DEBUG
                //                Logger.Trace($"sMsSusumeruMasus_seme_MOTIの要素数={Util_List_OneAndMultiEx<Finger, SySet<SyElement>>.CountAllElements(sMsSusumeruMasus_seme_MOTI))}";
                //#endif

                //if (null != log_orNull)
                //{
                //    log_orNull.Log4(mmGenjo.Src_Sky, tebanSeme, kmSusumeruMasus_seme_IKUSA);
                //}


                // 《1》 = 《1.4》の戦駒+持駒

                // 盤上の駒の移動できる場所を足します。
                out_komaBETUSusumeruMasus.AddRange_New(kmSusumeruMasus_seme_BANJO);

                // 持ち駒の置ける場所を足します。
                out_komaBETUSusumeruMasus.AddRange_New(sMsSusumeruMasus_seme_MOTI);
            }
        }
예제 #2
0
        /// <summary>
        /// 駒別の進めるマスを返します。
        ///
        /// 指定された局面で、指定された手番の駒の、移動可能マスを算出します。
        /// 利きを調べる目的ではありません。
        ///
        /// 「手目」は判定できません。
        ///
        /// </summary>
        /// <param name="kouho"></param>
        /// <param name="sbGohosyu"></param>
        /// <param name="logger"></param>
        public static void LA_Get_KomaBETUSusumeruMasus(
            out List_OneAndMulti <Finger, SySet <SyElement> > komaBETUSusumeruMasus,
            MmGenjo_MovableMasu mmGenjo,
            MmLogGenjo log_orNull
            )
        {
            if (null != log_orNull)
            {
                log_orNull.Log1(mmGenjo.Pside_genTeban3);
            }


            // 《1》 移動可能場所
            komaBETUSusumeruMasus = new List_OneAndMulti <Finger, SySet <SyElement> >();
            {
                //
                // 《1.1》 手番を2つのグループに分類します。
                //
                //  ┌─手番──────┬──────┐
                //  │                  │            │
                //  │  利きを調べる側  │  喰らう側  │
                //  └─────────┴──────┘
                Playerside tebanSeme;   //手番(利きを調べる側)
                Playerside tebanKurau;  //手番(喰らう側)
                {
                    Util_MovableMove.SplitGroup_Teban(out tebanSeme, out tebanKurau, mmGenjo.IsAiteban, mmGenjo.Pside_genTeban3);
                    if (null != log_orNull)
                    {
                        log_orNull.Log2(tebanSeme, tebanKurau);
                    }
                }


                //
                // 《1.2》 駒を4つのグループに分類します。
                //
                //  ┌─駒──────────┬─────────┐
                //  │                        │                  │
                //  │  利きを調べる側の戦駒  │  喰らう側の戦駒  │
                //  ├────────────┼─────────┤
                //  │                        │                  │
                //  │  利きを調べる側の持駒  │  喰らう側の持駒  │
                //  └────────────┴─────────┘
                //
                Fingers fingers_seme_IKUSA;  //戦駒(利きを調べる側)
                Fingers fingers_kurau_IKUSA; //戦駒(喰らう側)
                Fingers fingers_seme_MOTI;   // 持駒(利きを調べる側)
                Fingers fingers_kurau_MOTI;  // 持駒(喰らう側)
                {
                    Util_Things.AAABAAAA_SplitGroup(out fingers_seme_IKUSA, out fingers_kurau_IKUSA, out fingers_seme_MOTI, out fingers_kurau_MOTI, mmGenjo.Src_Sky, tebanSeme, tebanKurau);
                    if (null != log_orNull)
                    {
                        log_orNull.Log3(mmGenjo.Src_Sky, tebanKurau, tebanSeme, fingers_kurau_IKUSA, fingers_kurau_MOTI, fingers_seme_IKUSA, fingers_seme_MOTI);
                    }
                }



                //
                // 《1.3》 駒を2つのグループに分類します。
                //
                //  ┌─盤上のマス───┬──────┐
                //  │                  │            │
                //  │  利きを調べる側  │  喰らう側  │
                //  └─────────┴──────┘
                //
                SySet <SyElement> masus_seme_IKUSA;  // 盤上のマス(利きを調べる側の駒)
                SySet <SyElement> masus_kurau_IKUSA; // 盤上のマス(喰らう側の駒)
                {
                    Util_MovableMove.SplitGroup_Ikusa(out masus_seme_IKUSA, out masus_kurau_IKUSA, mmGenjo.Src_Sky, fingers_kurau_IKUSA, fingers_seme_IKUSA);
                    // 駒のマスの位置は、特にログに取らない。
                }



                // 《1.4》
                Maps_OneAndOne <Finger, SySet <SyElement> > kmSusumeruMasus_seme_IKUSA;
                if (null != log_orNull)
                {
                    kmSusumeruMasus_seme_IKUSA = Util_Things.Get_KmEffect_seme_IKUSA(
                        fingers_seme_IKUSA,
                        masus_seme_IKUSA,
                        masus_kurau_IKUSA,
                        mmGenjo.Src_Sky,
                        log_orNull.Enable,
                        Converter04.MoveToStringForLog(log_orNull.Move, mmGenjo.Pside_genTeban3)
                        );// 盤上の駒の移動できる場所
                }
                else
                {
                    kmSusumeruMasus_seme_IKUSA = Util_Things.Get_KmEffect_seme_IKUSA(
                        fingers_seme_IKUSA,
                        masus_seme_IKUSA,
                        masus_kurau_IKUSA,
                        mmGenjo.Src_Sky,
                        false, //log.Enable,
                        ""
                        );     // 盤上の駒の移動できる場所
                }

                // 持ち駒を置ける場所
                List_OneAndMulti <Finger, SySet <SyElement> > sMsSusumeruMasus_seme_MOTI;
                if (null != log_orNull)
                {
                    sMsSusumeruMasus_seme_MOTI = Util_Things.Get_Move_Moti(
                        fingers_seme_MOTI,
                        masus_seme_IKUSA,
                        masus_kurau_IKUSA,
                        mmGenjo.Src_Sky,
                        Converter04.MoveToStringForLog(log_orNull.Move, mmGenjo.Pside_genTeban3)
                        );
                }
                else
                {
                    sMsSusumeruMasus_seme_MOTI = Util_Things.Get_Move_Moti(
                        fingers_seme_MOTI,
                        masus_seme_IKUSA,
                        masus_kurau_IKUSA,
                        mmGenjo.Src_Sky,
                        ""
                        );
                }

                if (null != log_orNull)
                {
                    log_orNull.Log4(mmGenjo.Src_Sky, tebanSeme, kmSusumeruMasus_seme_IKUSA);
                }



                try
                {
                    // 《1》 = 《1.4》の戦駒+持駒

                    // 盤上の駒の移動できる場所を足します。
                    komaBETUSusumeruMasus.AddRange_New(kmSusumeruMasus_seme_IKUSA);

                    // 持ち駒の置ける場所を足します。
                    komaBETUSusumeruMasus.AddRange_New(sMsSusumeruMasus_seme_MOTI);
                }
                catch (Exception ex)
                {
                    //>>>>> エラーが起こりました。
                    throw new Exception($"{ex.GetType().Name} {ex.Message}:ランダムチョイス(50):");
                }
            }
        }