/// <summary> /// 汎用。 /// </summary> /// <param name="collection"></param> /// <returns></returns> public static string Dump(List_OneAndMulti <T1, T2> collection) { int count = 0; StringBuilder sb = new StringBuilder(); { foreach (Couple <T1, T2> item in collection.Items) { if (item.B is SySet <SyElement> ) { foreach (SyElement syElement in ((SySet <SyElement>)item.B).Elements) { sb.AppendLine($"({ count }) a=[{ item.A.ToString() }] b=[{ Conv_Sy.Query_Word(syElement.Bitfield) }]"); count++; } } else { sb.AppendLine($"({ count }) a=[{ item.A.ToString() }] b=[{ item.B.ToString() }]"); count++; } } } return(sb.ToString()); }
public void AddRange_New(List_OneAndMulti <T1, T2> om) { om.Foreach_Entry((T1 key, T2 value, ref bool toBreak) => { this.AddNew(key, value); }); }
/// <summary> /// 特殊な用途。 /// </summary> /// <param name="collection"></param> /// <returns></returns> public static string Dump(List_OneAndMulti <T1, T2> collection, SkyConst skyConst) { int count = 0; StringBuilder sb = new StringBuilder(); { foreach (Couple <T1, T2> item in collection.Items) { if (item.A is Finger && item.B is SySet <SyElement> ) { foreach (SyElement syElement in ((SySet <SyElement>)item.B).Elements) { sb.AppendLine($"({count}) a=[{Util_Komasyurui14.Ichimoji[(int)Util_Starlightable.AsKoma(skyConst.StarlightIndexOf(item.A as Finger).Now).Komasyurui]}] b=[{Util_Masu10.ToSujiKanji(syElement)}]"); count++; } } else { sb.AppendLine($"({count}) a=[{item.A.ToString()}] b=[{item.B.ToString()}]"); count++; } } } return(sb.ToString()); }
//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; */ }
/// <summary> /// 変換 /// </summary> /// <returns></returns> public static List_OneAndMulti <Finger, SySet <SyElement> > SplitKey1And2( Maps_OneAndMultiAndMulti <Finger, New_Basho, SySet <SyElement> > komabetuMasubetuMasus ) { List_OneAndMulti <Finger, SySet <SyElement> > result = new List_OneAndMulti <Finger, SySet <SyElement> >(); komabetuMasubetuMasus.Foreach_Entry((Finger finger, New_Basho key2, SySet <SyElement> masus, ref bool toBreak) => { result.AddNew(finger, masus); }); return(result); }
public static int CountAllElements(List_OneAndMulti <Finger, SySet <SyElement> > collection) { int count = 0; foreach (Couple <Finger, SySet <SyElement> > entry in collection.Items) { foreach (SyElement masus in entry.B.Elements) { count++; } } return(count); }
/// <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); }
/// <summary> /// 攻め手の持駒利き /// </summary> /// <param name="fingers_sirabetaiMOTIkoma">攻め側の持ち駒</param> /// <param name="masus_mikata_onBanjo">攻め側の盤上の駒の、利き</param> /// <param name="masus_aite_onBanjo">食らう側の盤上の駒の、利き</param> /// <param name="src_Sky">局面</param> /// <returns></returns> public static List_OneAndMulti <Finger, SySet <SyElement> > Get_MotiDaihyo_ToMove( int caller_forLog, Fingers fingers_sirabetaiMOTIkoma, SySet <SyElement> masus_mikata_onBanjo, SySet <SyElement> masus_aite_onBanjo, SkyConst src_Sky ) { // 持ち駒を置けない升 SySet <SyElement> okenaiMasus = new SySet_Default <SyElement>("持ち駒を置けない升"); { // 自分の駒がある升 okenaiMasus.AddSupersets(masus_mikata_onBanjo); // 相手の駒がある升 okenaiMasus.AddSupersets(masus_aite_onBanjo); } // 「どの持ち駒(代表)を」「どこに置けるか」のコレクション。 List_OneAndMulti <Finger, SySet <SyElement> > result = Play.Translate_Motikoma_ToMove( src_Sky, fingers_sirabetaiMOTIkoma, masus_mikata_onBanjo, masus_aite_onBanjo, okenaiMasus ); //#if DEBUG // if (caller_forLog == 1) // { // string jsaMoveStr = Util_Translator_Move.ToMove(node_forLog, node_forLog.Value, errH_orNull); // Logger.Trace($"Util_Things: [{node_forLog .Value.ToKyokumenConst.Temezumi}]手目済み 局面で、[{jsaMoveStr}]の駒別置ける升 調べ(持ち駒編)\n{Util_List_OneAndMultiEx<Finger, SySet<SyElement>>.Dump(result, node_forLog.Value.ToKyokumenConst))}"; // } //#endif return(result); }
/// <summary> /// 指定した持ち駒全てについて、基本的な駒の動きを返します。(金は「前、ななめ前、横、下に進める」のような) /// (ポテンシャル・ムーブ=障害物がなかったときの動き) /// /// 1局面につき、1回実行される。 /// </summary> /// <param name="src_Sky"></param> /// <param name="fingers_sirabetaiMOTIkoma"></param> /// <param name="motiOkenaiMasus">持ち駒を置けないマス(味方駒、敵駒が置いてあるマス)</param> /// <returns></returns> public static List_OneAndMulti <Finger, SySet <SyElement> > Translate_Motikoma_ToMove( SkyConst src_Sky, Fingers fingers_sirabetaiMOTIkoma, SySet <SyElement> masus_mikata_onBanjo, //打ち歩詰めチェック用 SySet <SyElement> masus_aite_onBanjo, //打ち歩詰めチェック用 SySet <SyElement> motiOkenaiMasus ) { // 駒種類別、置こうとする升 SySet <SyElement>[] aMasus = new SySet <SyElement> [Array_Komasyurui.Items_AllElements.Length]; // 駒種類別、置こうとする駒(持駒の代表) RO_Star[] aDaihyo = new RO_Star[Array_Komasyurui.Items_AllElements.Length]; // 駒種類別、置こうとする駒番号 Finger[] aFigKoma = new Finger[Array_Komasyurui.Items_AllElements.Length]; Finger[] daihyoArray;// 持駒。駒の種類代表1個 Util_Fingers_KomasyuruiQuery.Translate_Fingers_ToKomasyuruiBETUFirst( src_Sky, fingers_sirabetaiMOTIkoma, out daihyoArray ); foreach (Finger figDaihyo in daihyoArray) { if (Fingers.Error_1 != figDaihyo) { RO_Star daihyo = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figDaihyo).Now); #if DEBUG Debug.Assert(daihyo != null, "持ち駒の代表がヌル"); #endif // 駒種類別、置こうとする駒 aDaihyo[(int)daihyo.Komasyurui] = daihyo; // 駒種類別、置こうとする升 aMasus[(int)daihyo.Komasyurui] = Util_Sky_SyugoQuery.KomaKidou_Potential(figDaihyo, src_Sky); // 駒種類別、置こうとする駒番号 aFigKoma[(int)daihyo.Komasyurui] = figDaihyo; } } if (aDaihyo[(int)PieceType.P] != null)// 攻め手が、歩を持っているなら { //---------------------------------------- // 二歩チェック //---------------------------------------- // // 打てない筋の升を除外します。 // #if DEBUG //if (null != errH_orNull) //{ // Logger.Trace("----------------------------------------"); // Logger.Trace($"歩を置きたかった升={Util_SySet.Dump_Elements(aMasus[(int)Komasyurui14.H01_Fu_____])}"); // Logger.Trace("----------------------------------------"); // Logger.Trace("歩の置けない筋チェック(二歩チェック)開始"); //} #endif // 将棋盤上の自歩一覧。 Fingers banjoJiFus = Util_Sky_FingersQuery.InOkibaPsideKomasyuruiNow( src_Sky, //指定局面 Okiba.ShogiBan, //将棋盤上の aDaihyo[(int)PieceType.P].Pside, //持駒を持っているプレイヤー側の PieceType.P //歩 ); #if DEBUG //if (null != errH_orNull) //{ // Logger.Trace($"banjoJiFus.Count=[{banjoJiFus.Count}]"); // foreach (Finger figKoma in banjoJiFus.Items) // { // Logger.Trace($"figKoma=[{(int)figKoma}]"); // } // Logger.Trace("----------------------------------------"); //} #endif // 筋別、歩のあるなしチェック bool[] existsFu_sujibetu = new bool[10]; foreach (Finger figBanjoJiFu in banjoJiFus.Items) { RO_Star banjoJiFu = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figBanjoJiFu).Now); int suji;//1~9 Util_MasuNum.TryMasuToSuji(banjoJiFu.Masu, out suji); existsFu_sujibetu[suji] = true; } // 9筋 確認します。 for (int suji = 1; suji < 10; suji++) { if (existsFu_sujibetu[suji]) { // 二歩になる筋番号の発見☆ #if DEBUG //Logger.Trace($"二歩チェック: {suji}筋は二歩。"); #endif // 筋一列を、クリアーします。 // 駒種類別、置こうとする升 aMasus[(int)PieceType.P] = aMasus[(int)PieceType.P].Minus_Closed( Masu_Honshogi.BAN_SUJIS[suji], Util_SyElement_BinaryOperator.Dlgt_Equals_MasuNumber); } } #if DEBUG //if (null != errH_orNull) //{ // Logger.Trace("歩の置けない筋チェック(二歩チェック)終了"); // Logger.Trace("----------------------------------------"); // Logger.Trace($"歩の置ける升={Util_SySet.Dump_Elements(aMasus[(int)Komasyurui14.H01_Fu_____])}"); // Logger.Trace("----------------------------------------"); //} #endif //---------------------------------------- // 打ち歩詰めチェック //---------------------------------------- if (false) { Util_Utifudume.Utifudume( src_Sky, masus_mikata_onBanjo, //打ち歩詰めチェック用 masus_aite_onBanjo, //打ち歩詰めチェック用 aMasus //駒種類別、置こうとする升 ); } } //---------------------------------------- // 集計 //---------------------------------------- // 「どの持ち駒を」「どこに置ける」のコレクション。 List_OneAndMulti <Finger, SySet <SyElement> > result = new List_OneAndMulti <Finger, SySet <SyElement> >(); foreach (PieceType ks in Array_Komasyurui.MotiKoma7Syurui) { // 置こうとする駒があれば if (null != aDaihyo[(int)ks]) { // 置けない升を引きます。 aMasus[(int)ks] = aMasus[(int)ks].Minus_Closed( motiOkenaiMasus, Util_SyElement_BinaryOperator.Dlgt_Equals_MasuNumber); if (!aMasus[(int)ks].IsEmptySet()) { // 置ける升があれば登録 result.AddNew( aFigKoma[(int)ks], //置こうとする持駒番号 aMasus[(int)ks] //置ける升 ); } } } return(result); }
/// <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 List_OneAndMulti <Finger, SySet <SyElement> > LAAAA_GetEffect( int yomikaisiTemezumi, bool isHonshogi, SkyConst src_Sky, Playerside pside_genTeban3, bool isAiteban, #if DEBUG KaisetuBoards logF_kiki, #endif string logBrd_caption, int temezumi_yomiCur_forLog, IMove move_forLog ) { #if DEBUG KaisetuBoard logBrd_kiki = new KaisetuBoard(); logBrd_kiki.Caption = logBrd_caption;// "利き_" logBrd_kiki.Temezumi = temezumi_yomiCur_forLog; logBrd_kiki.YomikaisiTemezumi = yomikaisiTemezumi; //logBrd_kiki.Score = 0.0d; logBrd_kiki.GenTeban = pside_genTeban3;// 現手番 logF_kiki.boards.Add(logBrd_kiki); #endif // 《1》 List_OneAndMulti <Finger, SySet <SyElement> > sMs_effect = new List_OneAndMulti <Finger, SySet <SyElement> >();//盤上の駒の利き { // 《1.1》 Playerside tebanSeme; //手番(利きを調べる側) Playerside tebanKurau; //手番(喰らう側) { if (isAiteban) { tebanSeme = Conv_Playerside.Reverse(pside_genTeban3); tebanKurau = pside_genTeban3; } else { tebanSeme = pside_genTeban3; tebanKurau = Conv_Playerside.Reverse(pside_genTeban3); } #if DEBUG if (Playerside.P1 == tebanSeme) { logBrd_kiki.NounaiSeme = Gkl_NounaiSeme.Sente; } else if (Playerside.P2 == tebanSeme) { logBrd_kiki.NounaiSeme = Gkl_NounaiSeme.Gote; } #endif } // 《1.2》 Fingers fingers_seme_BANJO; //盤上駒(利きを調べる側) Fingers fingers_kurau_BANJO; //盤上駒(喰らう側) Fingers dust1; Fingers dust2; Util_Sky_FingersQueryFx.Split_BanjoSeme_BanjoKurau_MotiSeme_MotiKurau( out fingers_seme_BANJO, out fingers_kurau_BANJO, out dust1, out dust2, src_Sky, tebanSeme, tebanKurau ); // 攻め手の駒の位置 #if DEBUG KaisetuBoard boardLog_clone = new KaisetuBoard(logBrd_kiki); foreach (Finger finger in fingers_seme_BANJO.Items) { RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(finger).Now); Gkl_KomaMasu km = new Gkl_KomaMasu( Util_Converter_LogGraphicEx.PsideKs14_ToString(tebanSeme, Util_Komahaiyaku184.Syurui(koma.Haiyaku), ""), Conv_SyElement.ToMasuNumber(koma.Masu) ); boardLog_clone.KomaMasu1.Add(km); } foreach (Finger finger in fingers_kurau_BANJO.Items) { RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(finger).Now); logBrd_kiki.KomaMasu2.Add(new Gkl_KomaMasu( Util_Converter_LogGraphicEx.PsideKs14_ToString(tebanKurau, Util_Komahaiyaku184.Syurui(koma.Haiyaku), ""), Conv_SyElement.ToMasuNumber(koma.Masu) )); } logBrd_kiki = boardLog_clone; #endif // 《1.3》 SySet <SyElement> masus_seme_BANJO = Conv_Fingers.ToMasus(fingers_seme_BANJO, src_Sky); // 盤上のマス(利きを調べる側の駒) SySet <SyElement> masus_kurau_BANJO = Conv_Fingers.ToMasus(fingers_kurau_BANJO, src_Sky); // 盤上のマス(喰らう側の駒) // 駒のマスの位置は、特にログに取らない。 // 《1.4》 Maps_OneAndOne <Finger, SySet <SyElement> > kmEffect_seme_BANJO = Query_FingersMasusSky.To_KomabetuKiki_OnBanjo( fingers_seme_BANJO,//この中身がおかしい。 masus_seme_BANJO, masus_kurau_BANJO, src_Sky //Conv_Move.Move_To_KsString_ForLog(move_forLog, pside_genTeban3), );// 利きを調べる側の利き(戦駒) // 盤上駒の利き #if DEBUG logBrd_kiki = new KaisetuBoard(logBrd_kiki); kmEffect_seme_BANJO.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) => { RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(key).Now); string komaImg = Util_Converter_LogGraphicEx.PsideKs14_ToString(tebanSeme, Util_Komahaiyaku184.Syurui(koma.Haiyaku), ""); foreach (New_Basho masu in value.Elements) { boardLog_clone.Masu_theEffect.Add(masu.MasuNumber); } }); logBrd_kiki = boardLog_clone; #endif // 《1》 = 《1.4》の盤上駒+持駒 sMs_effect.AddRange_New(kmEffect_seme_BANJO); } return(sMs_effect); }
/// <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); }