예제 #1
0
        /// <summary>
        /// 下側に自分の陣地がある視点の段番号だぜ☆(^▽^)
        /// 例:対局者1でも2でも、トライルールは らいおん が1段目に入ったときだぜ☆(^▽^)
        /// </summary>
        /// <param name="ms"></param>
        /// <returns></returns>
        public static int ToDan_JibunSiten(Option <Phase> optionalPhase, Masu ms, Kyokumen.Sindanyo kys)
        {
            var phase = optionalPhase.Unwrap();

            if (phase == Phase.Black)
            {
                return(Conv_Masu.ToDan_WithoutErrorCheck((int)ms));
            }
            return(Conv_Masu.ToDan_WithoutErrorCheck(kys.MASU_YOSOSU - 1 - (int)ms));
        }
예제 #2
0
        public static Move TryFenMove2(
            bool isSfen,
            Kyokumen.Sindanyo kys,
            string str1,
            string str2,
            string str3,
            string str4,
            string str5
            )
        {
            int dstSuji = FenSuji_Int(isSfen, str3); // 至筋
            int dstDan  = FenDan_Int(isSfen, str4);  // 至段

            // 取った駒を調べるぜ☆(^▽^)
            Masu dstMs = Conv_Masu.ToMasu(dstSuji, dstDan);


            //------------------------------
            // 5
            //------------------------------
            bool natta = false;

            if ("+" == str5)
            {
                // 成りました
                natta = true;
            }


            //------------------------------
            // 結果
            //------------------------------
            if ("*" == str2)
            {
                // 駒台から打ったぜ☆
                return(ConvMove.ToMove01cUtta(
                           dstMs,
                           Med_Parser.Moji_MotikomaSyurui(isSfen, str1)//打った駒
                           ));
            }
            else
            {
                // 盤上の駒を動かしたぜ☆
                if (natta)
                {
                    return(ConvMove.ToMove01bNariSasi(Med_Parser.FenSujiDan_Masu(isSfen, str1, str2), dstMs, kys));
                }
                else
                {
                    return(ConvMove.ToMove01aNarazuSasi(Med_Parser.FenSujiDan_Masu(isSfen, str1, str2), dstMs, kys));
                }
            }
        }
예제 #3
0
        /// <summary>
        /// 2017-04-19 作成
        /// </summary>
        /// <param name="commandline"></param>
        /// <param name="caret"></param>
        /// <param name="out_ms"></param>
        /// <returns></returns>
        public static bool TryParseMs(bool isSfen, string commandline, Kyokumen ky, ref int caret, out Masu out_ms)
        {
            Match m = Itiran_FenParser.GetMasuPattern(isSfen).Match(commandline, caret);

            if (m.Success)
            {
                Util_String.SkipMatch(commandline, ref caret, m);

                int suji = FenSuji_Int(isSfen, m.Groups[1].Value);
                int dan  = FenDan_Int(isSfen, m.Groups[2].Value);

                out_ms = Conv_Masu.ToMasu(suji, dan);
                return(true);
            }
            else
            {
                out_ms = ky.MASU_ERROR;
                return(false);
            }
        }
예제 #4
0
 /// <summary>
 /// A1 を 0 に。
 /// </summary>
 /// <param name="isSfen"></param>
 /// <param name="suji"></param>
 /// <param name="dan"></param>
 /// <returns></returns>
 public static Masu FenSujiDan_Masu(bool isSfen, string suji, string dan)
 {
     return(Conv_Masu.ToMasu(FenSuji_Int(isSfen, suji), FenDan_Int(isSfen, dan)));
 }
예제 #5
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_);
        }
예제 #6
0
 public static int GetDstDan_WithoutErrorCheck(int ss)
 {
     // (v & m) >> s + 1。 v:バリュー、m:マスク、s:シフト
     return(Conv_Masu.ToDan_WithoutErrorCheck((int)GetDstMasu_WithoutErrorCheck(ss)));
     // if (Move.Toryo == ss) { return Conv_Masu.ERROR_DAN; } // 解析不能☆
 }
예제 #7
0
 public static int GetDstSuji_WithoutErrorCheck(int ss)
 {
     // (v & m) >> s + 1。 v:バリュー、m:マスク、s:シフト
     return(Conv_Masu.ToSuji_WithoutErrorCheck((int)GetDstMasu_WithoutErrorCheck(ss)));
     // if (Move.Toryo == ss) { return Conv_Masu.ERROR_SUJI; } // エラーチェック付き
 }
예제 #8
0
 public static int GetSrcDan_WithoutErrorCheck(int ss)
 {
     // (v & m) >> s + 1。 v:バリュー、m:マスク、s:シフト
     return(Conv_Masu.ToDan_WithoutErrorCheck((int)GetSrcMasu_WithoutErrorCheck(ss)));
     // if (Move.Toryo == ss || ConvMove.IsUtta(ss)) { return Conv_Masu.ERROR_DAN; }  // エラーチェック付き
 }