/// <summary> /// 持駒を取得。 /// </summary> /// <param name="fingers_banjoSeme"></param> /// <param name="fingers_banjoKurau"></param> /// <param name="fingers_motiSeme"></param> /// <param name="fingers_motiKurau"></param> /// <param name="src_Sky"></param> /// <param name="tebanSeme"></param> /// <param name="tebanKurau"></param> public static void Split_Moti1p_Moti2p( out Fingers fingers_moti1p, // 持駒 1P out Fingers fingers_moti2p, // 持駒 2= SkyConst src_Sky ) { Fingers fingers_moti1p_temp = new Fingers(); // (3)持ち駒_攻め手 Fingers fingers_moti2p_temp = new Fingers(); // (4)持ち駒_食らう側 src_Sky.Foreach_Starlights((Finger finger, IMoveHalf dd, ref bool toBreak) => { RO_Star koma = Util_Starlightable.AsKoma(dd.Now); if (Conv_SyElement.ToOkiba(koma.Masu) == Okiba.Sente_Komadai) { // // 1P 駒台 // fingers_moti1p_temp.Add(finger); } else if (Conv_SyElement.ToOkiba(koma.Masu) == Okiba.Gote_Komadai) { // // 2P 駒台 // fingers_moti2p_temp.Add(finger); } }); fingers_moti1p = fingers_moti1p_temp; fingers_moti2p = fingers_moti2p_temp; }
/// <summary> /// ************************************************************************************************************************ /// 天上のすべての星の光 /// ************************************************************************************************************************ /// </summary> /// <param name="kifu"></param> /// <param name="okiba"></param> /// <returns></returns> public Fingers Fingers_All() { Fingers fingers = new Fingers(); this.Foreach_Starlights((Finger finger, IMoveHalf light, ref bool toBreak) => { fingers.Add(finger); }); return(fingers); }
/// <summary> /// ************************************************************************************************************************ /// 軌道上の駒たち /// ************************************************************************************************************************ /// </summary> /// <param name="km"></param> /// <returns></returns> public static void Fingers_EachSrcNow(out Fingers out_fingers, SySet <SyElement> srcList, SkyConst src_Sky, Playerside pside, IMoveHalf itaru) { out_fingers = new Fingers(); foreach (SyElement masu in srcList.Elements) { Finger finger = Util_Sky_FingerQuery.InShogibanMasuNow(src_Sky, pside, masu); if (Util_Finger.ForHonshogi(finger)) { // 指定の升に駒がありました。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> out_fingers.Add(finger); } } }
/// <summary> /// 駒のハンドルを返します。 /// </summary> /// <param name="pside"></param> /// <param name="hKomas"></param> /// <returns></returns> public static Fingers InPsideNow(SkyConst srcSky, Playerside pside) { Fingers fingers = new Fingers(); srcSky.Foreach_Starlights((Finger finger, IMoveHalf ds, ref bool toBreak) => { RO_Star koma = Util_Starlightable.AsKoma(ds.Now); if (pside == koma.Pside) { fingers.Add(finger); } }); return(fingers); }
/// <summary> /// ************************************************************************************************************************ /// 指定のマスにあるスプライトを返します。(本将棋用) /// ************************************************************************************************************************ /// </summary> /// <param name="masu">マス番号</param> /// <param name="logTag">ログ名</param> /// <returns>スプライト番号。なければエラー番号。</returns> public static Fingers InMasuNow(SkyConst src_Sky, SyElement masu) { Fingers found = new Fingers(); foreach (Finger finger in Finger_Honshogi.Items_KomaOnly) { RO_Star koma = Util_Koma.FromFinger(src_Sky, finger); if (Masu_Honshogi.Basho_Equals(koma.Masu, masu)) { found.Add(finger); } } return(found); }
/// <summary> /// 駒のハンドル(*1)を返します。 /// /// *1…将棋の駒1つ1つに付けられた番号です。 /// /// </summary> /// <param name="syurui"></param> /// <param name="hKomas"></param> /// <returns></returns> public static Fingers InKomasyuruiNow(SkyConst src_Sky, PieceType syurui) { Fingers figKomas = new Fingers(); foreach (Finger figKoma in Finger_Honshogi.Items_KomaOnly) { RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now); if (Util_Komasyurui14.Matches(syurui, Util_Komahaiyaku184.Syurui(koma.Haiyaku))) { figKomas.Add(figKoma); } } return(figKomas); }
/// <summary> /// 指定した置き場にある駒のハンドルを返します。 /// </summary> /// <param name="kifu"></param> /// <param name="okiba"></param> /// <returns></returns> public static Fingers InOkibaNow(SkyConst src_Sky, Okiba okiba) { Fingers komas = new Fingers(); foreach (Finger figKoma in Finger_Honshogi.Items_KomaOnly) { RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now); if (okiba == Conv_SyElement.ToOkiba(koma.Masu)) { komas.Add(figKoma); } } return(komas); }
/// <summary> /// ********************************************************************************************************************** /// 駒のハンドルを返します。 /// ********************************************************************************************************************** /// </summary> /// <param name="okiba"></param> /// <param name="kifuD"></param> /// <returns></returns> public static Fingers InOkibaPsideNow(SkyConst src_Sky, Okiba okiba, Playerside pside) { Fingers fingers = new Fingers(); src_Sky.Foreach_Starlights((Finger finger, IMoveHalf dd, ref bool toBreak) => { RO_Star koma = Util_Starlightable.AsKoma(dd.Now); if (Conv_SyElement.ToOkiba(koma.Masu) == okiba && pside == koma.Pside ) { fingers.Add(finger); } }); return(fingers); }
/// <summary> /// ************************************************************************************************************************ /// 駒のハンドルを返します。 : 置き場、種類 /// ************************************************************************************************************************ /// </summary> /// <param name="okiba"></param> /// <param name="syurui"></param> /// <param name="kifu"></param> /// <returns></returns> public static Fingers InOkibaKomasyuruiNow(SkyConst src_Sky, Okiba okiba, PieceType syurui) { Fingers komas = new Fingers(); foreach (Finger figKoma in Finger_Honshogi.Items_KomaOnly) { RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now); if ( okiba == Conv_SyElement.ToOkiba(koma.Masu) && Util_Komasyurui14.Matches(syurui, koma.Komasyurui) // Util_Komahaiyaku184.Syurui(koma.Haiyaku) ) { komas.Add(figKoma); } } return(komas); }
/// <summary> /// ************************************************************************************************************************ /// 局面上のオブジェクトを返します。置き場、先後サイド、駒の種類で絞りこみます。 /// ************************************************************************************************************************ /// </summary> /// <param name="src_Sky">局面データ。</param> /// <param name="okiba">置き場。</param> /// <param name="pside">先後サイド。</param> /// <param name="komaSyurui">駒の種類。</param> /// <returns></returns> public static Fingers InOkibaPsideKomasyuruiNow(SkyConst src_Sky, Okiba okiba, Playerside pside, PieceType komaSyurui) { Fingers fingers = new Fingers(); src_Sky.Foreach_Starlights((Finger finger, IMoveHalf light, ref bool toBreak) => { RO_Star koma = Util_Starlightable.AsKoma(light.Now); if ( okiba == Conv_SyElement.ToOkiba(koma.Masu) && pside == koma.Pside && komaSyurui == koma.Komasyurui ) { fingers.Add(finger); } }); return(fingers); }
/// <summary> /// ************************************************************************************************************************ /// 指定の筋にあるスプライトを返します。(本将棋用)二歩チェックに利用。 /// ************************************************************************************************************************ /// </summary> /// <param name="src_Sky"></param> /// <param name="okiba">置き場</param> /// <param name="pside">先後</param> /// <param name="pside">駒種類</param> /// <param name="suji">筋番号1~9</param> /// <returns></returns> public static Fingers InOkibaPsideKomasyuruiSujiNow(SkyConst src_Sky, Okiba okiba, Playerside pside, PieceType ks, int suji) { Fingers found = new Fingers(); foreach (Finger finger in Finger_Honshogi.Items_KomaOnly) { RO_Star koma2 = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(finger).Now); int suji2; Util_MasuNum.TryMasuToSuji(koma2.Masu, out suji2); if ( Conv_SyElement.ToOkiba(koma2.Masu) == okiba && koma2.Pside == pside && koma2.Komasyurui == ks && suji2 == suji ) { found.Add(finger); } } return(found); }
/// <summary> /// 4分割します。 /// </summary> /// <param name="fs_banjoSeme">fingers</param> /// <param name="fs_banjoKurau"></param> /// <param name="fs_motiSeme"></param> /// <param name="fs_motiKurau"></param> /// <param name="src_Sky"></param> /// <param name="tebanSeme"></param> /// <param name="tebanKurau"></param> public static void Split_BanjoSeme_BanjoKurau_MotiSeme_MotiKurau( out Fingers fs_banjoSeme, //戦駒(利きを調べる側) out Fingers fs_banjoKurau, //戦駒(喰らう側) out Fingers fs_motiSeme, // 持駒(利きを調べる側) out Fingers fs_motiKurau, // 持駒(喰らう側) SkyConst src_Sky, Playerside tebanSeme, Playerside tebanKurau ) { Fingers fs_banjoSeme_temp = new Fingers(); // (1)盤上駒_攻め手 Fingers fs_banjoKurau_temp = new Fingers(); // (2)盤上駒_食らう側 Fingers fs_motiSeme_temp = new Fingers(); // (3)持ち駒_攻め手 Fingers fs_motiKurau_temp = new Fingers(); // (4)持ち駒_食らう側 src_Sky.Foreach_Starlights((Finger finger, IMoveHalf light, ref bool toBreak) => { RO_Star star = Util_Starlightable.AsKoma(light.Now);//駒 if (Conv_SyElement.ToOkiba(star.Masu) == Okiba.ShogiBan) { // // 盤上 // if (tebanSeme == star.Pside) { fs_banjoSeme_temp.Add(finger);// (1)盤上駒_攻め手 } else if (tebanKurau == star.Pside) { fs_banjoKurau_temp.Add(finger);// (2)盤上駒_食らう側 } } else if (Conv_SyElement.ToOkiba(star.Masu) == Okiba.Sente_Komadai) { // // P1駒台 // if (tebanSeme == Playerside.P1) { // 攻手がP1のとき、P1駒台は。 fs_motiSeme_temp.Add(finger);// (3)持ち駒_攻め手 } else if (tebanSeme == Playerside.P2) { // 攻手がP2のとき、P1駒台は。 fs_motiKurau_temp.Add(finger);// (4)持ち駒_食らう側 } else { throw new Exception("駒台の持ち駒を調べようとしましたが、先手でも、後手でもない指定でした。"); } } else if (Conv_SyElement.ToOkiba(star.Masu) == Okiba.Gote_Komadai) { // // P2駒台 // if (tebanSeme == Playerside.P1) { // 攻手がP1のとき、P2駒台は。 fs_motiKurau_temp.Add(finger);// (3)持ち駒_攻め手 } else if (tebanSeme == Playerside.P2) { // 攻手がP2のとき、P2駒台は。 fs_motiSeme_temp.Add(finger);// (4)持ち駒_食らう側 } else { throw new Exception("駒台の持ち駒を調べようとしましたが、先手でも、後手でもない指定でした。"); } } else { throw new Exception("駒台の持ち駒を調べようとしましたが、盤上でも、駒台でもない指定でした。"); } }); fs_banjoSeme = fs_banjoSeme_temp; // (1)盤上駒_攻め手 fs_banjoKurau = fs_banjoKurau_temp; // (2)盤上駒_食らう側 fs_motiSeme = fs_motiSeme_temp; // (3)持ち駒_攻め手 fs_motiKurau = fs_motiKurau_temp; // (4)持ち駒_食らう側 }
/// <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: ; }