Beispiel #1
0
 static void ToSitdown_ByElement(Taikyokusya tai, TobikikiDirection kikiDir, Masu ms, int ojhsh, Bitboard bb_update)
 {
     bb_update.Sitdown(TobikikiElement.ugokikataTob[(int)tai][(int)kikiDir][(int)ms][ojhsh]);
 }
Beispiel #2
0
 public static void Standup(Piece km, Masu ms, Bitboard bb_kiki)
 {
     ugokikataTon[(int)km][(int)ms].Standup(bb_kiki);
 }
Beispiel #3
0
 public static void Standup(Taikyokusya tai, int nKikiDir, Masu ms, int iBlocks, Bitboard bb_kiki)
 {
     ugokikataTob[(int)tai][nKikiDir][(int)ms][iBlocks].Standup(bb_kiki);
 }
Beispiel #4
0
        /// <summary>
        /// 盤のサイズが設定されたあとに呼び出すこと
        /// </summary>
        public static void Tukurinaosi(
#if DEBUG
            string dbg_hint
#endif
            )
        {
            int tate          = PureSettei.banTateHaba;
            int yoko          = PureSettei.banYokoHaba;
            int heimen        = PureSettei.banHeimen;
            int nanamedanDLen = PureSettei.banNanameDanLen;

            {
                //----------------------------------------
                // ビットボードの作り直し(端チェックをするものを先に)
                //----------------------------------------
                // 筋
                {
                    // o--
                    // o--
                    // o--
                    // o--
                    bb_sujiArray = new Bitboard[yoko];
                    // 左端列を立てる。
                    bb_sujiArray[0] = new Bitboard();
                    for (int iDan = 0; iDan < tate; iDan++)
                    {
                        bb_sujiArray[0].Standup((Masu)(iDan * yoko));
                    }
                    // 1ビットずつ左シフトしていく。
                    for (int iSuji = 1; iSuji < yoko; iSuji++)
                    {
                        bb_sujiArray[iSuji] = new Bitboard();
                        bb_sujiArray[iSuji].Set(bb_sujiArray[iSuji - 1]);
                        bb_sujiArray[iSuji].LeftShift(1);
                    }
                }
                // 段
                {
                    bb_danArray = new Bitboard[tate];
                    // 1段目のビットは全て立てるぜ☆(^~^)
                    bb_danArray[0] = new Bitboard();
                    for (int iSuji = 0; iSuji < yoko; iSuji++)
                    {
                        bb_danArray[0].Standup((Masu)iSuji);// 1段目は筋も升も同じ番号。
                    }
                    // 2段目以降は、左ビットシフト☆(^~^)
                    for (int iDan = 1; iDan < tate; iDan++)
                    {
                        bb_danArray[iDan] = new Bitboard();
                        bb_danArray[iDan].Set(bb_danArray[iDan - 1]);
                        bb_danArray[iDan].LeftShift(yoko);
                        //#if DEBUG
                        //                    Util_Machine.Syuturyoku.AppendLine($"iDan=[{ iDan }] KyokumenImpl.BB_DanArray[iDan]=[{ KyokumenImpl.BB_DanArray[iDan].Value }] Option_Application.Optionlist.BanTateHaba=[{ Option_Application.Optionlist.BanTateHaba }] Option_Application.Optionlist.BanYokoHaba=[{ Option_Application.Optionlist.BanYokoHaba }]");
                        //                    Util_Machine.Flush(Util_Machine.Syuturyoku);
                        //#endif
                    }
                }

                //────────────────────
                // トライ用ビットボード
                //────────────────────
                bb_try = new Bitboard[Conv_Taikyokusya.itiran.Length];
                bb_try[(int)Taikyokusya.T1] = bb_danArray[0];
                bb_try[(int)Taikyokusya.T2] = bb_danArray[PureSettei.banTateHaba - 1];
                // トライ段
                {
                    bb_try[(int)Taikyokusya.T1] = bb_danArray[0];
                    bb_try[(int)Taikyokusya.T2] = bb_danArray[tate - 1];
                }

                //────────────────────
                // 成り用ビットボード
                //────────────────────
                bb_nareruZone = new Bitboard[Conv_Taikyokusya.itiran.Length];
                if (PureSettei.gameRule == GameRule.HonShogi)
                {
                    // 9x9マス盤を想定☆(^~^)
                    bb_nareruZone[(int)Taikyokusya.T1] = bb_danArray[0].Clone();
                    bb_nareruZone[(int)Taikyokusya.T1].Standup(bb_danArray[1]);
                    bb_nareruZone[(int)Taikyokusya.T1].Standup(bb_danArray[2]);
                    bb_nareruZone[(int)Taikyokusya.T2] = bb_danArray[PureSettei.banTateHaba - 1].Clone();
                    bb_nareruZone[(int)Taikyokusya.T2].Standup(bb_danArray[PureSettei.banTateHaba - 2]);
                    bb_nareruZone[(int)Taikyokusya.T2].Standup(bb_danArray[PureSettei.banTateHaba - 3]);
                }
                else
                {
                    bb_nareruZone[(int)Taikyokusya.T1] = bb_danArray[0].Clone();
                    bb_nareruZone[(int)Taikyokusya.T2] = bb_danArray[PureSettei.banTateHaba - 1].Clone();
                }


                //────────────────────
                // ビットボードのうち、ゲームに使っているビット
                //────────────────────
                bb_boardArea_ = new Bitboard();
                // ビットを立てていく。
                if (0 < PureSettei.banHeimen)
                {
                    bb_boardArea.Set(1);
                    for (int i = 1; i < PureSettei.banHeimen; i++)
                    {
                        bb_boardArea.LeftShift(1);
                        bb_boardArea.Standup((Masu)0);
                    }
                }
                else
                {
                    bb_boardArea.Clear();
                }

                //────────────────────
                // うさぎが飛べる升ビットボード
                //────────────────────
                bb_usagigaMiginiToberu   = new Bitboard[Conv_Taikyokusya.itiran.Length];
                bb_usagigaHidariniToberu = new Bitboard[Conv_Taikyokusya.itiran.Length];
                foreach (Taikyokusya tai in Conv_Taikyokusya.itiran)
                {
                    bb_usagigaMiginiToberu[(int)tai]   = new Bitboard();
                    bb_usagigaHidariniToberu[(int)tai] = new Bitboard();

                    bb_usagigaMiginiToberu[(int)tai].Set(bb_boardArea);
                    bb_usagigaHidariniToberu[(int)tai].Set(bb_boardArea);

                    // 1段目と2段目を省く
                    for (int iDanO0 = 0; iDanO0 < 2; iDanO0++)
                    {
                        bb_usagigaMiginiToberu[(int)tai].Sitdown(bb_danArray[Conv_Masu.ToDanO0_JibunSiten_ByDanO0(tai, iDanO0)]);
                        bb_usagigaHidariniToberu[(int)tai].Sitdown(bb_danArray[Conv_Masu.ToDanO0_JibunSiten_ByDanO0(tai, iDanO0)]);
                    }

                    // 右跳びは 9筋 を省く
                    bb_usagigaMiginiToberu[(int)tai].Sitdown(bb_sujiArray[Conv_Masu.ToSujiO0_JibunSiten_BySujiO0(tai, PureSettei.banYokoHaba - 1)]);
                    // 左跳びは 1筋 を省く
                    bb_usagigaHidariniToberu[(int)tai].Sitdown(bb_sujiArray[Conv_Masu.ToSujiO0_JibunSiten_BySujiO0(tai, 0)]);
                }
            }



            //────────────────────
            // 筋一列ビットボード
            //────────────────────
            // o--
            // o--
            // o--
            // o--
            bb_sujiArray    = new Bitboard[PureSettei.banYokoHaba];
            bb_sujiArray[0] = new Bitboard();
            //// 0x249 → 10 0100 1001(2進数)
            //BB_SujiArray[0].Set(0x249);
            // 筋一列を立てます
            for (int iDan = 0; iDan < PureSettei.banTateHaba; iDan++)
            {
                bb_sujiArray[0].Standup((Masu)(iDan * PureSettei.banYokoHaba));
            }

            // 2筋目以降
            for (int iSuji = 1; iSuji < PureSettei.banYokoHaba; iSuji++)
            {
                bb_sujiArray[iSuji] = new Bitboard();
                bb_sujiArray[iSuji].Set(bb_sujiArray[iSuji - 1]);
                bb_sujiArray[iSuji].LeftShift(1);
            }

            //────────────────────
            // 段一列ビットボード
            //────────────────────
            // ooo
            // ---
            // ---
            // ---
            bb_danArray    = new Bitboard[PureSettei.banTateHaba];
            bb_danArray[0] = new Bitboard();
            //// 0x07 → 111(2進数)
            //BB_DanArray[0].Set(0x07);
            // 段一列を立てます
            for (int iSuji = 0; iSuji < PureSettei.banYokoHaba; iSuji++)
            {
                bb_danArray[0].Standup((Masu)iSuji);
            }

            // 2段目以降
            for (int iDan = 1; iDan < PureSettei.banTateHaba; iDan++)
            {
                bb_danArray[iDan] = new Bitboard();
                bb_danArray[iDan].Set(bb_danArray[iDan - 1]);
                bb_danArray[iDan].LeftShift(PureSettei.banYokoHaba);
            }

            //────────────────────
            // ローテート・ビットボードの置換表
            //────────────────────
            RotateChikanhyo.Tukurinaosi();

            //────────────────────
            // 左上がり筋一列ビットボード
            //────────────────────
            // o---
            // -o--
            // --o-
            // ---o
            {
                bb_hidariAgariSujiArray = new Bitboard[PureSettei.banNanameDanLen];
                int preDiagonals = -1;
                ScanHidariAgariSuji((int diagonals, Masu ms) =>
                {
                    if (preDiagonals != diagonals)
                    {
                        bb_hidariAgariSujiArray[diagonals] = new Bitboard();
                        preDiagonals = diagonals;
                    }
                    bb_hidariAgariSujiArray[diagonals].Standup(ms);
                });
            }

            //────────────────────
            // 左下がり筋一列ビットボード
            //────────────────────
            // ---o
            // --o-
            // -o--
            // o---
            {
                bb_hidariSagariSujiArray = new Bitboard[PureSettei.banNanameDanLen];
                int preDiagonals = -1;
                ScanHidariSagariSuji((int diagonals, Masu ms) =>
                {
                    if (preDiagonals != diagonals)
                    {
                        bb_hidariSagariSujiArray[diagonals] = new Bitboard();
                        preDiagonals = diagonals;
                    }
                    bb_hidariSagariSujiArray[diagonals].Standup(ms);
                });
            }


            //────────────────────
            // 持駒を進める(打てる)ゾーン
            //────────────────────
            // 駒の行き所のない段に打つのを防止
            // 段配列をセットしたあとで
            {
                bb_uteruZone = new Bitboard[Conv_Koma.itiran.Length];
                foreach (Piece km in Conv_Koma.itiran)
                {
                    // まず、盤面全体に打てるとするぜ☆(^~^)
                    bb_uteruZone[(int)km] = bb_boardArea.Clone();

                    // 次に個別に、打てない場所を除外しろだぜ☆(^~^)
                    if (PureSettei.gameRule == GameRule.HonShogi)
                    {
                        switch (km)
                        {
                        // ひよこ、いのしし
                        case Piece.P1:
                        case Piece.L1:
                            bb_uteruZone[(int)km].Sitdown(bb_danArray[0]);
                            break;

                        case Piece.P2:
                        case Piece.L2:
                            bb_uteruZone[(int)km].Sitdown(bb_danArray[tate - 1]);
                            break;

                        // うさぎ
                        case Piece.N1:
                            bb_uteruZone[(int)km].Sitdown(bb_danArray[0]);
                            bb_uteruZone[(int)km].Sitdown(bb_danArray[1]);
                            break;

                        case Piece.N2:
                            bb_uteruZone[(int)km].Sitdown(bb_danArray[tate - 1]);
                            bb_uteruZone[(int)km].Sitdown(bb_danArray[tate - 2]);
                            break;

                        default:
                            break;
                        }
                    }
                }
            }


            //────────────────────
            // 駒の動き方
            //────────────────────
            KomanoUgokikataYk00.Tukurinaosi(
#if DEBUG
                dbg_hint
#endif
                );
        }