Exemple #1
0
        /// <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]);
                }
            }
        }
Exemple #2
0
        /// <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();
            }
        }