Esempio n. 1
0
        /// <summary>
        /// 指定された局面で、指定された手番の駒の、利きマスを算出します。
        /// 持ち駒は盤上にないので、利きを調べる必要はありません。
        ///
        /// 「手目」は判定できません。
        ///
        /// </summary>
        /// <param name="kouho"></param>
        /// <param name="sbGohosyu"></param>
        /// <param name="logger"></param>
        public static List_OneAndMulti <Finger, SySet <SyElement> > LAAAA_GetEffect(
            bool enableLog,
            bool isHonshogi,
            SkyConst src_Sky,
            Playerside pside_genTeban3,
            bool isAiteban,
            GraphicalLog_File logF_kiki,
            string logBrd_caption,
            int yomuDeep_forLog,//脳内読み手数
            int tesumi_yomiCur_forLog,
            ShootingStarlightable move_forLog
            )
        {
            GraphicalLog_Board logBrd_kiki = new GraphicalLog_Board();

            logBrd_kiki.Caption        = logBrd_caption;// "利き_"
            logBrd_kiki.Tesumi         = tesumi_yomiCur_forLog;
            logBrd_kiki.NounaiYomiDeep = yomuDeep_forLog;
            //logBrd_kiki.Score = 0.0d;
            logBrd_kiki.GenTeban = pside_genTeban3;// 現手番
            logF_kiki.boards.Add(logBrd_kiki);

            // 《1》
            List_OneAndMulti <Finger, SySet <SyElement> > sMs_effect = new List_OneAndMulti <Finger, SySet <SyElement> >();//盤上の駒の利き

            {
                // 《1.1》
                Playerside tebanSeme;  //手番(利きを調べる側)
                Playerside tebanKurau; //手番(喰らう側)
                {
                    if (isAiteban)
                    {
                        tebanSeme  = Converter04.AlternatePside(pside_genTeban3);
                        tebanKurau = pside_genTeban3;
                    }
                    else
                    {
                        tebanSeme  = pside_genTeban3;
                        tebanKurau = Converter04.AlternatePside(pside_genTeban3);
                    }

                    if (Playerside.P1 == tebanSeme)
                    {
                        logBrd_kiki.NounaiSeme = Gkl_NounaiSeme.Sente;
                    }
                    else if (Playerside.P2 == tebanSeme)
                    {
                        logBrd_kiki.NounaiSeme = Gkl_NounaiSeme.Gote;
                    }
                }


                // 《1.2》
                Fingers fingers_seme_IKUSA;  //戦駒(利きを調べる側)
                Fingers fingers_kurau_IKUSA; //戦駒(喰らう側)
                Fingers dust1;
                Fingers dust2;

                Util_Things.AAABAAAA_SplitGroup(
                    out fingers_seme_IKUSA,
                    out fingers_kurau_IKUSA,
                    out dust1,
                    out dust2,
                    src_Sky,
                    tebanSeme,
                    tebanKurau
                    );


                // 攻め手の駒の位置
                GraphicalLog_Board boardLog_clone = new GraphicalLog_Board(logBrd_kiki);
                foreach (Finger finger in fingers_seme_IKUSA.Items)
                {
                    RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now);


                    Gkl_KomaMasu km = new Gkl_KomaMasu(
                        Util_GraphicalLog.PsideKs14_ToString(tebanSeme, Haiyaku184Array.Syurui(koma.Haiyaku), ""),
                        Util_Masu.AsMasuNumber(koma.Masu)
                        );
                    boardLog_clone.KomaMasu1.Add(km);
                }

                foreach (Finger finger in fingers_kurau_IKUSA.Items)
                {
                    RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now);


                    logBrd_kiki.KomaMasu2.Add(new Gkl_KomaMasu(
                                                  Util_GraphicalLog.PsideKs14_ToString(tebanKurau, Haiyaku184Array.Syurui(koma.Haiyaku), ""),
                                                  Util_Masu.AsMasuNumber(koma.Masu)
                                                  ));
                }

                logBrd_kiki = boardLog_clone;



                // 《1.3》
                SySet <SyElement> masus_seme_IKUSA  = Converter04.Fingers_ToMasus(fingers_seme_IKUSA, src_Sky);  // 盤上のマス(利きを調べる側の駒)
                SySet <SyElement> masus_kurau_IKUSA = Converter04.Fingers_ToMasus(fingers_kurau_IKUSA, src_Sky); // 盤上のマス(喰らう側の駒)

                // 駒のマスの位置は、特にログに取らない。

                // 《1.4》
                Maps_OneAndOne <Finger, SySet <SyElement> > kmEffect_seme_IKUSA = Util_Things.Get_KmEffect_seme_IKUSA(
                    fingers_seme_IKUSA,//この中身がおかしい。
                    masus_seme_IKUSA,
                    masus_kurau_IKUSA,
                    src_Sky,
                    enableLog,
                    Converter04.MoveToStringForLog(move_forLog, pside_genTeban3)
                    );// 利きを調べる側の利き(戦駒)

                // 戦駒の利き
                logBrd_kiki = new GraphicalLog_Board(logBrd_kiki);
                kmEffect_seme_IKUSA.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) =>
                {
                    RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(key).Now);


                    string komaImg = Util_GraphicalLog.PsideKs14_ToString(tebanSeme, Haiyaku184Array.Syurui(koma.Haiyaku), "");

                    foreach (Basho masu in value.Elements)
                    {
                        boardLog_clone.Masu_theEffect.Add((int)masu.MasuNumber);
                    }
                });

                logBrd_kiki = boardLog_clone;


                // 《1》 = 《1.4》の戦駒+持駒
                sMs_effect.AddRange_New(kmEffect_seme_IKUSA);
            }

            return(sMs_effect);
        }
Esempio n. 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):");
                }
            }
        }