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)); }
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]++; } } } } }
/// <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); }
/// <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); }
/// <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); }