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]); }
public static void Standup(Piece km, Masu ms, Bitboard bb_kiki) { ugokikataTon[(int)km][(int)ms].Standup(bb_kiki); }
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); }
/// <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 ); }