예제 #1
0
        public static void Kiki(bool isSfen, string commandline, Kyokumen ky, out Masu out_ms, out Bitboard out_kikiBB)
        {
            //KomanoUgokikata komanoUgokikata,

            // うしろに続く文字は☆(^▽^)
            int caret = 0;

            Util_String.TobasuTangoToMatubiKuhaku(commandline, ref caret, "kiki ");
            string line = commandline.Substring(caret).TrimEnd();

            if (line.Length == 2)// kiki b3
            {
                out_kikiBB = null;

                // 升を返すぜ☆
                if (!Med_Parser.TryParseMs(isSfen, commandline, ky, ref caret, out out_ms))
                {
                    throw new Exception("パースエラー102");
                }
            }
            else// kiki b3 R 1
            {
                out_ms = ky.MASU_ERROR;

                // 盤面表示を返すぜ☆
                string moji1 = "";
                string moji2 = "";
                string moji3 = "";
                string moji4 = "";
                Match  m     = Itiran_FenParser.GetKikiCommandPattern(Option_Application.Optionlist.USI).Match(commandline, caret);
                if (m.Success)
                {
                    Util_String.SkipMatch(commandline, ref caret, m);

                    moji1 = m.Groups[1].Value;
                    moji2 = m.Groups[2].Value;
                    moji3 = m.Groups[3].Value;
                    moji4 = m.Groups[4].Value;

                    if (!Med_Parser.TryTaikyokusya(Option_Application.Optionlist.USI, moji4, out Option <Phase> phase))
                    {
                        throw new Exception($"対局者のパースエラー moji4=[{ moji4 }]");
                    }
                    out_kikiBB = Util_Application.Kiki_BB(Med_Koma.KomasyuruiAndTaikyokusyaToKoma(Med_Parser.Moji_Komasyurui(Option_Application.Optionlist.USI, moji3), phase), Med_Parser.FenSujiDan_Masu(Option_Application.Optionlist.USI, moji1, moji2), ky.Shogiban);// komanoUgokikata
                }
                else
                {
                    out_kikiBB = null;
                }
            }
        }
예제 #2
0
        /// <summary>
        /// 評価値以外にも、数字のパーサーとしてよく使うぜ☆(^~^)
        /// </summary>
        /// <param name="out_restLine"></param>
        /// <param name="commandline"></param>
        /// <param name="out_hyokati"></param>
        /// <returns></returns>
        public static bool TryParse(string commandline, ref int caret, out int out_hyokati, StringBuilder syuturyoku)
        {
            Match m = Itiran_FenParser.HyokatiPattern.Match(commandline, caret);

            if (m.Success)
            {
                //if(""== m.Groups[1].Value)
                //{
                //    //*
                //    // FIXME:
                //    string msg = $"パースに失敗だぜ☆(^~^)!  commandline=[{commandline}]caret({caret}) .Value=[{m.Groups[1].Value}] m.Index=[{m.Index}] m.Length=[{m.Length}]";
                //    Util_Machine.AppendLine(msg);
                //    Logger.Flush();
                //    throw new Exception(msg);
                //    // */
                //}

                // キャレットを進めるぜ☆(^▽^)
                Util_String.SkipMatch(commandline, ref caret, m);

                // moji1 = m.Groups[1].Value;
                if (int.TryParse(m.Groups[1].Value, out out_hyokati))
                {
                    return(true);
                }
                else
                {
                    //*
                    // FIXME:
                    string msg = $"パースに失敗だぜ☆(^~^)! #鱒 commandline=[{commandline}]caret({caret}) .Value=[{m.Groups[1].Value}]";
                    syuturyoku.AppendLine(msg);
                    Logger.Flush(syuturyoku.ToString());
                    syuturyoku.Clear();
                    throw new Exception(msg);
                    // */
                }
            }

            /*
             * {
             *  // FIXME:
             *  string msg = $"パースに失敗だぜ☆(^~^)!  commandline=[{commandline}]caret({caret})";
             *  Util_Machine.AppendLine(msg);
             *  Logger.Flush();
             *  throw new Exception(msg);
             * }
             * // */
            out_hyokati = 0;
            return(false);
        }
예제 #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>
        ///
        /// </summary>
        /// <param name="commandline">B4B3、または toryo といった文字列を含む行☆</param>
        /// <param name="caret">文字カーソルの位置</param>
        /// <param name="ky">取られた駒を調べるために使う☆</param>
        /// <param name="out_sasite"></param>
        /// <returns></returns>
        public static bool TryFenMove(
            bool isSfen,
            string commandline,
            ref int caret,
            Kyokumen.Sindanyo kys,
            out Move out_sasite
            )
        {
            if ('n' == commandline[caret])
            {
                if (caret == commandline.IndexOf("none", caret))//定跡ファイルの応手が無いときに利用☆
                {
                    Util_String.TobasuTangoToMatubiKuhaku(commandline, ref caret, "none");

                    out_sasite = Move.Toryo;
                    return(true);
                }
            }
            else
            //if ('t' == commandline[caret])
            //{
            if (caret == commandline.IndexOf(Itiran_FenParser.GetToryo(isSfen), caret))
            {
                Util_String.TobasuTangoToMatubiKuhaku(commandline, ref caret, Itiran_FenParser.GetToryo(isSfen));

                out_sasite = Move.Toryo;
                return(true);
            }
            //}

            // 「toryo」でも「none」でもなければ、「B4B3」形式と想定して、1手だけ読込み
            // テキスト形式の符号「A4A3 C1C2 …」の最初の1要素を、切り取ってトークンに分解します。

            Match m = Itiran_FenParser.GetMovePattern(isSfen).Match(commandline, caret);

            if (!m.Success)
            {
                //// 「B4B3」形式ではなかった☆(^△^)!? 次の一手が読めない☆
                //string msg = $"指し手のパースに失敗だぜ☆(^~^)! commandline=[{ commandline }] caret=[{ caret }] m.Groups.Count=[{ m.Groups.Count }]";
                //Util_Machine.AppendLine(msg);
                //Logger.Flush();
                //throw new Exception(msg);

                out_sasite = Move.Toryo;
                return(false);
            }

            // m.Groups[1].Value : ABCabc か、 ZKH
            // m.Groups[2].Value : 1234   か、 *
            // m.Groups[3].Value : ABCabc
            // m.Groups[4].Value : 1234
            // m.Groups[5].Value : +

            // カーソルを進めるぜ☆(^~^)
            Util_String.SkipMatch(commandline, ref caret, m);

            // 符号1「B4B3」を元に、move を作ります。
            out_sasite = TryFenMove2(
                isSfen,
                kys,
                m.Groups[1].Value,
                m.Groups[2].Value,
                m.Groups[3].Value,
                m.Groups[4].Value,
                m.Groups[5].Value
                );
            Debug.Assert((int)out_sasite != -1, "");

            return(true);
        }