Example #1
0
        /// <summary>
        /// 一手詰めの局面かどうか調べるぜ☆(^▽^)
        ///
        /// 自分が一手詰めを掛けられるから、この指し手は作らないでおこう、といった使い方がされるぜ☆(^▽^)
        ///
        /// FIXME: 持ち駒の打ちにも使えないか☆(^~^)?
        /// </summary>
        /// <param name="fukasa"></param>
        /// <param name="ky2"></param>
        /// <param name="ms_src">持ち駒の場合、エラー値</param>
        /// <param name="mks">持ち駒の場合、持駒の種類</param>
        /// <param name="ms_t1"></param>
        /// <param name="tebanHioute"></param>
        /// <returns></returns>
        public static bool CheckBegin_Ittedume_MotiKoma()
        {
            if (!PureSettei.ittedumeTukau)
            {
                return(false);
            }

            if (!Conv_Motigoma.IsOk(PureMemory.ssss_mot_mg))
            {
                throw new Exception("持ち駒じゃないじゃないか☆(^▽^)www");
            }

            // A B  C
            // ┌──┬──┬──┐
            //1│  │▽ら│  │
            // ├──┼──┼──┤
            //2│▲き│  │▲き│
            // ├──┼──┼──┤
            //3│  │▲に│▲ら│
            // ├──┼──┼──┤
            //4│▲ぞ│▲ひ│▲ぞ│
            // └──┴──┴──┘

            // 盤上の駒を動かすのか、駒台の駒を打つのかによって、利き の形が異なるぜ☆(^~^)
            Bitboard bb_kiki_t1 = BitboardsOmatome.KomanoUgokikataYk00.Clone_Merge(Med_Koma.MotiKomaToKoma(PureMemory.ssss_mot_mg), PureMemory.ssss_ugoki_ms_dst);

            if (!PureMemory.gky_ky.shogiban.yomiIbashoBan_yoko.IsIntersect(Med_Koma.ToRaion(PureMemory.kifu_aiteban), // 相手らいおんの場所☆
                                                                           bb_kiki_t1))                               // 相手らいおん が、動かした駒の、利きの中に居ないんだったら、一手詰め にはならないぜ☆(^~^)
            {
                // FIXME: ステイルメイトは考えてないぜ☆(>_<)
                return(false);
            }

            Piece km_t1 = Med_Koma.MotiKomaToKoma(PureMemory.ssss_mot_mg);//t0も同じ

            // FIXME: ↓駒移動後の、利きを取る必要がある
            Bitboard bb_kikiNewJibun = new Bitboard();
            {
                // 打による、重ね利きの数を差分更新するぜ☆(^▽^)
                //, ky.BB_KikiZenbu
                // 移動先の駒の利きを増やすぜ☆(^▽^)
                PureMemory.gky_ky.shogiban.kikiBan.OkuKiki(km_t1, PureMemory.ssss_ugoki_ms_dst);

                // こっちの利きを作り直し
                bb_kikiNewJibun = PureMemory.gky_ky.shogiban.kikiBan.RefBB_FromKikisuZenbuPositiveNumber(Med_Koma.MotiKomaToTaikyokusya(PureMemory.ssss_mot_mg));

                // 打による、重ね利きの数の差分更新を元に戻すぜ☆(^▽^)
                // 移動先の駒の利きを減らすぜ☆(^▽^)
                PureMemory.gky_ky.shogiban.kikiBan.TorinozokuKiki(km_t1, PureMemory.ssss_ugoki_ms_dst);
            }

            // 相手らいおんが逃げようとしていて。
            Bitboard bb1 = PureMemory.hot_bb_raion8KinboAr[PureMemory.kifu_nAiteban].Clone();                          // 相手らいおんの8近傍

            PureMemory.gky_ky.shogiban.ibashoBan_yk00.yomiIbashoBan.ToSitdown_KomaZenbu(PureMemory.kifu_aiteban, bb1); // 相手の駒がない升
            return
                (bb1.Sitdown(bb_kikiNewJibun)                                                                          // こっちの利きがない升
                 .IsEmpty());                                                                                          // 相手らいおん が逃げれる升がない場合、詰み☆
        }