public static void Tukurinaosi() { //──────────────────── // 左上がり筋一列ビットボード //──────────────────── // o--- // -o-- // --o- // ---o { chikanHyo_ha45 = new Masu[PureSettei.banHeimen]; int dst = 0; BitboardsOmatome.ScanHidariAgariSuji((int diagonals, Masu ms) => { chikanHyo_ha45[(int)ms] = (Masu)dst; dst++; }); } //──────────────────── // 左下がり筋一列ビットボード //──────────────────── // ---o // --o- // -o-- // o--- { chikanHyo_hs45 = new Masu[PureSettei.banHeimen]; int dst = 0; BitboardsOmatome.ScanHidariSagariSuji((int diagonals, Masu ms) => { chikanHyo_hs45[(int)ms] = (Masu)dst; dst++; }); } //──────────────────── // 反時計回り一列ビットボード //──────────────────── // ---o // ---o // ---o // ---o { chikanHyo_ht90 = new Masu[PureSettei.banHeimen]; BitboardsOmatome.ScanHanTokei90((int diagonals, Masu ms, Masu dst) => { chikanHyo_ht90[(int)ms] = (Masu)dst; }); } }
public static void Tukurinaosi_2_Nakami( #if DEBUG string dbg_hint #endif ) { int tate = PureSettei.banTateHaba; int yoko = PureSettei.banYokoHaba; int heimen = PureSettei.banHeimen; int nanamedanDLen = PureSettei.banNanameDanLen; // ナナメ段 nanamedanD = new int[heimen][]; for (int iMs = 0; iMs < heimen; iMs++) { nanamedanD[iMs] = new int[KIKIDIRLEN_TOBIKIKI]; } nanamedanAtama_chikanHyoDst = new Masu[nanamedanDLen][]; nanamedanAtama_chikanHyoMotoMs = new Masu[nanamedanDLen][]; nanamedanHaba = new int[nanamedanDLen][]; for (int iD = 0; iD < nanamedanDLen; iD++) { nanamedanAtama_chikanHyoDst[iD] = new Masu[KIKIDIRLEN_TOBIKIKI]; nanamedanAtama_chikanHyoMotoMs[iD] = new Masu[KIKIDIRLEN_TOBIKIKI]; nanamedanHaba[iD] = new int[KIKIDIRLEN_TOBIKIKI]; } massugudanD = new int[heimen]; massugudanAtama_chikanHyoDst = new Masu[tate];//置換表は反時計回りに90°回転する前の表で、その横幅は、回転後の縦幅 massugudanAtama_chikanHyoMotoMs = new Masu[tate]; //──────────────────── // 左上がり筋一列ビットボード //──────────────────── // o--- // -o-- // --o- // ---o { int preDiagonals = -1; int haba = 0; int iKikiDirArrayIndex = Conv_TobikikiDirection.ToUgokikataArrayIndex(TobikikiDirection.ZHa); int dst = 0; BitboardsOmatome.ScanHidariAgariSuji((int diagonals, Masu ms) => { if (preDiagonals != diagonals) { preDiagonals = diagonals; nanamedanAtama_chikanHyoDst[diagonals][iKikiDirArrayIndex] = (Masu)dst; nanamedanAtama_chikanHyoMotoMs[diagonals][iKikiDirArrayIndex] = ms; if (0 < diagonals) { nanamedanHaba[diagonals - 1][iKikiDirArrayIndex] = haba; } haba = 0; } nanamedanD[(int)ms][iKikiDirArrayIndex] = diagonals; haba++; dst++; }); nanamedanHaba[nanamedanHaba.Length - 1][iKikiDirArrayIndex] = 1;//最後のマスの幅 } //──────────────────── // 左下がり筋一列ビットボード //──────────────────── // ---o // --o- // -o-- // o--- { int preDiagonals = -1; int haba = 0; int iKikiDir = Conv_TobikikiDirection.ToUgokikataArrayIndex(TobikikiDirection.ZHs); int dst = 0; BitboardsOmatome.ScanHidariSagariSuji((int diagonals, Masu ms) => { if (preDiagonals != diagonals) { preDiagonals = diagonals; nanamedanAtama_chikanHyoDst[diagonals][iKikiDir] = (Masu)dst; nanamedanAtama_chikanHyoMotoMs[diagonals][iKikiDir] = ms; if (0 < diagonals) { nanamedanHaba[diagonals - 1][iKikiDir] = haba; } haba = 0; } nanamedanD[(int)ms][iKikiDir] = diagonals; haba++; dst++; }); nanamedanHaba[nanamedanHaba.Length - 1][iKikiDir] = 1;//最後のマスの幅 } //──────────────────── // 反時計回り一列ビットボード //──────────────────── // ---o // ---o // ---o // ---o { int preDiagonals = -1; int iKikiDir = Conv_TobikikiDirection.ToUgokikataArrayIndex(TobikikiDirection.KT); BitboardsOmatome.ScanHanTokei90((int diagonals, Masu ms, Masu dst) => { if (preDiagonals != diagonals) { preDiagonals = diagonals; massugudanAtama_chikanHyoDst[diagonals] = dst; massugudanAtama_chikanHyoMotoMs[diagonals] = ms; } massugudanD[(int)ms] = diagonals; }); } //──────────────────── // 駒の動き(飛び利き) //──────────────────── if (PureSettei.tobikikiTukau) { // (1)KT_U きりんの縦 上(先手いのしし兼用) // (2)KT_S きりんの縦 下(後手いのしし兼用) { TobikikiDirection kikiDir = TobikikiDirection.KT;//いのししも変わらないだろ BitboardsOmatome.KomanoUgokikataYk00.ScanTobikiki( (Taikyokusya tai, Masu ms, int iBlocks, Bitboard kikiBB) => { // 指定マスから0の方向に向かって // きりん縦 BitboardsOmatome.KomanoUgokikataYk00.StandupElement( tai, (int)kikiDir, ms, iBlocks, kikiBB); // いのしし(先手) if (tai == Taikyokusya.T1) { BitboardsOmatome.KomanoUgokikataYk00.StandupElement( tai, (int)TobikikiDirection.S, ms, iBlocks, kikiBB); } }, (Taikyokusya tai, Masu ms, int iBlocks, Bitboard kikiBB) => { // 指定マスから最大の方向に向かって // きりん縦 BitboardsOmatome.KomanoUgokikataYk00.StandupElement( tai, (int)kikiDir, ms, iBlocks, kikiBB); // いのしし(後手) if (tai == Taikyokusya.T2) { BitboardsOmatome.KomanoUgokikataYk00.StandupElement( tai, (int)TobikikiDirection.S, ms, iBlocks, kikiBB); } }, kikiDir, MasSpanKT, false, tateToriSu ); } // (3)KY_H きりんの横 左 // (4)KY_M きりんの横 右 { TobikikiDirection kikiDir = TobikikiDirection.KY; BitboardsOmatome.KomanoUgokikataYk00.ScanTobikiki( (Taikyokusya tai, Masu ms, int iBlocks, Bitboard bb_kiki) => { // bb_kiki で 63(10) と出てきたときは、 // 111111(2) なのか、 // 63(飛車のいる段の先頭列)マスなのか、 // マス番号と間違えていないか 注意。 // 診断:平手初期局面 飛車の横利き #if DEBUG if (kikiDir == TobikikiDirection.KY && PureSettei.gameRule == GameRule.HonShogi && 70 == (int)ms && ( Convert.ToInt32("010000010", 2) == iBlocks || // 130(10) Convert.ToInt32("10111111", 2) == iBlocks // 191 ) ) { int a = 0; } #endif // きりん横 BitboardsOmatome.KomanoUgokikataYk00.StandupElement( tai, (int)kikiDir, ms, iBlocks, bb_kiki); // 診断:平手初期局面 飛車の横利き #if DEBUG if (PureSettei.gameRule == GameRule.HonShogi && 70 == (int)ms && ( Convert.ToInt32("010000010", 2) == iBlocks // 130(10) // || Convert.ToInt32("10111111", 2) == iBlocks // 191 ) ) { Bitboard bb = BitboardsOmatome.KomanoUgokikataYk00.CloneElement( tai, kikiDir, (Masu)70, iBlocks ); ulong byte1 = (ulong)Convert.ToInt32("111111", 2); // 63 // bb.value64127 は、8段目の「2」列目からの数字が入っているぜ☆(^~^) // 111111(2) = 63(10) という数字は 8八、7八、6八、5八、4八、3八 を指していて、 // 飛車の利き(角の升含む)を表しているぜ☆(^~^) // 111111(2) = 63(10) 飛車が角の上まで。63 ではなく "011111110" 254 が入っていてほしい。 // 10111111(2) = 191(10) 飛車が角を貫通している。後手番が上書きしているようだ。 // ~~~~~~ // が入ってる // Debug.Assert( (bb.value64127 == byte1 && bb.value063 == 0) ); } #endif }, (Taikyokusya tai, Masu ms, int iBlocks, Bitboard kikiBB) => { // きりん横 BitboardsOmatome.KomanoUgokikataYk00.StandupElement( tai, (int)kikiDir, ms, iBlocks, kikiBB); }, kikiDir, MasSpanKY, false, yokoToriSu ); // 診断:平手初期局面 飛車の横利き #if DEBUG if (PureSettei.gameRule == GameRule.HonShogi) { int iBlocks = Convert.ToInt32("010000010", 2);//下位桁は9一の方 130(10) Bitboard bb = BitboardsOmatome.KomanoUgokikataYk00.CloneElement( Taikyokusya.T1, kikiDir, (Masu)70, iBlocks ); // 先手番なので、1バイト目の64ビットと、2バイト目にデータが入っているはず☆(^~^) ulong byte2 = (ulong)Convert.ToInt32("1111111", 2); // 63 string str2 = Convert.ToString((int)bb.value64127, 2); //"10111111" 191(10) Debug.Assert( ( (ulong)Convert.ToInt32("010000010", 2) == bb.value64127 || // 130(10) (ulong)Convert.ToInt32("10111111", 2) == bb.value64127 // 191 ) && bb.value063 == 0 ); } #endif } // (5)ZHa_U ぞうの左上がり 上 // (6)ZHa_S ぞうの左上がり 下 { TobikikiDirection kikiDir = TobikikiDirection.ZHa; BitboardsOmatome.KomanoUgokikataYk00.ScanTobikiki( (Taikyokusya tai, Masu ms, int iBlocks, Bitboard kikiBB) => { // ぞう横 BitboardsOmatome.KomanoUgokikataYk00.StandupElement( tai, (int)kikiDir, ms, iBlocks, kikiBB); }, (Taikyokusya tai, Masu ms, int iBlocks, Bitboard kikiBB) => { // ぞう横 BitboardsOmatome.KomanoUgokikataYk00.StandupElement( tai, (int)kikiDir, ms, iBlocks, kikiBB); }, kikiDir, MasSpanZHa, false, yokoToriSu ); } // (7)ZHs_U ぞうの左下がり 上 // (8)ZHs_S ぞうの左下がり 下 { TobikikiDirection kikiDir = TobikikiDirection.ZHs; BitboardsOmatome.KomanoUgokikataYk00.ScanTobikiki( (Taikyokusya tai, Masu ms, int iBlocks, Bitboard kikiBB) => { // ぞう BitboardsOmatome.KomanoUgokikataYk00.StandupElement( tai, (int)kikiDir, ms, iBlocks, kikiBB); }, (Taikyokusya tai, Masu ms, int iBlocks, Bitboard kikiBB) => { // ぞう BitboardsOmatome.KomanoUgokikataYk00.StandupElement( tai, (int)kikiDir, ms, iBlocks, kikiBB); }, kikiDir, MasSpanZHs, true, yokoToriSu ); } } }