/// <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); } }
/// <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):"); } } }