public void AddRange_New(Maps_OneAndOne <T1, T2> oo) { oo.Foreach_Entry((T1 key, T2 value, ref bool toBreak) => { this.AddNew(key, value); }); }
public static string Kamd_ToTerm(Maps_OneAndOne <Finger, SySet <SyElement> > kamd) { StringBuilder sb = new StringBuilder(); kamd.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) => { sb.AppendLine($"entry.Key={key}"); sb.AppendLine(ShogibanTermDisplay.Masus_ToTerm(value)); sb.AppendLine(" ");//空行 }); return(sb.ToString()); }
public static string LogString_Set( Maps_OneAndOne <Finger, SySet <SyElement> > komabetuMasus ) { StringBuilder sb = new StringBuilder(); // 全要素 komabetuMasus.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) => { sb.AppendLine($"駒=[{key}]"); sb.AppendLine(Util_Masus <New_Basho> .LogString_Concrete(value)); }); return(sb.ToString()); }
public static string Dump( Maps_OneAndOne <Finger, SySet <SyElement> > komabetuMasus ) { StringBuilder sb = new StringBuilder(); komabetuMasus.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) => { foreach (New_Basho masu in value.Elements) { sb.AppendLine($"finger=[{key.ToString()}] masu=[{value.ToString()}]"); } }); return(sb.ToString()); }
/// <summary> /// FIXME: 使ってない? /// /// 変換「自駒が動ける升」→「自駒が動ける手」 /// </summary> /// <param name="kmDic_Self"></param> /// <returns></returns> public static Maps_OneAndMulti <Finger, IMove> ToKomabetuMove( Maps_OneAndOne <Finger, SySet <SyElement> > kmDic_Self, Node <IMove, KyokumenWrapper> siteiNode_genzai ) { Maps_OneAndMulti <Finger, IMove> komaTe = new Maps_OneAndMulti <Finger, IMove>(); // // kmDic_Self.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) => { foreach (SyElement masuHandle in value.Elements) { RO_Star koma = Util_Starlightable.AsKoma(siteiNode_genzai.Value.KyokumenConst.StarlightIndexOf(key).Now); IMove move = new RO_Starbeam( //key, // 元 koma, // 先 new RO_Star( koma.Pside, Masu_Honshogi.Masus_All[Conv_SyElement.ToMasuNumber(masuHandle)], koma.Haiyaku //TODO:成るとか考えたい ), PieceType.None //取った駒不明 ); //sbSfen.Append(sbSfen.ToString()); if (komaTe.ContainsKey(key)) { // すでに登録されている駒 komaTe.AddExists(key, move); } else { // まだ登録されていない駒 komaTe.AddNew(key, move); } } }); return(komaTe); }
/// <summary> /// 駒別マスをJSON化します。 /// </summary> /// <param name="enableLog"></param> /// <param name="src_Sky_base"></param> /// <param name="km_move"></param> /// <param name="comment"></param> /// <returns></returns> public static string JsonKyokumens_MultiKomabetuMasus(bool enableLog, SkyConst src_Sky_base, Maps_OneAndOne <Finger, SySet <SyElement> > km_move, string comment) { StringBuilder sb = new StringBuilder(); if (!enableLog) { goto gt_EndMethod; } km_move.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) => { // 駒1つ RO_Star koma = Util_Starlightable.AsKoma(src_Sky_base.StarlightIndexOf(key).Now); PieceType ks14 = Util_Komahaiyaku184.Syurui(koma.Haiyaku); sb.AppendLine(" ["); // マスの色 sb.AppendLine(" { act:\"colorMasu\", style:\"rgba(100,240,100,0.5)\" },"); // 全マス foreach (New_Basho masu in value.Elements) { sb.AppendLine($" {{ act:\"drawMasu\" , masu:{masu.MasuNumber} }},"); } string komaImg = Util_Converter_LogGraphicEx.Finger_ToString(src_Sky_base, key, ""); sb.AppendLine($" {{ act:\"drawImg\", img:\"{komaImg}\", masu: {Conv_SyElement.ToMasuNumber(koma.Masu)} }},");//FIXME:おかしい? // コメント sb.AppendLine($" {{ act:\"drawText\", text:\"{comment}\" , x:0, y:20 }},"); sb.AppendLine(" ],"); }); gt_EndMethod: return(sb.ToString()); }
public static Dictionary <string, SasuEntry> ToMoveBetuSky1( Maps_OneAndOne <Finger, SySet <SyElement> > komabetuSusumuMasus, SkyConst src_Sky ) { Dictionary <string, SasuEntry> result_komabetuEntry = new Dictionary <string, SasuEntry>(); komabetuSusumuMasus.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( //key, 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);//重複防止用のキー if (!result_komabetuEntry.ContainsKey(moveStr)) { result_komabetuEntry.Add( moveStr, new SasuEntry( move, key, //動かす駒 dstMasu, //移動先升 false //成りません ) ); } } }); return(result_komabetuEntry); }
public static string LogString_Concrete( Maps_OneAndOne <Finger, SySet <SyElement> > komabetuMasus ) { StringBuilder sb = new StringBuilder(); komabetuMasus.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) => { sb.Append("[駒"); sb.Append(key); sb.Append("]"); foreach (New_Basho masu in value.Elements) { sb.Append(Util_Masus <New_Basho> .LogString_Concrete(value)); //sb.Append(Masu81Array.Items[hMasu].ToString()); } }); return(sb.ToString()); }
/// <summary> /// マージします。 /// </summary> /// <param name="right"></param> public static void Merge( Maps_OneAndOne <Finger, SySet <SyElement> > komabetuMasus, Maps_OneAndOne <Finger, SySet <SyElement> > right ) { right.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) => { Util_Sky258A.AddOverwrite(komabetuMasus, key, value); //if (komabetuMasus.entries.ContainsKey(entry.Key)) //{ // // キーが重複していれば、value同士でマージします。 // komabetuMasus.entries[entry.Key].AddSupersets(entry.Value); //} //else //{ // // 新キーなら // komabetuMasus.entries.Add(entry.Key, entry.Value); //} }); }
public void Log4( SkyConst src_Sky, Playerside tebanSeme,//手番(利きを調べる側) Maps_OneAndOne <Finger, SySet <SyElement> > kmMove_seme_IKUSA ) { // 戦駒の移動可能場所 KaisetuBoard boardLog_clone = new KaisetuBoard(this.BrdMove); kmMove_seme_IKUSA.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_theMove.Add((int)masu.MasuNumber); } }); this.BrdMove = boardLog_clone; }
/// <summary> /// 打ち歩詰め処理。 /// /// TODO:打ち歩詰めチェック /// </summary> public static void Utifudume( SkyConst src_Sky, SySet <SyElement> masus_mikata_onBanjo, //打ち歩詰めチェック用 SySet <SyElement> masus_aite_onBanjo, //打ち歩詰めチェック用 SySet <SyElement>[] aMasus //駒種類別、置こうとする升 ) { // 攻め側 Playerside pside_seme = src_Sky.KaisiPside; // 相手の王の位置 RO_Star king_aite; Finger figKing_aite; Playerside pside_aite; switch (src_Sky.KaisiPside) { case Playerside.P1: pside_aite = Playerside.P2; figKing_aite = Finger_Honshogi.GoteOh; king_aite = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figKing_aite).Now); break; case Playerside.P2: pside_aite = Playerside.P1; figKing_aite = Finger_Honshogi.SenteOh; king_aite = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figKing_aite).Now); break; default: throw new Exception("エラー:打ち歩詰めチェック中。プレイヤー不明。"); } // 相手の玉頭の升。 SyElement masu_gyokutou = null; { SySet <SyElement> sySet = KomanoKidou.DstIppo_上(pside_aite, king_aite.Masu); foreach (SyElement element2 in sySet.Elements)//最初の1件を取る。 { masu_gyokutou = element2; break; } if (null == masu_gyokutou) { goto gt_EndUtifudume; } } // 相手の玉。 Fingers fingers_aiteKing = new Fingers(); fingers_aiteKing.Add(figKing_aite); // 相手の玉頭に、自分側の利きがあるかどうか。 bool isKiki_mikata = false; { // 利き一覧 Maps_OneAndOne <Finger, SySet <SyElement> > kikiMap = Query_FingersMasusSky.To_KomabetuKiki_OnBanjo( fingers_aiteKing, masus_mikata_onBanjo, masus_aite_onBanjo, src_Sky ); int gyokutouMasuNumber = Conv_SyElement.ToMasuNumber(masu_gyokutou); kikiMap.Foreach_Values((SySet <SyElement> values, ref bool toBreak) => { foreach (SyElement element in values.Elements) { int masuNumber = Conv_SyElement.ToMasuNumber(element); if (masuNumber == gyokutouMasuNumber) { isKiki_mikata = true; toBreak = true; break; } } }); } if (!isKiki_mikata) { goto gt_EndUtifudume; } // 相手の玉頭に、利きのある相手側の駒の種類の一覧。 List <PieceType> ksList = new List <PieceType>(); SySet <SyElement> aitegyokuKiki; { // 相手側の盤上の駒一覧。 Fingers fingers_aiteKoma_Banjo = Util_Sky_FingersQuery.InOkibaPsideNow(src_Sky, Okiba.ShogiBan, pside_aite); // 利き一覧 Maps_OneAndOne <Finger, SySet <SyElement> > kikiMap = Query_FingersMasusSky.To_KomabetuKiki_OnBanjo( fingers_aiteKoma_Banjo, masus_aite_onBanjo, //相手の駒は、味方 masus_mikata_onBanjo, //味方の駒は、障害物。 src_Sky ); aitegyokuKiki = kikiMap.ElementAt(figKing_aite); int gyokutouMasuNumber = Conv_SyElement.ToMasuNumber(masu_gyokutou); kikiMap.Foreach_Entry((Finger figKoma, SySet <SyElement> values, ref bool toBreak) => { foreach (SyElement element in values.Elements) { int masuNumber = Conv_SyElement.ToMasuNumber(element); if (masuNumber == gyokutouMasuNumber) { ksList.Add(Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now).Komasyurui); break; } } }); } // 「王様でしか取れない状態」ではなければ、スルー。 if (ksList.Count != 1) { goto gt_EndUtifudume; } else if (ksList[0] != PieceType.K) { goto gt_EndUtifudume; } // 「王様に逃げ道がある」なら、スルー。 MasubetuKikisu masubetuKikisu_semeKoma = Util_SkyPside.ToMasubetuKikisu(src_Sky, pside_seme); Dictionary <int, int> nigerarenaiMap = new Dictionary <int, int>(); switch (src_Sky.KaisiPside) { case Playerside.P1: nigerarenaiMap = masubetuKikisu_semeKoma.Kikisu_AtMasu_2P; break; case Playerside.P2: nigerarenaiMap = masubetuKikisu_semeKoma.Kikisu_AtMasu_1P; break; default: throw new Exception("エラー:打ち歩詰めチェック中。プレイヤー不明。"); } foreach (SyElement element in aitegyokuKiki.Elements) { // 攻撃側の利きが利いていない、空きマスがあるかどうか。 int movableMasuNumber_king = Conv_SyElement.ToMasuNumber(element); if (nigerarenaiMap[movableMasuNumber_king] == 0) { // 逃げ切った☆! goto gt_EndUtifudume; } } //---------------------------------------- // 打ち歩詰め確定 //---------------------------------------- // 1升(玉頭升)を、クリアーします。 aMasus[(int)PieceType.P].Minus_Closed( masu_gyokutou, Util_SyElement_BinaryOperator.Dlgt_Equals_MasuNumber); gt_EndUtifudume: ; }
/// <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); }