예제 #1
0
        public Bitboard Clone()
        {
            Bitboard bb = new Bitboard();

            bb.Set(m_value64127_, m_value063_);
            return(bb);
        }
예제 #2
0
 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);
 }
예제 #3
0
        /// <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);
        }
예제 #4
0
        /// <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_);
        }