public void AddRange_New(List_OneAndMulti <T1, T2> om) { om.Foreach_Entry((T1 key, T2 value, ref bool toBreak) => { this.AddNew(key, value); }); }
//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> /// <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> /// 利きに飛び込んでいないか(王手されていないか)、調べます。 /// /// 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); }