Ejemplo n.º 1
0
        public static MoveCharacter Parse(string line, ref int caret)
        {
            // うしろに続く文字は☆(^▽^)
            if (Util_String.MatchAndNext("HyokatiYusen", line, ref caret))
            {
                return(MoveCharacter.HyokatiYusen);
            }
            else if (Util_String.MatchAndNext("SyorituYusen", line, ref caret))
            {
                return(MoveCharacter.SyorituYusen);
            }
            else if (Util_String.MatchAndNext("SyorituNomi", line, ref caret))
            {
                return(MoveCharacter.SinteYusen);
            }
            else if (Util_String.MatchAndNext("SinteYusen", line, ref caret))
            {
                return(MoveCharacter.SinteYusen);
            }
            else if (Util_String.MatchAndNext("SinteNomi", line, ref caret))
            {
                return(MoveCharacter.SinteNomi);
            }
            else if (Util_String.MatchAndNext("TansakuNomi", line, ref caret))
            {
                return(MoveCharacter.TansakuNomi);
            }

            return(MoveCharacter.Yososu);// パース・エラー☆(^▽^)
        }
Ejemplo n.º 2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="line">B4B3、または toryo といった文字列を含む行☆</param>
        /// <param name="caret">文字カーソルの位置</param>
        /// <param name="ky">取られた駒を調べるために使う☆</param>
        /// <param name="out_move"></param>
        /// <returns></returns>
        public static bool MatchFenMove(
            FenSyurui f,
            string line,
            ref int caret,
            out Move out_move
            )
        {
            if (Util_String.MatchAndNext(Itiran_FenParser.GetToryo(f), line, ref caret))
            {
                out_move = Move.Toryo;
                return(true);
            }

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

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

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

                out_move = 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(line, ref caret, m);

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

            return(true);
        }
Ejemplo n.º 3
0
//        /// <summary>
//        /// コンピューターに思考させます。
//        /// ここが入り口です。
//        /// </summary>
//        /// <param name="gky"></param>
//        /// <param name="out_hyokatiUtiwake"></param>
//        /// <param name="dlgt_CreateJoho"></param>
//        /// <param name="hyoji"></param>
//        /// <returns></returns>
//        public static bool TryFail_Go(
//            out Move out_move,
//            Genkyoku gky,
//            out HyokatiAb out_hyokatiUtiwake,
//            StringBuilder hyoji
//            )
//        {
//            if (Util_Tansaku.TryFail_Go(out out_move, gky, out out_hyokatiUtiwake, hyoji))
//            {
//                return Pure.FailTrue("Util_Tansaku.Try_Go"
//#if DEBUG
//                                        , (IDebugMojiretu)hyoji
//#endif
//                    );
//            }

//            return Pure.SUCCESSFUL_FALSE;
//        }

        /// <summary>
        /// 2017-11-08 undo の後ろには 符号を付けないように変更☆(^~^)
        /// </summary>
        /// <param name="line"></param>
        /// <param name="hyoji"></param>
        /// <returns></returns>
        public static bool Try_Undo(string line, StringBuilder hyoji)
        {
            // うしろに続く文字は☆(^▽^)
            int caret = 0;

            if (Util_String.MatchAndNext("undo", line, ref caret))
            {
                if (UndoMoveOpe.TryFailUndoMove(
#if DEBUG
                        PureSettei.fenSyurui
                        , (IDebugMojiretu)hyoji
#endif
                        ))
                {
                    return(false);
                }
            }

            return(true);
        }
Ejemplo n.º 4
0
        public static Motigoma Yomu_Motikoma(FenSyurui f, string line, ref int caret, ref bool sippai, StringBuilder hyoji)
        {
            if (sippai)
            {
                hyoji.AppendLine("failure 持ち駒");
                return(Motigoma.Yososu);
            }

            foreach (Motigoma mk in Conv_Motigoma.itiran)
            {
                if (Util_String.MatchAndNext(SpkMotiKoma.GetFen(f, mk), line, ref caret))
                {
                    return(mk);
                }
            }

            sippai = true;
            hyoji.AppendLine("failure 持ち駒");
            return(Motigoma.Yososu);
        }
Ejemplo n.º 5
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="line">コマンドライン</param>
        /// <param name="ky2"></param>
        /// <param name="hyoji"></param>
        public static void Set(
            string line, StringBuilder hyoji
            )
        {
            int caret = 0;

            if (Util_String.MatchAndNext("set", line, ref caret))
            {
                #region BanTateHaba
                if (Util_String.MatchAndNext("BanTateHaba", line, ref caret))
                {
                    // うしろに続く文字は☆(^▽^)
                    string rest = line.Substring(caret);
                    if (int.TryParse(rest, out int val))
                    {
                        PureSettei.banTateHabaOld = PureSettei.banTateHaba;
                        PureSettei.banTateHaba    = val;

                        // 縦幅と横幅は続けて変えることが多いんで、
                        // 駒の動きの作り直しは別コマンドに分けて行えだぜ☆(^~^)
                    }
                }
                #endregion
                #region BanYokoHaba
                else if (Util_String.MatchAndNext("BanYokoHaba", line, ref caret))
                {
                    // うしろに続く文字は☆(^▽^)
                    string rest = line.Substring(caret);
                    if (int.TryParse(rest, out int val))
                    {
                        PureSettei.banYokoHabaOld = PureSettei.banYokoHaba;
                        PureSettei.banYokoHaba    = val;

                        // 縦幅と横幅は続けて変えることが多いんで、
                        // 駒の動きの作り直しは別コマンドに分けて行えだぜ☆(^~^)
                    }
                }
                #endregion
                #region FEN
                else if (Util_String.MatchAndNext("FEN", line, ref caret))
                {
                    // うしろに続く文字は☆(^▽^)
                    string rest = line.Substring(caret);
                    switch (rest)
                    {
                    case "dfen": PureSettei.fenSyurui = FenSyurui.dfe_n; break;

                    case "sfen": PureSettei.fenSyurui = FenSyurui.sfe_n; break;

                    default:
                        throw new Exception(string.Format("未定義 {0}", rest));
                    }
                }
                #endregion
                #region GameRule
                else if (Util_String.MatchAndNext("GameRule", line, ref caret))
                {
                    if (Util_String.MatchAndNext("DobutuShogi", line, ref caret))
                    {
                        PureSettei.gameRule = GameRule.DobutuShogi;
                    }
                    else if (Util_String.MatchAndNext("HonShogi", line, ref caret))
                    {
                        PureSettei.gameRule = GameRule.HonShogi;
                    }
                }
                #endregion
                #region HimodukiHyokaTukau
                else if (Util_String.MatchAndNext("HimodukiHyokaTukau", line, ref caret))
                {
                    // うしろに続く文字は☆(^▽^)
                    string rest = line.Substring(caret);
                    if (bool.TryParse(rest, out bool val))
                    {
                        ComSettei.himodukiHyokaTukau = val;
                    }
                }
                #endregion
                #region IttedumeTukau
                else if (Util_String.MatchAndNext("IttedumeTukau", line, ref caret))
                {
                    // うしろに続く文字は☆(^▽^)
                    string rest = line.Substring(caret);
                    if (bool.TryParse(rest, out bool val))
                    {
                        PureSettei.ittedumeTukau = val;
                    }
                }
                #endregion
                #region JohoJikan
                else if (Util_String.MatchAndNext("JohoJikan", line, ref caret))
                {
                    // うしろに続く文字は☆(^▽^)
                    string rest = line.Substring(caret);
                    if (int.TryParse(rest, out int val))
                    {
                        ComSettei.johoJikan = val;
                    }
                }
                #endregion
                #region P1Char
                else if (Util_String.MatchAndNext("P1Char", line, ref caret))
                {
                    // うしろに続く文字は☆(^▽^)
                    PureSettei.char_playerN[(int)Taikyokusya.T1] = LisMoveCharacter.Parse(line, ref caret);
                }
                #endregion
                #region P1Com
                else if (Util_String.MatchAndNext("P1Com", line, ref caret))
                {
                    // うしろに続く文字は☆(^▽^)
                    string rest = line.Substring(caret);
                    if (bool.TryParse(rest, out bool val))
                    {
                        PureSettei.p1Com = val;
                    }
                }
                #endregion
                #region P1Name
                else if (Util_String.MatchAndNext("P1Name", line, ref caret))
                {
                    // うしろに続く文字は☆(^▽^)
                    PureSettei.name_playerN[(int)Taikyokusya.T1] = line.Substring(caret);
                }
                #endregion
                #region P2Char
                else if (Util_String.MatchAndNext("P2Char", line, ref caret))
                {
                    // うしろに続く文字は☆(^▽^)
                    PureSettei.char_playerN[(int)Taikyokusya.T2] = LisMoveCharacter.Parse(line, ref caret);
                }
                #endregion
                #region P2Com
                else if (Util_String.MatchAndNext("P2Com", line, ref caret))
                {
                    // うしろに続く文字は☆(^▽^)
                    string rest = line.Substring(caret);
                    if (bool.TryParse(rest, out bool val))
                    {
                        PureSettei.p2Com = val;
                    }
                }
                #endregion
                #region P2Name
                else if (Util_String.MatchAndNext("P2Name", line, ref caret))
                {
                    // うしろに続く文字は☆(^▽^)
                    PureSettei.name_playerN[(int)Taikyokusya.T2] = line.Substring(caret);
                }
                #endregion
                #region RenzokuTaikyoku
                else if (Util_String.MatchAndNext("RenzokuTaikyoku", line, ref caret))
                {
                    // うしろに続く文字は☆(^▽^)
                    string rest = line.Substring(caret);
                    if (bool.TryParse(rest, out bool val))
                    {
                        ConsolegameSettei.renzokuTaikyoku = val;
                    }
                }
                #endregion
                #region SaidaiFukasa
                else if (Util_String.MatchAndNext("SaidaiFukasa", line, ref caret))
                {
                    // うしろに続く文字は☆(^▽^)
                    string rest = line.Substring(caret);
                    if (int.TryParse(rest, out int val))
                    {
                        ComSettei.saidaiFukasa = val;

                        if (PureMemory.MaxMoveDepth - 1 < ComSettei.saidaiFukasa)
                        {
                            ComSettei.saidaiFukasa = PureMemory.MaxMoveDepth - 1;
                            hyoji.AppendLine($"(^q^)実装の上限の [{ (PureMemory.MaxMoveDepth - 1) }] に下げたぜ☆");
                        }
                    }
                }
                #endregion
                #region SikoJikan
                else if (Util_String.MatchAndNext("SikoJikan", line, ref caret))
                {
                    // うしろに続く文字は☆(^▽^)
                    string rest = line.Substring(caret);
                    if (long.TryParse(rest, out long val))
                    {
                        ComSettei.sikoJikan = val;
                    }
                }
                #endregion
                #region SikoJikanRandom
                else if (Util_String.MatchAndNext("SikoJikanRandom", line, ref caret))
                {
                    // うしろに続く文字は☆(^▽^)
                    string rest = line.Substring(caret);
                    if (int.TryParse(rest, out int val))
                    {
                        ComSettei.sikoJikanRandom = val;
                    }
                }
                #endregion
                #region TobikikiTukau
                else if (Util_String.MatchAndNext("TobikikiTukau", line, ref caret))
                {
                    // うしろに続く文字は☆(^▽^)
                    string rest = line.Substring(caret);
                    if (bool.TryParse(rest, out bool val))
                    {
                        PureSettei.tobikikiTukau = val;
                    }
                }
                #endregion
                #region UseTimeOver
                else if (Util_String.MatchAndNext("UseTimeOver", line, ref caret))
                {
                    // うしろに続く文字は☆(^▽^)
                    string rest = line.Substring(caret);
                    if (bool.TryParse(rest, out bool val))
                    {
                        ComSettei.useTimeOver = val;
                    }
                }
                #endregion
                #region USI
                else if (Util_String.MatchAndNext("USI", line, ref caret))
                {
                    // うしろに続く文字は☆(^▽^)
                    string rest = line.Substring(caret);
                    if (bool.TryParse(rest, out bool val))
                    {
                        PureSettei.usi = val;
                    }
                }
                #endregion
            }
            else
            {
                // 該当しないものは無視だぜ☆(^▽^)
            }
        }