/// <summary> /// 二歩防止 /// </summary> public static void SiborikomiByNifu() { bbTmp_nifu.Clear(); Piece hiyoko = Med_Koma.KomasyuruiAndTaikyokusyaToKoma(Komasyurui.H, PureMemory.kifu_teban); for (int iSuji = 0; iSuji < PureSettei.banYokoHaba; iSuji++) { PureMemory.gky_ky.shogiban.yomiIbashoBan_yoko.ToSet_Koma(hiyoko, bbTmp_nifu); //自分の歩 bbTmp_nifu.Siborikomi(BitboardsOmatome.bb_sujiArray[iSuji]); //調べる筋だけ残す if (!bbTmp_nifu.IsEmpty()) { PureMemory.ssss_bbVar_idosaki_narazu.Sitdown(BitboardsOmatome.bb_sujiArray[iSuji]); } } }
/// <summary> /// 被王手されている情報を調べるぜ☆(^~^) /// 手番側を設定するんだぜ☆(^~^) /// </summary> /// <param name="gky"></param> /// <param name="isHouimouCheck">包囲網チェック</param> /// <returns></returns> public static void Tukurinaosi_1( Taikyokusya irekaeTeban, // 入れ替える Taikyokusya irekaeAiteban, // 入れ替える bool isHouimouCheck ) { bbVar_nigemiti.Clear(); PureMemory.hot_bb_checkerAr[(int)irekaeTeban].Clear(); PureMemory.hot_bb_nigereruAr[(int)irekaeTeban].Clear(); PureMemory.hot_outeKomasCountAr[(int)irekaeTeban] = 0; PureMemory.hot_isNigerarenaiCheckerAr[(int)irekaeTeban] = false; PureMemory.hot_bb_nigemitiWoFusaideiruAiteNoKomaAr[(int)irekaeTeban].Clear(); //らいおんが盤上にいないこともあるぜ☆(^▽^) if (Conv_Masu.masu_error != PureMemory.hot_ms_raionAr[(int)irekaeTeban]) { // 手番らいおんの8近傍の升☆(^▽^) Debug.Assert((int)Komasyurui.R < Conv_Komasyurui.itiran.Length, ""); Debug.Assert((int)irekaeTeban < Conv_Taikyokusya.itiran.Length, ""); Debug.Assert((int)irekaeAiteban < Conv_Taikyokusya.itiran.Length, ""); Debug.Assert((int)PureMemory.hot_ms_raionAr[(int)irekaeTeban] < PureSettei.banHeimen, ""); // らいおんが逃げれる8近傍の升☆(^▽^) // <編集> PureMemory.hot_bb_nigereruAr[(int)irekaeTeban].Set(PureMemory.hot_bb_raion8KinboAr[(int)irekaeTeban]); // <影響> PureMemory.gky_ky.yomiKy.yomiShogiban.yomiIbashoBan.ToSitdown_KomaZenbu(irekaeTeban, PureMemory.hot_bb_nigereruAr[(int)irekaeTeban]); PureMemory.gky_ky.yomiKy.yomiShogiban.yomiKikiBan.ToSitdown_BBKikiZenbu(irekaeAiteban, PureMemory.hot_bb_nigereruAr[(int)irekaeTeban]); // 手番の らいおん の // - 8近傍 // - タテ筋 // - ヨコ筋 // - 左上がり筋 // - 左下がり筋 // を調べて、王手をかけている駒を一覧するぜ☆(^▽^) Masu ms_checker; bbVar_checker.Set(PureMemory.hot_bb_raion8KinboAr[(int)irekaeTeban]); // きりんとぞうは、先後同形☆(^~^) BitboardsOmatome.KomanoUgokikataYk00.ToStandup_Merge(Piece.R1, PureMemory.hot_ms_raionAr[(int)irekaeTeban], bbVar_checker); BitboardsOmatome.KomanoUgokikataYk00.ToStandup_Merge(Piece.B1, PureMemory.hot_ms_raionAr[(int)irekaeTeban], bbVar_checker); // いのししは先後別☆(^~^) switch (irekaeAiteban) { case Taikyokusya.T1: BitboardsOmatome.KomanoUgokikataYk00.ToStandup_Merge(Piece.L1, PureMemory.hot_ms_raionAr[(int)irekaeTeban], bbVar_checker); break; case Taikyokusya.T2: BitboardsOmatome.KomanoUgokikataYk00.ToStandup_Merge(Piece.L2, PureMemory.hot_ms_raionAr[(int)irekaeTeban], bbVar_checker); break; } while (bbVar_checker.Ref_PopNTZ(out ms_checker))// 立っているビットを降ろすぜ☆ { if (IsTobikondaKiki(irekaeAiteban, ms_checker, PureMemory.hot_ms_raionAr[(int)irekaeTeban])) { // <編集> PureMemory.hot_bb_checkerAr[(int)irekaeTeban].Standup(ms_checker); PureMemory.hot_outeKomasCountAr[(int)irekaeTeban]++; } } // 8方向に逃げ場がない場合は、王手を掛けてきている駒(チェッカー)を、 // ~~~~~~~~~~~~~~~~~~~~~~~~ // 必ず取り返して、その場にいようぜ☆ PureMemory.hot_isNigerarenaiCheckerAr[(int)irekaeTeban] = (0 < PureMemory.hot_outeKomasCountAr[(int)irekaeTeban] && PureMemory.hot_bb_nigereruAr[(int)irekaeTeban].IsEmpty()); if (isHouimouCheck) { // 編集 // らいおんが逃げようとする8マス☆(^~^) bbVar_nigemiti.Set(PureMemory.hot_bb_raion8KinboAr[(int)irekaeTeban]); // 影響 // 相手の利きで塞がれているところを消す☆(^~^) PureMemory.gky_ky.yomiKy.yomiShogiban.yomiKikiBan.ToSelect_BBKikiZenbu(irekaeAiteban, bbVar_nigemiti); // 自分の駒があるところを消す☆(^~^) PureMemory.gky_ky.shogiban.ibashoBan_yk00.yomiIbashoBan.ToSitdown_KomaZenbu(irekaeTeban, bbVar_nigemiti); Masu ms_fusagiMiti; while (bbVar_nigemiti.Ref_PopNTZ(out ms_fusagiMiti)) { // 塞がれている升の8近傍に、塞いでいる駒がいるだろう☆ foreach (Komasyurui ks_fusagi8Kinbo in Conv_Komasyurui.itiran) { // <編集> // 8近傍のそれぞれのマスについて、 // 相手の駒がそこに利きを利かしているかどうかを調べるには、 // 8近傍に自分の駒を置いて利きを調べれば、 // そこに利かしている相手の駒の場所が分かるぜ☆(^▽^) BitboardsOmatome.KomanoUgokikataYk00.ToSet_Merge( Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks_fusagi8Kinbo, irekaeTeban), ms_fusagiMiti, bbVar_kikasiteiruKoma ); // <影響> PureMemory.gky_ky.shogiban.ibashoBan_yk00.yomiIbashoBan.ToSelect_Koma(Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks_fusagi8Kinbo, irekaeAiteban), bbVar_kikasiteiruKoma); Masu ms_fusagi8KinboKoma; while (bbVar_kikasiteiruKoma.Ref_PopNTZ(out ms_fusagi8KinboKoma)) { PureMemory.hot_bb_nigemitiWoFusaideiruAiteNoKomaAr[(int)irekaeTeban].Standup(ms_fusagi8KinboKoma); } } } } } // 王手を掛けている駒を数えるぜ☆(^~^) if (PureMemory.hot_outeKomasCountAr[(int)irekaeTeban] < 1) { // 王手を掛けられていないか、 // 王手は掛けられているが逃げれる場合は、 // クリアー PureMemory.hot_bb_nigeroAr[(int)irekaeTeban].Clear(); } }