예제 #1
0
 public YomiBitboard[] GetBB_Where(Taikyokusya tai)
 {
     YomiBitboard[] bbItiran = new YomiBitboard[Conv_Komasyurui.itiran.Length];
     foreach (Komasyurui ks in Conv_Komasyurui.itiran)
     {
         bbItiran[(int)ks] = new YomiBitboard(valuesKm[(int)Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, tai)]);
     }
     return(bbItiran);
 }
예제 #2
0
            public Piece GetBanjoKoma(Taikyokusya tai, Masu ms)
            {
                Komasyurui ks;

                if (ExistsKoma(tai, ms, out ks))
                {
                    return(Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, tai));
                }
                return(Piece.Kuhaku);
            }
예제 #3
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]++;
                            }
                        }
                    }
                }
            }
예제 #4
0
        /// <summary>
        /// 将棋盤を180度ひっくり返すぜ☆(^▽^)
        /// 主にテスト用だぜ☆(^▽^)
        ///
        /// 参考:「ビットの並びを反転する」http://blog.livedoor.jp/techblog1/archives/5365383.html
        /// </summary>
        public static void Hanten()
        {
            // 盤上
            {
                // 左右反転して、先後も入替
                Bitboard tmp_T1 = PureMemory.gky_ky.shogiban.ibashoBan_yk00.CloneBB_KomaZenbu(Taikyokusya.T1);
                Bitboard tmp_T2 = PureMemory.gky_ky.shogiban.ibashoBan_yk00.CloneBB_KomaZenbu(Taikyokusya.T2);
                tmp_T1.Bitflip128();
                tmp_T2.Bitflip128();
                PureMemory.gky_ky.shogiban.ibashoBan_yk00.Set_KomaZenbu(Taikyokusya.T1, tmp_T1);
                PureMemory.gky_ky.shogiban.ibashoBan_yk00.Set_KomaZenbu(Taikyokusya.T2, tmp_T2);

                for (int iKs = 0; iKs < Conv_Komasyurui.itiran.Length; iKs++)
                {
                    Komasyurui ks = Conv_Komasyurui.itiran[iKs];

                    Piece km1 = Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, Taikyokusya.T1);
                    tmp_T1 = PureMemory.gky_ky.shogiban.ibashoBan_yk00.CloneBb_Koma(km1);
                    tmp_T1.Bitflip128();
                    PureMemory.gky_ky.shogiban.ibashoBan_yk00.Set_Koma(km1, tmp_T1);

                    Piece km2 = Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, Taikyokusya.T2);
                    tmp_T2 = PureMemory.gky_ky.shogiban.ibashoBan_yk00.CloneBb_Koma(km2);
                    tmp_T2.Bitflip128();
                    PureMemory.gky_ky.shogiban.ibashoBan_yk00.Set_Koma(km2, tmp_T2);
                }
                // 盤面反転、駒の先後も反転だぜ☆(^▽^)
            }
            // 持ち駒
            {
                MotigomaItiran tmp = new MotigomaItiran();
                foreach (Motigoma mk in Conv_Motigoma.itiran)
                {
                    MotigomaSyurui mks            = Med_Koma.MotiKomaToMotiKomasyrui(mk);
                    Taikyokusya    tai            = Med_Koma.MotiKomaToTaikyokusya(mk);
                    Motigoma       hantenMotikoma = Med_Koma.MotiKomasyuruiAndTaikyokusyaToMotiKoma(mks, Conv_Taikyokusya.Hanten(tai));
                    tmp.Set(mk, PureMemory.gky_ky.motigomaItiran.yomiMotigomaItiran.Count(hantenMotikoma));
                }
                PureMemory.gky_ky.motigomaItiran.Set(tmp);
            }
        }
예제 #5
0
        /// <summary>
        /// 盤上の駒を取り除く。
        ///
        /// よくある問題
        /// ──────
        ///
        /// (1)きりんA の右上に きりんB を打つ。
        /// (2)きりんB を取り除く。
        /// (3)このとき、きりんB の利きも取り除くが、きりんA と被っている利きもある。
        /// これを消してしまうと、利きが欠けた きりんA ができてしまい、整合性が取れない。
        ///
        /// </summary>
        /// <param name="ms_ibasho">取り除く駒がある升</param>
        /// <param name="km_remove">取り除く駒</param>
        /// <param name="ms_mirainihaKomagaAru">(飛び利き更新用)</param>
        /// <param name="updateKiki">偽にすると、利きを更新しません</param>
        /// <param name="yomiGky"></param>
        /// <param name="reigai1"></param>
        /// <returns></returns>
        public bool TryFail_TorinozokuKoma(
            Masu ms_ibasho,
            Piece km_remove,
            Masu ms_mirainihaKomagaAru,
            bool updateKiki

#if DEBUG
            , IDebugMojiretu reigai1
#endif
            )
        {
            Debug.Assert(Conv_Koma.IsOk(km_remove), "km_remove not ok");
            Debug.Assert(Conv_Masu.IsBanjo(ms_ibasho), "");

            // 取り除いた駒は、どちらの対局者の物か☆(^~^)
            Taikyokusya tai_removed = Med_Koma.KomaToTaikyokusya(km_remove);

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

            //──────────
            // とりあえず、駒を取り除いた状態にするぜ☆(^~^)
            //──────────
            TorinozokuKoma(ms_ibasho, km_remove);

            //──────────
            // 駒が取り除かれた現状に更新する
            //──────────
            if (updateKiki)
            {
                // 駒の利き割りの評価値を減らすならここで☆(^~^)

                kikiBan.TorinozokuKiki(km_remove, ms_ibasho);

                //──────────
                // 駒が減った後の、関連する飛び利きを増やす
                //──────────
                // 置いた駒がある 縦列きりん、横列きりん、縦列いのしし、左上がりぞう、左下がりぞう を探す
                foreach (Taikyokusya tai in Conv_Taikyokusya.itiran)
                {
                    Komasyurui[] ksAr = new Komasyurui[]
                    {
                        Komasyurui.K,
                        Komasyurui.Z,
                        Komasyurui.S,
                    };

                    foreach (Komasyurui ks in ksAr)
                    {
                        Piece km_forReverse = Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, tai);

                        BitboardsOmatome.KomanoUgokikataYk00.ToSet_Merge(
                            km_forReverse,    // 相手番の駒にして、利きを飛ばしてきている位置を調べるのに使う
                            ms_ibasho,        // 升
                            bbTmp_kiki_forOku // リーガルムーブの盤面を、ここに入れるぜ☆(^~^)
                            );

                        Masu ms_atk;
                        while (bbTmp_kiki_forOku.Ref_PopNTZ(out ms_atk))// 立っているビットを降ろすぜ☆
                        {
                            kikiBan.OkuKiki(km_forReverse, ms_atk);
                        }
                    }
                }
            }

            return(Pure.SUCCESSFUL_FALSE);
        }
예제 #6
0
        /// <summary>
        /// 盤上の駒を置くぜ☆(^▽^)
        /// </summary>
        /// <param name="ms_t1"></param>
        /// <param name="km_t1"></param>
        /// <param name="updateKiki">利きを先に作るか、駒を先に並べるか、という循環が発生するのを防ぐために</param>
        public bool TryFail_OkuKoma(
            Masu ms_t1,
            Piece km_t1,
            bool updateKiki
#if DEBUG
            , IDebugMojiretu reigai1
#endif
            )
        {
            Debug.Assert(Conv_Koma.IsOk(km_t1), string.Format("置けない駒 km_t1 を置こうとしました。 km_t1={0}", km_t1));
            Debug.Assert(Conv_Masu.IsBanjo(ms_t1), string.Format("ms={0}", ms_t1));

            // 取り除いた駒は、どちらの対局者の物か☆(^~^)
            Taikyokusya tai_put = Med_Koma.KomaToTaikyokusya(km_t1);


            //──────────
            // とりあえず、盤に駒を置くんだぜ☆(^~^)
            //──────────
            OkuKoma(ms_t1, km_t1);

            //──────────
            // TODO: 駒が増えた現状に更新する
            //──────────
            if (updateKiki)
            {
                // 駒の利き割りの評価値を増やすならここで☆(^~^)

                //──────────
                // 駒が増えた後の、関連する飛び利きを消す
                //──────────
                // 置いた駒がある 縦列きりん、横列きりん、縦列いのしし、左上がりぞう、左下がりぞう を探す
                foreach (Taikyokusya tai in Conv_Taikyokusya.itiran)
                {
                    Komasyurui[] ksAr = new Komasyurui[]
                    {
                        Komasyurui.K,
                        Komasyurui.Z,
                        Komasyurui.S,
                    };

                    foreach (Komasyurui ks in ksAr)
                    {
                        Piece km_reverse = Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, tai);

                        //bbTmp_kiki_forOku.Clear();
                        BitboardsOmatome.KomanoUgokikataYk00.ToSet_Merge(
                            km_reverse,       // 相手番の駒にして、利きを飛ばしてきている位置を調べるのに使う
                            ms_t1,            // 升
                            bbTmp_kiki_forOku // リーガルムーブの盤面を、ここに入れるぜ☆(^~^)
                            );

                        Masu ms_atk;
                        while (bbTmp_kiki_forOku.Ref_PopNTZ(out ms_atk))// 立っているビットを降ろすぜ☆
                        {
                            kikiBan.TorinozokuKiki(km_reverse, ms_atk);
                        }
                    }
                }

                //*
                // 利きを増やすぜ☆(^~^)
                kikiBan.OkuKiki(
                    km_t1, // 駒
                    ms_t1  // 升
                    );
                //*/
            }

            // TODO: 駒割り評価値を増やすならここだぜ☆(^~^)

            return(Pure.SUCCESSFUL_FALSE);
        }