Beispiel #1
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
#if DEBUG
                                    , IDebugMojiretu reigai1
#endif
                                    )
        {
            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);
                //    Util_Machine.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:
#if DEBUG
                    reigai1.AppendLine($"パースに失敗だぜ☆(^~^)! #鱒 commandline=[{ commandline }]caret({ caret }) .Value=[{ m.Groups[1].Value }]");
#endif
                    return(false);
                    // */
                }
            }

            /*
             * {
             *  // FIXME:
             *  string msg = $"パースに失敗だぜ☆(^~^)!  commandline=[{ commandline }]caret({ caret })";
             *  Util_Machine.AppendLine(msg);
             *  Util_Machine.Flush();
             *  throw new Exception(msg);
             * }
             * // */
            out_hyokati = 0;
            return(false);
        }
Beispiel #2
0
        public bool Try_Herasu(out MotigomaItiran out_ret, Motigoma mk
#if DEBUG
                               , IDebugMojiretu reigai1
#endif
                               )
        {
            valueMk[(int)mk]--;
#if DEBUG
            if (valueMk[(int)mk] < 0)
            {
                reigai1.AppendLine("error 持駒の数がマイナス");
                out_ret = null;
                return(false);
            }
#endif
            out_ret = this;
            return(true);
        }
Beispiel #3
0
        /// <summary>
        /// 初期局面としてセットするぜ☆(^▽^)
        /// </summary>
        public static bool TryFail_SetSyokiKyokumen_ByFen(
            FenSyurui f,
            string[] danMojiretu, // [0~3]1段目~4段目、[0~2]1筋目~3筋目
            string motigoma,
            string tb_Mojis       //手番
#if DEBUG
            , IDebugMojiretu dbg_reigai
#endif
            )
        {
            PureMemory.gky_ky.Tukurinaosi_ClearKyokumen();

            // 持ち駒パース
            {
                //PureMemory.gky_ky.motigomaItiran.Clear();
                if ("-" != motigoma)// '-' は持ち駒無し
                {
                    int maisu = 0;
                    for (int caret = 0; caret < motigoma.Length; caret++)
                    {
                        char ch = motigoma[caret];

                        int numeric;
                        if (int.TryParse(ch.ToString(), out numeric))
                        {
                            maisu = maisu * 10 + numeric;
                        }
                        else
                        {
                            Motigoma mk;
                            if (!LisMotiKoma.TryParseFen(f, ch, out mk))
                            {
                                return(Pure.FailTrue("TryParseFen"));
                            }
                            else
                            {
                                // 枚数の指定がなかったとき(=0)は、1。
                                PureMemory.gky_ky.motigomaItiran.Set(mk, maisu == 0 ? 1 : maisu);
                                maisu = 0;
                            }
                        }
                    }
                }
            }

            // 盤上の升(既にクリアされているものとするぜ☆)
            int suji;

            for (int dan = 1; dan <= danMojiretu.Length; dan++) // 1段目~N段目 の順に解析。
            {
                //
                // "2z" のように、3列を 2桁 で表記しているので、タテ筋のループ・カウントの数え方には注意だぜ☆(^~^)
                //
                suji = 1;
                int  ruikeiKuhakuSu = 0;                 //累計空白数
                bool isPowerupKoma  = false;             //パワーアップ駒(成りゴマ)
                for (int caret = 0;                      //caret < 3 &&
                     caret < danMojiretu[dan - 1].Length // 可変長配列☆
                     ; caret++)
                {
                    char moji = danMojiretu[dan - 1][caret];

                    int kuhaku;
                    if ('+' == moji)
                    {
                        isPowerupKoma = true;
                    }
                    else if (int.TryParse(moji.ToString(), out kuhaku))
                    {
                        // 数字は空き升の個数なので、筋を進めるぜ☆(^▽^)
                        // とりあえず 1~9 まで対応できるだろうなんだぜ☆(^~^)
                        //for (int i = 0; i < kuhaku; i++)
                        //{
                        ruikeiKuhakuSu = ruikeiKuhakuSu * 10 + kuhaku;
                        //}

                        //Mojiretu reigai1 = new StringBuilder();
                        //reigai1.AppendLine($"未定義の空白の数 moji=[{moji}]");
                        //reigai1.AppendLine($"dan   =[{dan}]");
                        //reigai1.AppendLine($"caret =[{caret}]");
                        //reigai1.AppendLine($"danMojiretu[dan-1] =[{danMojiretu[dan - 1]}]");

                        //throw new Exception(reigai1.ToContents());
                    }
                    else
                    {
                        // 駒でした。
                        if (0 < ruikeiKuhakuSu)
                        {
                            // 空白は置かなくていいのでは?
                            //Masu ms = Conv_Masu.ToMasu(suji, dan);
                            //Koma km_actual = GetBanjoKoma(ms);
                            //HerasuBanjoKoma(ms, km_actual, true);

                            suji          += ruikeiKuhakuSu;
                            ruikeiKuhakuSu = 0;
                        }

                        Piece tmp;
                        if (!LisKoma.Try_ParseFen(f, (isPowerupKoma ? $"+{moji}" : moji.ToString()), out tmp))
                        {
#if DEBUG
                            Pure.Sc.AddErr(string.Format("SetNaiyoで未定義の駒が指定されました。 fen moji=[{0}]", moji));
#endif
                            return(Pure.FailTrue("Try_ParseFen"));
                        }
                        isPowerupKoma = false;

                        if (PureMemory.gky_ky.shogiban.TryFail_OkuKoma(//SetNaiyo
                                Conv_Masu.ToMasu(suji, dan), tmp, true
#if DEBUG
                                , dbg_reigai
#endif
                                ))
                        {
                            return(Pure.FailTrue("TryFail_Oku"));
                        }
                        // あとで適用

                        suji += 1;
                    }
                }

                if (0 < ruikeiKuhakuSu)
                {
                    // 空白は置かなくていいのでは?
                    //Masu ms = Conv_Masu.ToMasu(suji, dan);
                    //HerasuBanjoKoma(ms, GetBanjoKoma(ms), true);

                    suji          += ruikeiKuhakuSu;
                    ruikeiKuhakuSu = 0;
                }
            }

            // 手番
            {
                Taikyokusya syokikyokumenTai;
                if (!Med_Parser.Try_MojiToTaikyokusya(f, tb_Mojis, out syokikyokumenTai))
                {
#if DEBUG
                    dbg_reigai.AppendLine(string.Format("SetNaiyoで未定義の手番が指定されたんだぜ☆ isSfen={0} 入力={1} 出力={2}",
                                                        f,
                                                        tb_Mojis,
                                                        syokikyokumenTai
                                                        ));
                    //reigai1.AppendLine($"ky.Teban=[{PureMemory.gky_ky.yomiKy.teban}]");
                    //reigai1.AppendLine($"BanTateHaba=[{PureSettei.banTateHaba}]");

                    dbg_reigai.AppendLine(string.Format("持ち駒数一覧({0}件)", danMojiretu.Length));
                    foreach (Motigoma mk in Conv_Motigoma.itiran)
                    {
                        dbg_reigai.AppendLine(string.Format("{0}={1}", mk, PureMemory.gky_ky.motigomaItiran.yomiMotigomaItiran.Count(mk)));
                    }
#endif
                    return(Pure.FailTrue("Try_Taikyokusya"));
                    //throw new Exception($"対局者のパースエラー tb_Mojis=[{tb_Mojis}]{reigai1.ToContents()}");
                }
                // 先手番始まりか、後手番始まりか、に合わせるぜ☆(^~^)
                PureMemory.ResetTebanArray(syokikyokumenTai);
                // 手番には 1 が入っていると思うんだが、無視して 0 スタートに固定するぜ☆(^~^)
                // PureMemory.ClearTeme();
            }

            return(Pure.SUCCESSFUL_FALSE);
        }
Beispiel #4
0
        /// <summary>
        /// 例: fen kr1/1h1/1H1/1R1 K2z 1
        /// 例: startpos
        ///
        /// moves 以降は解析しないが、あれば文字列は返すぜ☆(^~^)
        /// </summary>
        /// <param name="line">頭に「fen 」を付けておかないと、パースに失敗する☆</param>
        /// <returns>解析の成否</returns>
        public static bool TryFail_MatchPositionvalue(
            FenSyurui f,//翻訳で切替
            string line,
            ref int caret, out string out_moves
#if DEBUG
            , IDebugMojiretu reigai1
#endif
            )
        {
            out_moves = "";

            Match m = Itiran_FenParser.GetKyokumenPattern(f).Match(line, caret);

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

                // .Value は、該当しないときは空文字列か☆
                if (Itiran_FenParser.STARTPOS_LABEL == m.Groups[1].Value)
                {
                    // 初期局面をセットだぜ☆(^~^)
                    if (TryFail_SetSyokiKyokumen_ByFen(
                            f,
                            Itiran_FenParser.GetStartpos(f).Split('/'), //1~N 段目
                            Itiran_FenParser.MOTIGOMA_NASI,             // 持ち駒
                            Itiran_FenParser.TAIKYOKUSYA1
#if DEBUG
                            , reigai1 //手番
#endif
                            ))
                    {
                        return(Pure.FailTrue("Try_SetNaiyo(1)"));
                    }
                }
                else
                {
                    // 初期局面をセットだぜ☆(^~^)
                    if (TryFail_SetSyokiKyokumen_ByFen(
                            f,
                            m.Groups[2].Value.Split('/'), //1~N 段目
                            m.Groups[3].Value,            // 持ち駒
                            m.Groups[4].Value
#if DEBUG
                            , reigai1 //手番
#endif
                            ))
                    {
                        return(Pure.FailTrue("Try_SetNaiyo(2)"));
                    }
                }

                // TODO: moves
                if ("" != m.Groups[5].Value)
                {
                    out_moves = m.Groups[5].Value;
                }


                // 初期局面
                {
                    tmp_syokikyokumenFen.Clear();
                    SpkGenkyokuOpe.AppendFenTo(f, tmp_syokikyokumenFen);
                    PureMemory.kifu_syokiKyokumenFen = tmp_syokikyokumenFen.ToString();
                }
                return(Pure.SUCCESSFUL_FALSE);
            }

            {
                // FIXME:
#if DEBUG
                reigai1.AppendLine($"パースに失敗だぜ☆(^~^)! #麒麟 commandline=[{ line }] caret=[{ caret }]");
#endif
                return(false);
            }
        }