Ejemplo n.º 1
0
            public Bitboard Nukidasi(Masu atama, int haba)
            {
                Bitboard bb = CloneBB();

#if DEBUG
                PureMemory.ssssDbg_bb_ojamaTai = bb.Clone();
#endif
                return(Nukidasi_1(atama, haba, bb));
            }
Ejemplo n.º 2
0
            public void Tukurinaosi()
            {
                //// 新規生成
                //valueTaiMs = new int[Conv_Taikyokusya.itiran.Length][];

                Bitboard bbVar_ibasho    = new Bitboard();
                Bitboard bbVar_ugokikata = new Bitboard();

                foreach (Taikyokusya tai in Conv_Taikyokusya.itiran)
                {
                    // とりあえず一旦クリアー☆(^~^)
                    valueTaiMs[(int)tai] = new int[PureSettei.banHeimen];
                    valueTai[(int)tai]   = 0;

                    // 全ての駒種類について☆(^~^)
                    foreach (Komasyurui ks in Conv_Komasyurui.itiran)
                    {
                        Piece km = Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, tai);
                        PureMemory.gky_ky.yomiKy.yomiShogiban.yomiIbashoBan.ToSet_Koma(km,
                                                                                       bbVar_ibasho // 駒の場所をここに覚えるぜ☆(^~^)
                                                                                       );
#if DEBUG
                        Bitboard bb_copy = bbVar_ibasho.Clone();
#endif

                        Masu ms_ibasho;
                        while (bbVar_ibasho.Ref_PopNTZ(out ms_ibasho))
                        {
                            BitboardsOmatome.KomanoUgokikataYk00.ToSet_Merge(
                                km,
                                ms_ibasho,
                                bbVar_ugokikata // 駒の利きをここに覚えるぜ☆(^~^)
                                );
#if DEBUG
                            Bitboard bb_copy2 = bbVar_ugokikata.Clone();
#endif
                            // 利きを1升ずつカウントアップしていくぜ☆(^~^)
                            Masu ms_kiki;
                            while (bbVar_ugokikata.Ref_PopNTZ(out ms_kiki))
                            {
                                valueTaiMs[(int)tai][(int)ms_kiki]++;
                                valueTai[(int)tai]++;
                            }
                        }
                    }
                }
            }
Ejemplo n.º 3
0
            /// <summary>
            /// TODO: 45°回転盤の抜き出しなど
            /// </summary>
            /// <param name="tai"></param>
            /// <param name="atama"></param>
            /// <param name="haba"></param>
            /// <param name="bb_update"></param>
            /// <returns></returns>
            public static Bitboard Nukidasi_1(Masu atama, int haba, Bitboard bb_update)
            {
                int rightShift = (int)atama;

#if DEBUG
                PureMemory.ssssDbg_rightShift = rightShift;
#endif
                bb_update.RightShift(rightShift);
#if DEBUG
                PureMemory.ssssDbg_bb_rightShifted = bb_update.Clone();
#endif

                Bitboard mask = BitboardsOmatome.maskHyo[haba];
#if DEBUG
                PureMemory.ssssDbg_bb_mask = mask.Clone();
#endif

                bb_update.Siborikomi(mask);
                return(bb_update);
            }
Ejemplo n.º 4
0
        /// <summary>
        /// 相手番らいおん の逃げ道を開けてしまう、手番側の悪手かどうか調べるぜ☆(^▽^)
        /// </summary>
        /// <returns></returns>
        public static bool IsNigemitiWoAkeru()
        {
            if (PureMemory.hot_bb_nigemitiWoFusaideiruAiteNoKomaAr[PureMemory.kifu_nAiteban].IsOff(PureMemory.ssss_ugoki_ms_src))
            {
                // 逃げ道を塞いでいる駒ではないのなら、スルーするぜ☆(^▽^)
                return(false);//正常
            }


            // 手番らいおん の8近傍 のどこかに、重ね利きの数 0 が出来ていれば、
            // 逃げ道を開けると判定するぜ☆(^▽^)
            bool  akeru     = false;
            Piece km0_teban = Med_Koma.KomasyuruiAndTaikyokusyaToKoma(PureMemory.ssss_ugoki_ks, PureMemory.kifu_teban);
            Piece km1_teban = km0_teban;// FIXME: 成りを考慮していない


            //────────────────────────────────────────
            // (1)利き表をいじる前☆(^▽^)
            //────────────────────────────────────────

            // 2回以上使う
            Bitboard bbConst_kiki0 = BitboardsOmatome.KomanoUgokikataYk00.Clone_Merge(km0_teban, PureMemory.ssss_ugoki_ms_src);
            Bitboard bbVar_kiki    = bbConst_kiki0.Clone();

            if (!bbVar_kiki.IsEmpty())
            {
                //────────────────────────────────────────
                // (2)動く前の、駒の利きを、利き表から減らすぜ☆(^▽^)
                //────────────────────────────────────────
                //ビットボード使い回し
                PureMemory.gky_ky.shogiban.kikiBan.TorinozokuKiki(km0_teban, bbVar_kiki);
                // FIXME: ここで 利きの数が減っている必要がある
            }

            Bitboard kikiBB1_const = BitboardsOmatome.KomanoUgokikataYk00.Clone_Merge(km1_teban, PureMemory.ssss_ugoki_ms_dst);

            if (!kikiBB1_const.IsEmpty())
            {
                bbVar_kiki.Set(kikiBB1_const);
                //────────────────────────────────────────
                // (3)動いた後の、駒の動きを、利き表へ足すぜ☆(^▽^)
                //────────────────────────────────────────
                //ビットボード使い回し
                PureMemory.gky_ky.shogiban.kikiBan.OkuKiki(km1_teban, bbVar_kiki);
            }

            // 動いたことで、らいおんの逃げ道を塞いでいた駒が、らいおんの逃げ道を空けてしまうか☆(^~^)
            Bitboard nigemitiBB = new Bitboard();

            nigemitiBB.Set(PureMemory.hot_bb_raion8KinboAr[PureMemory.kifu_nAiteban]);
            PureMemory.gky_ky.shogiban.ibashoBan_yk00.yomiIbashoBan.ToSitdown_KomaZenbu(PureMemory.kifu_aiteban, nigemitiBB);

            Masu ms_nigemiti;

            while (nigemitiBB.Ref_PopNTZ(out ms_nigemiti))
            {
                // 手番の利きが無くなったか☆(^▽^)
                if (0 == PureMemory.gky_ky.yomiKy.yomiShogiban.yomiKikiBan.CountKikisuZenbu(PureMemory.kifu_teban, ms_nigemiti))
                {
                    akeru = true; // (^▽^)相手らいおんの逃げ道が開いたぜ☆!
                    goto gt_EndLoop;
                }
            }
gt_EndLoop:
            ;

            bbVar_kiki.Set(kikiBB1_const);
            if (!bbVar_kiki.IsEmpty())
            {
                //────────────────────────────────────────
                // (4)増やした重ね利きの数を減らして、元に戻すぜ☆(^▽^)
                //────────────────────────────────────────
                //ビットボード使い回し
                PureMemory.gky_ky.shogiban.kikiBan.TorinozokuKiki(km1_teban, bbVar_kiki);
            }

            // 利き数は、まだ戻している途中

            bbVar_kiki.Set(bbConst_kiki0);
            if (!bbVar_kiki.IsEmpty())
            {
                //────────────────────────────────────────
                // (5)減らした重ね利きの数を増やして、元に戻すぜ☆(^▽^)
                //────────────────────────────────────────
                //ビットボード使い回し
                PureMemory.gky_ky.shogiban.kikiBan.OkuKiki(km0_teban, bbVar_kiki);
            }

            //────────────────────────────────────────
            // ここで、利きの数は現局面と合ってるはずだぜ☆(^~^)
            //────────────────────────────────────────
            return(akeru);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 仲間を支えていた駒が離れたら真だぜ☆(^▽^)www
        ///
        /// 利きテーブルをいじっているが、更新したいわけではないので、使い終わったら元に戻すぜ☆(^~^)
        /// </summary>
        /// <param name="out_ret"></param>
        /// <param name="ms_t0">移動元</param>
        /// <param name="ms_t1">移動先</param>
        /// <returns></returns>
        public static bool IsMisuteruUgoki()
        {
            // 升にある駒種類
            Komasyurui ks_t0;

            if (PureMemory.gky_ky.shogiban.ibashoBan_yk00.yomiIbashoBan.ExistsKoma(PureMemory.kifu_teban, PureMemory.ssss_ugoki_ms_src, out ks_t0))
            {
            }

            Piece km_t0 = Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks_t0, PureMemory.kifu_teban);
            Piece km_t1 = km_t0;     //FIXME:成りを考慮してないぜ☆(>_<)

            int sasaeBeforeMove = 0; // 移動前に、動こうとしている駒を支えている味方の数
            int sasaeAfterMove  = 0; // 移動後の、動いた駒を支えている味方の数

            // 移動前の駒の動き(2個作っておく)
            Bitboard bbConst_kiki0 = BitboardsOmatome.KomanoUgokikataYk00.Clone_Merge(km_t0, PureMemory.ssss_ugoki_ms_src);
            Bitboard bbVar_kiki    = bbConst_kiki0.Clone();

            if (!bbConst_kiki0.IsEmpty())
            {
                // 移動する前の、利き先の 利きの数を数えておこうぜ☆(^▽^)
                Masu ms_kiki;
                while (bbVar_kiki.Ref_PopNTZ(out ms_kiki))
                {
                    // 0以上なら駒の取り合いで勝つぜ☆(^▽^)
                    // 利き重ね = 自分の利き数 - 相手の利き数
                    int kasaneGake = PureMemory.gky_ky.shogiban.kikiBan.yomiKikiBan.CountKikisuZenbu(PureMemory.kifu_teban, ms_kiki) - PureMemory.gky_ky.shogiban.kikiBan.yomiKikiBan.CountKikisuZenbu(PureMemory.kifu_aiteban, ms_kiki);
                    if (0 < kasaneGake)
                    {
                        sasaeBeforeMove++;
                    }
                }

                //────────────────────────────────────────
                // 駒は動かさず、移動前の利きを消す(減らす)ぜ☆(^▽^)
                //────────────────────────────────────────
                bbVar_kiki.Set(bbConst_kiki0);
                //ビットボード使い回し
                PureMemory.gky_ky.shogiban.kikiBan.TorinozokuKiki(km_t0, bbVar_kiki);
            }


            // 移動先での駒の動き
            Bitboard bbConst_kiki1 = BitboardsOmatome.KomanoUgokikataYk00.Clone_Merge(km_t1, PureMemory.ssss_ugoki_ms_dst);

            if (!bbConst_kiki1.IsEmpty())
            {
                // 駒を移動させた想定で、利きの数を増やすぜ☆(^▽^)
                bbVar_kiki.Set(bbConst_kiki1);
                //ビットボード使い回し
                PureMemory.gky_ky.shogiban.kikiBan.OkuKiki(km_t1, bbVar_kiki);

                // 移動した後の、利き先の 利きの数を数えておこうぜ☆(^▽^)
                bbVar_kiki.Set(bbConst_kiki1);
                Masu ms_kiki;
                while (bbVar_kiki.Ref_PopNTZ(out ms_kiki))
                {
                    // 0以上なら駒の取り合いで勝つぜ☆(^▽^)
                    // 利き重ね = 自分の利き数 - 相手の利き数
                    int kasaneGake = PureMemory.gky_ky.shogiban.kikiBan.yomiKikiBan.CountKikisuZenbu(PureMemory.kifu_teban, ms_kiki) - PureMemory.gky_ky.shogiban.kikiBan.yomiKikiBan.CountKikisuZenbu(PureMemory.kifu_aiteban, ms_kiki);
                    if (0 < kasaneGake)
                    {
                        sasaeAfterMove++;
                    }
                }
            }

            //────────────────────────────────────────
            // 利き数表をいじったんで、元に戻しておこうぜ☆(^▽^)
            //────────────────────────────────────────
            {
                bbVar_kiki.Set(bbConst_kiki1);
                if (!bbVar_kiki.IsEmpty())
                {
                    // 増やした分の重ね利きを減らして、元に戻すぜ☆(^▽^)
                    //ビットボード使い回し
                    PureMemory.gky_ky.shogiban.kikiBan.TorinozokuKiki(km_t1, bbVar_kiki);
                }
            }

            {
                bbVar_kiki.Set(bbConst_kiki0);
                // 減らした分の重ね利きを増やして、元に戻すぜ☆(^▽^)
                //ビットボード使い回し
                PureMemory.gky_ky.shogiban.kikiBan.OkuKiki(km_t0, bbVar_kiki);
            }

            return(sasaeBeforeMove - sasaeAfterMove < 0);
        }