public Bitboard Clone() { Bitboard bb = new Bitboard(); bb.Set(m_value64127_, m_value063_); return(bb); }
public static bool TryParse(string text, out Bitboard result) { if (ulong.TryParse(text, out ulong number)) { result = new Bitboard(); result.Set(number); return(true); } result = null; return(false); }
/// <summary> /// 手番らいおん の逃げ道を開ける相手番の手かどうか調べるぜ☆(^▽^) /// </summary> /// <returns></returns> public bool IsNigemitiWoAkeru(Kyokumen ky, Komasyurui ks_aite, Masu ms_t0, Masu ms_t1) { if (NigemitiWoFusaideiruAiteNoKomaBB.IsOff(ms_t0)) { // 逃げ道を塞いでいる駒ではないのなら、スルーするぜ☆(^▽^) return(false); } // 手番らいおん の8近傍 のどこかに、重ね利きの数 0 が出来ていれば、 // 逃げ道を開けると判定するぜ☆(^▽^) bool akeru = false; Koma km_t0 = Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks_aite, CurrentOptionalPhase); Koma km_t1 = km_t0;// FIXME: 成りを考慮していない // 重ね利きの数を差分更新するぜ☆(^▽^) ky.Shogiban.N100_HerasuKiki(km_t0, ky.Sindan.CloneKomanoUgoki(km_t0, ms_t0), ky.Sindan); ky.Shogiban.N100_FuyasuKiki(km_t1, ky.Sindan.CloneKomanoUgoki(km_t1, ms_t1), ky.Sindan); Bitboard nigemitiBB = new Bitboard(); nigemitiBB.Set(FriendRaion8KinboBB); nigemitiBB.Sitdown(FriendKomaBB); while (nigemitiBB.Ref_PopNTZ(out Masu ms_nigemiti)) { if (0 == ky.Shogiban.CountKikisuZenbu(Conv_Taikyokusya.Reverse(CurrentOptionalPhase), ms_nigemiti)) // 相手番の利きが無くなったか☆(^▽^) { akeru = true; // (^▽^)逃げ道が開いたぜ☆! goto gt_EndLoop; } } gt_EndLoop: ; // 重ね利きの数の差分更新を、元に戻すぜ☆(^▽^) ky.Shogiban.N100_HerasuKiki(km_t1, ky.Sindan.CloneKomanoUgoki(km_t1, ms_t1), ky.Sindan); ky.Shogiban.N100_FuyasuKiki(km_t0, ky.Sindan.CloneKomanoUgoki(km_t0, ms_t0), ky.Sindan); return(akeru); }
/// <summary> /// トライできる先。 /// </summary> /// <param name="ky">局面</param> /// <param name="kikiBB">手番らいおんの利きビットボード</param> /// <param name="tb">手番</param> /// <param name="ms1">手番らいおんがいる升</param> /// <returns></returns> public static Bitboard GetTrySaki(Kyokumen ky, Bitboard kikiBB, Option <Phase> optionalPhase, Masu ms1, StringBuilder syuturyoku) { var phaseIndex = OptionalPhase.IndexOf(optionalPhase); Util_Test.AppendLine("テスト: トライルール", syuturyoku); m_trySakiBB_.Clear(); // 自分はN段目にいる☆ int dan = Conv_Masu.ToDan_JibunSiten(optionalPhase, ms1, ky.Sindan); bool nidanme = 2 == dan; Util_Test.AppendLine("2段目にいるか☆?[{ nidanme }] わたしは[{ dan }]段目にいるぜ☆", syuturyoku); if (!nidanme) { Util_Test.AppendLine("むりだぜ☆", syuturyoku); Util_Test.Flush(syuturyoku); return(m_trySakiBB_); } // 1段目に移動できる升☆ m_trySakiBB_.Set(kikiBB); m_trySakiBB_.Select(ky.BB_Try[phaseIndex]); Util_Test.TestCode((StringBuilder syuturyoku2) => { Util_Information.Setumei_Bitboards(new string[] { "らいおんの利き", "1段目に移動できる升" }, new Bitboard[] { kikiBB, m_trySakiBB_ }, syuturyoku2); }); // 味方の駒がないところ☆ Bitboard spaceBB = new Bitboard(); spaceBB.Set(ky.BB_BoardArea); spaceBB.Sitdown(ky.Shogiban.GetBBKomaZenbu(optionalPhase)); m_trySakiBB_.Select(spaceBB); Util_Test.TestCode((StringBuilder str) => { Util_Information.Setumei_Bitboards(new string[] { "味方駒無い所", "トライ先" }, new Bitboard[] { spaceBB, m_trySakiBB_ }, str); }); if (m_trySakiBB_.IsEmpty()) { Util_Test.AppendLine("むりだぜ☆", syuturyoku); Util_Test.Flush(syuturyoku); return(m_trySakiBB_); } // 相手の利きが届いていないところ☆ var optionalOpponent2 = Conv_Taikyokusya.Reverse(optionalPhase); Bitboard safeBB = new Bitboard(); safeBB.Set(ky.BB_BoardArea); ky.Shogiban.ToSitdown_BBKikiZenbu(optionalOpponent2, safeBB); m_trySakiBB_.Select(safeBB); Util_Test.TestCode((StringBuilder syuturyoku2) => { Util_Information.Setumei_Bitboards(new string[] { "相手利き無い所", "トライ先" }, new Bitboard[] { safeBB, m_trySakiBB_ }, syuturyoku2); }); if (m_trySakiBB_.IsEmpty()) { Util_Test.AppendLine("むりだぜ☆", syuturyoku); Util_Test.Flush(syuturyoku); return(m_trySakiBB_); } Util_Test.AppendLine("トライできるぜ☆", syuturyoku); Util_Test.Flush(syuturyoku); return(m_trySakiBB_); }