示例#1
0
        public bool ParseDoMove(out Move out_move)
        {
            // コンソールからのキー入力を解析するぜ☆(^▽^)
            int caret    = this.caret;
            int oldCaret = this.caret;

            Util_String.TobasuTangoToMatubiKuhaku(this.commandline, ref caret, "do ");

            // うしろに続く文字は☆(^▽^)
            if (!LisPlay.MatchFenMove(PureSettei.fenSyurui, this.commandline, ref caret, out out_move))
            {
                this.caret = oldCaret;

                //String2 str = new String2Impl();
                //str.Append("指し手のパースに失敗だぜ☆(^~^)! #鷺 commandline=[");
                //str.Append(commandline);
                //str.Append("] caret=[");
                //str.Append(caret);
                //str.Append("]");
                //syuturyoku.AppendLine(str.ToContents());
                //Util_Machine.Flush();
                //throw new Exception(str.ToContents());
                return(false);
            }

            // do コマンドだった場合☆
            this.caret = caret;
            this.CommentCommandline();// コマンドの誤発動防止
            return(true);
        }
示例#2
0
        public static bool TryMoveCmd2(out Move out_move, string line)
        {
            // うしろに続く文字は☆(^▽^)
            int caret = 0;

            Util_String.TobasuTangoToMatubiKuhaku(line, ref caret, "move ");
            string line2 = line.Substring(caret).Trim();

            // move 912 といった数字かどうか☆(^~^)
            int ssSuji;

            if (int.TryParse(line2, out ssSuji))
            {
                out_move = (Move)ssSuji;
                return(true);
            }

            // 数字でなければ、 move B2B3 といった文字列か☆(^~^)
            if (!LisPlay.MatchFenMove(PureSettei.fenSyurui, line, ref caret, out out_move))
            {
                out_move = Move.Toryo;
                return(false);
            }

            return(true);
        }
示例#3
0
        public static bool MatchSrcMs(string line, ref int caret, out Masu out_ms
#if DEBUG
                                      , IDebugMojiretu hyoji
#endif
                                      )
        {
            Match m = GetSrcMsPattern(PureSettei.fenSyurui).Match(line, caret);

            if (m.Success)
            {
                // キャレットを進めます
                Util_String.SkipMatch(line, ref caret, m);
                string ms_moji = m.Groups[1].Value;

                int caret2 = 0;
                return(LisMasu.MatchMasu(ms_moji, ref caret2, out out_ms
#if DEBUG
                                         , hyoji
#endif
                                         ));
            }
            else
            {
                out_ms = Conv_Masu.masu_error;
                return(false);
            }
        }
示例#4
0
        public static bool MatchTaikyokusya(string line, ref int caret, out Taikyokusya out_tai
#if DEBUG
                                            , IDebugMojiretu hyoji
#endif
                                            )
        {
            Match m = GetTaikyokusyaPattern(PureSettei.fenSyurui).Match(line, caret);

            if (m.Success)
            {
                string tai_moji = m.Groups[1].Value;

                if (!Med_Parser.Try_MojiToTaikyokusya(PureSettei.fenSyurui, tai_moji, out out_tai))
                {
                    // パースエラーの場合(エラーにはしない)
                    return(false);
                }

                // キャレットを進めます
                Util_String.SkipMatch(line, ref caret, m);
                return(true);
            }
            else
            {
                out_tai = Taikyokusya.Yososu;
                return(false);
            }
        }
示例#5
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);// パース・エラー☆(^▽^)
        }
示例#6
0
        /// <summary>
        /// 2017-04-19 作成
        ///
        /// パースに失敗してもエラーではない。
        /// </summary>
        /// <param name="line"></param>
        /// <param name="caret"></param>
        /// <param name="out_ms"></param>
        /// <returns></returns>
        public static bool MatchMasu
            (string line, ref int caret, out Masu out_ms
#if DEBUG
            , IDebugMojiretu dbg_reigai
#endif
            )
        {
            Match m = Itiran_FenParser.GetMasuPattern(PureSettei.fenSyurui).Match(line, caret);

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

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

                // 升を返す
                out_ms = Conv_Masu.ToMasu(suji, dan);

                return(true);
            }
            else
            {
                // 該当なし(エラーではない)
                out_ms = Conv_Masu.masu_error;
                return(false);
            }
        }
示例#7
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);
        }
示例#8
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);
        }
示例#9
0
        public static bool MatchKoma(string line, ref int caret, out Piece out_km)
        {
            Match m = GetKomaPattern(PureSettei.fenSyurui).Match(line, caret);

            if (m.Success)
            {
                // キャレットを進めます
                Util_String.SkipMatch(line, ref caret, m);

                // 駒種類(FIXME: 後手の表記だと誤動作になるか?)
                string ks_moji = m.Groups[1].Value;
                return(LisKoma.Try_ParseFen(PureSettei.fenSyurui, ks_moji, out out_km));
            }
            else
            {
                out_km = Piece.Yososu;
                return(false);
            }
        }
示例#10
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);
        }
示例#11
0
        /// <summary>
        /// 持駒の枚数等
        /// </summary>
        /// <param name="isSfen"></param>
        /// <param name="suji"></param>
        /// <returns></returns>
        public static bool MatchInt(string line, ref int caret, out int out_int)
        {
            Match m = Itiran_FenParser.GetIntPattern().Match(line, caret);

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

                if (!int.TryParse(m.Groups[1].Value, out out_int))
                {
                    return(Pure.FailTrue(string.Format("パース失敗 m.Groups[1].Value=[{0}]", m.Groups[1].Value)));
                }
                return(Pure.SUCCESSFUL_FALSE);
            }
            else
            {
                out_int = 0;
                return(Pure.FailTrue("MatchInt not success1"));
            }
        }
示例#12
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);
        }
示例#13
0
        public static bool MatchKomasyurui(string line, ref int caret, out Komasyurui out_ks)
        {
            Match m = GetKomaPattern(PureSettei.fenSyurui).Match(line, caret);

            if (m.Success)
            {
                // キャレットを進めます
                Util_String.SkipMatch(line, ref caret, m);

                // 駒種類(FIXME: 後手の表記だと誤動作になるか?)
                string ks_moji = m.Groups[1].Value;
                out_ks = Med_Parser.MojiToKomasyurui(PureSettei.fenSyurui, ks_moji);
                return(true);
            }
            else
            {
                out_ks = Komasyurui.Yososu;
                return(false);
            }
        }
示例#14
0
        //public static Taikyokusya Yomu_Player(string commandline, ref int caret, ref bool sippai, StringBuilder syuturyoku)
        //{
        //    if (caret == commandline.IndexOf("1", caret))// 視点 対局者1
        //    {
        //        Util_String.TobasuTangoToMatubiKuhaku(commandline, ref caret, "1");
        //        return Taikyokusya.T1;
        //    }
        //    else if (caret == commandline.IndexOf("2", caret))// 視点 対局者2
        //    {
        //        Util_String.TobasuTangoToMatubiKuhaku(commandline, ref caret, "2");
        //        return Taikyokusya.T2;
        //    }

        //    sippai = true;
        //    syuturyoku.AppendLine("failure 対局者視点");
        //    return Taikyokusya.Yososu;
        //}

        public static MotiKoma Yomu_Motikoma(bool isSfen, string commandline, ref int caret, ref bool sippai, StringBuilder syuturyoku)
        {
            if (sippai)
            {
                syuturyoku.AppendLine("failure 持ち駒");
                return(MotiKoma.Yososu);
            }

            foreach (MotiKoma mk in Conv_MotiKoma.Itiran)
            {
                if (caret == commandline.IndexOf(Conv_MotiKoma.GetFen(isSfen, mk), caret))
                {
                    Util_String.TobasuTangoToMatubiKuhaku(commandline, ref caret, Conv_MotiKoma.GetFen(isSfen, mk));
                    return(mk);
                }
            }

            sippai = true;
            syuturyoku.AppendLine("failure 持ち駒");
            return(MotiKoma.Yososu);
        }
示例#15
0
        /// <summary>
        /// ここからコンソール・アプリケーションが始まるぜ☆(^▽^)
        ///
        /// PCのコンソール画面のプログラムなんだぜ☆(^▽^)
        /// Unityでは中身は要らないぜ☆(^~^)
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            try
            {
                var engineConf = new EngineConf();
                EntitiesLayer.Implement(engineConf);

                var playing = new Playing(engineConf);

                /*
                 #if DEBUG
                 * // いろいろテスト☆
                 * System.Console.WriteLine("# デバッグ");
                 * System.Console.WriteLine($"# (1L<<31)=[{(1L << 31)}]");
                 * System.Console.WriteLine($"# (1L<<32)=[{(1L << 32)}]");
                 * System.Console.WriteLine($"# (1L<<33)=[{(1L << 33)}]");
                 * System.Console.WriteLine($"# (1L<<62)=[{(1L << 62)}]");
                 * System.Console.WriteLine($"# (1L<<63)=[{(1L << 63)}]");
                 * System.Console.WriteLine($"# (1L<<64)=[{(1L << 64)}]");
                 * System.Console.WriteLine($"# (1L<<65)=[{(1L << 65)}]");
                 * System.Console.WriteLine($"# (long.MinValue << 1)=[{(long.MinValue << 1)}]");
                 * System.Console.WriteLine($"# (~0UL)=[{(~0UL)}]");
                 * System.Console.WriteLine($"# (~0UL << 1)=[{(~0UL << 1)}]");
                 #endif
                 */


                //────────────────────────────────────────
                // (手順1)アプリケーション開始前に設定しろだぜ☆(^▽^)!
                //────────────────────────────────────────
                {
                    // アプリケーション開始後は Face_Kifuwarabe.Execute("set 名前 値") を使って設定してくれだぜ☆(^▽^)
                    // ↓コメントアウトしているところは、デフォルト値を使っている☆(^~^)

                    //Option_Application.Optionlist.AspirationFukasa = 7;
                    //Option_Application.Optionlist.AspirationWindow = Hyokati.Hyokati_SeiNoSu_Hiyoko;
                    //Option_Application.Optionlist.BetaCutPer = 100;
                    //Option_Application.Optionlist.HanpukuSinkaTansakuTukau = true;
                    //Option_Application.Optionlist.JohoJikan = 3000;

                    //──────────
                    // 定跡
                    //──────────
                    Option_Application.Optionlist.JosekiPer = 0;     // 定跡を利用する確率。0~100。
                    Option_Application.Optionlist.JosekiRec = false; // 定跡は記録しない
                                                                     //Option_Application.Optionlist.JosekiRec = true;// 定跡を記録する☆

                    //Option_Application.Optionlist.Learn = false;
                    //Option_Application.Optionlist.NikomaHyokaKeisu = 1.0d;
                    //Option_Application.Optionlist.NikomaGakusyuKeisu = 0.001d;// HYOKA_SCALEが 1.0d のとき、GAKUSYU_SCALE 0.00001d なら、小数点部を広く使って じっくりしている☆(^~^)
                    //Option_Application.Optionlist.P1Com = false;
                    Option_Application.Optionlist.P2Com = true;           //対局者2はコンピューター☆
                                                                          //Option_Application.Optionlist.PNChar = new SasiteCharacter[] { SasiteCharacter.HyokatiYusen, SasiteCharacter.HyokatiYusen };
                                                                          //Option_Application.Optionlist.PNName = new string[] { "対局者1", "対局者2" };
                                                                          //Option_Application.Optionlist.RandomCharacter = false;
                                                                          //Option_Application.Optionlist.RandomNikoma = false;
                                                                          //Option_Application.Optionlist.RandomStart = false;
                                                                          //Option_Application.Optionlist.RenzokuTaikyoku = false;
                    Option_Application.Optionlist.SagareruHiyoko = false; // さがれるひよこモード☆ アプリケーション開始後は Face_Kifuwarabe.Execute("set SagareruHiyoko true") コマンドを使って設定すること☆ #仲ルール
                    Option_Application.Optionlist.SaidaiFukasa   = 13;    // コンピューターの読みの最大深さ

                    //──────────
                    // 成績
                    //──────────
                    Option_Application.Optionlist.SeisekiRec = false; // 成績は記録しない
                                                                      //Option_Application.Optionlist.SeisekiRec = true;// 成績を記録する☆

                    //Option_Application.Optionlist.SennititeKaihi = false;

                    //──────────
                    // 思考時間
                    //──────────
                    Option_Application.Optionlist.SikoJikan       = 5000; // 500; // 最低でも用意されているコンピューターが思考する時間(ミリ秒)
                    Option_Application.Optionlist.SikoJikanRandom = 5000; // 1501;// 追加で増えるランダム時間の最大(この値未満)。 期待値を考えて設定しろだぜ☆(^~^)例: ( 500 + 1500 ) / 2 = 1000
                                                                          //Option_Application.Optionlist.TranspositionTableTukau = true;
                                                                          //Option_Application.Optionlist.UseTimeOver = true;
                }

                StringBuilder syuturyoku = Util_Machine.Syuturyoku;

                // (手順3)アプリケーション開始時設定 を終えた後に これを呼び出すこと☆(^~^)!
                Option_Application.TimeManager.Stopwatch_Savefile.Start();// 定跡ファイルの保存間隔の計測
                Option_Application.TimeManager.Stopwatch_RenzokuRandomRule.Start();

                // 平手初期局面を作るぜ☆(*^~^*)
                Option_Application.Kyokumen.DoHirate(Option_Application.Optionlist.USI, syuturyoku);

                Util_Machine.Assert_Sabun_Kiki("アプリケーション始30", Option_Application.Kyokumen.Sindan);

                /*
                 * Util_Application.LoadJoseki(syuturyoku);// 定跡ファイルの読込み
                 * Util_Application.LoadSeiseki(syuturyoku);// 成績ファイルの読込み
                 * Util_Application.LoadNikoma(syuturyoku);// 二駒関係ファイルの読込み
                 */

                // ゲームモード設定☆
                Util_Application.GameMode = GameMode.Karappo;

                // まず最初に「USI\n」が届くかどうかを判定☆(^~^)
                Util_ConsoleGame.ReadCommandline(syuturyoku);
                //string firstInput = Util_Machine.ReadLine();
                if (Util_Commandline.Commandline == "usi")
                {
                    Option_Application.Optionlist.USI = true;

                    var     engineName   = engineConf.GetEngine("Name");
                    Version version      = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
                    var     engineAuthor = engineConf.GetEngine("Author");

                    playing.UsiOk($"{engineName} {version.Major}.{version.Minor}.{version.Build}", engineAuthor, syuturyoku);
                }
                else
                {
                    Util_ConsoleGame.WriteMessage_TitleGamen(syuturyoku);// とりあえず、タイトル画面表示☆(^~^)
                }

                // 空打ちで、ゲームモードに入るぜ☆(^▽^)
                var ky = Option_Application.Kyokumen;
                // このプログラムでは(A)コマンド・モード、(B)ゲーム・モード の2種類があるぜ☆
                // 最初は コマンド・モードになっている☆(^~^)
                //
                // ゲームモード
                //      (1)手番
                //              人間、コンピューターの設定が有効になり、
                //              人間の手番のときにしかコマンドが打てなくなるぜ☆
                //      (2)合法手
                //              指し手の合法手チェックを行うぜ☆
                //      (3)自動着手
                //              コンピューターは自分の手番で 指すぜ☆
                //      (4)決着
                //              決着すると ゲームモード を抜けるぜ☆ 連続対局設定の場合は抜けない☆(^▽^)
                //
                // コマンドモード
                //      (1)手番
                //              MAN vs MAN扱い
                //      (2)合法手
                //              チェックしない☆ ひよこをナナメに進めるのも、ワープするのも可能☆
                //      (3)自動着手
                //              しない☆
                //      (4)決着
                //              しない☆ [Enter]キーを空打ちすると、ゲームモードに変わるぜ☆(^▽^)

                for (; ;) //メインループ(無限ループ)
                {
                    //────────────────────────────────────────
                    // (手順2)ユーザー入力
                    //────────────────────────────────────────
                    Util_Commandline.InitCommandline();             // コマンド・ライン初期化☆
                    Util_Commandline.ReadCommandBuffer(syuturyoku); // コマンド・バッファー読取り☆

                    if (Util_Commandline.Commandline != null)
                    {
                        // コマンド・バッファーにコマンドラインが残っていたようなら、そのまま使うぜ☆(^▽^)
                    }
                    else if (
                        GameMode.Game == Util_Application.GameMode // ゲームモードの場合☆
                        &&
                        Util_Application.IsComputerNoBan(ky)       // コンピューターの番の場合☆
                        )
                    {
                        Util_Commandline.ClearCommandline(); // コマンドラインは消しておくぜ☆(^▽^)
                    }
                    else
                    {
                        Util_ConsoleGame.ReadCommandline(syuturyoku);// コンソールからのキー入力を受け取るぜ☆(^▽^)(コンソール・ゲーム用)
                    }

                    if (GameMode.Game == Util_Application.GameMode)
                    {
                        // 指す前の局面☆(定跡 登録用)
                        Util_ConsoleGame.Init_JosekiToroku(ky);

                        //────────────────────────────────────────
                        // (手順3)人間の手番
                        //────────────────────────────────────────
                        if (Util_Application.IsNingenNoBan(ky)) // 人間の手番
                        {
                            // ゲームモードでの人間の手番では、さらにコマンド解析

                            // ここで do コマンド(do b3b2 等)を先行して解析するぜ☆(^▽^)
                            if (Util_Commandline.Caret != Util_Commandline.Commandline.IndexOf("do ", Util_Commandline.Caret))
                            {
                                // do以外のコマンドであれば、コマンドラインを保持したまま、そのまま続行
                            }
                            // 以下、do コマンドの場合☆
                            else if (!Util_Application.ParseDoMove(ky, out Move inputSasite))
                            {
                                // do コマンドのパースエラー表示(コンソール・ゲーム用)☆(^~^)
                                syuturyoku.AppendLine(ConvMove.Setumei(MoveMatigaiRiyu.ParameterSyosikiMatigai));
                                var msg = syuturyoku.ToString();
                                syuturyoku.Clear();
                                Logger.Flush(msg);
                                Util_Commandline.CommentCommandline();                       // コマンドの誤発動防止
                            }
                            else if (!ky.CanDoMove(inputSasite, out MoveMatigaiRiyu reason)) // 指し手の合否チェック
                            {
                                // イリーガル・ムーブなどの、エラー理由表示☆(^~^)
                                syuturyoku.AppendLine(ConvMove.Setumei(reason));
                                var msg = syuturyoku.ToString();
                                syuturyoku.Clear();
                                Logger.Flush(msg);
                            }
                            else
                            {
                                // do コマンドを実行するぜ☆(^▽^)
                                // 1手指す☆!(^▽^)
                                Nanteme konoTeme = new Nanteme();// 使いまわさないだろう☆(^~^)ここで作ってしまおう☆
                                ky.DoMove(Option_Application.Optionlist.USI, inputSasite, MoveType.N00_Karappo, ref konoTeme, ky.CurrentOptionalPhase, syuturyoku);


                                Util_Application.JudgeKettyaku(inputSasite, ky);// 勝敗判定☆(^▽^)

                                // 局面出力
                                Util_Information.Setumei_NingenGameYo(ky, syuturyoku);
                                Util_ConsoleGame.Update1_JosekiToroku(inputSasite, ky, syuturyoku);// やるなら、定跡更新☆(^▽^)
                            }
                        }// 人間おわり☆(^▽^)

                        //────────────────────────────────────────
                        // (手順4)コンピューターの手番
                        //────────────────────────────────────────
                        else if (Util_Application.IsComputerNoBan(ky))                                                                                                        //コンピューターの番☆
                        {
                            Util_ConsoleGame.AppendMessage_ComputerSikochu(ky, syuturyoku);                                                                                   // 表示(コンピューター思考中☆)

                            Move bestSasite = Util_Application.Go(playing, ky, out HyokatiUtiwake best_hyokatiUTiwake, Face_YomisujiJoho.Dlgt_WriteYomisujiJoho, syuturyoku); // コンピューターに1手指させるぜ☆
                            Util_Application.JudgeKettyaku(bestSasite, ky);                                                                                                   // 勝敗判定☆(^▽^)

                            Util_ConsoleGame.Update2_JosekiToroku(bestSasite, best_hyokatiUTiwake.EdaBest, ky, syuturyoku);                                                   // やるなら、定跡更新☆(^▽^)
                            Util_ConsoleGame.ShowMessage_KettyakuJi(ky, syuturyoku);                                                                                          // 決着していた場合はメッセージ表示☆(^~^)
                        }// コンピューターの手番おわり☆(^~^)

                        //────────────────────────────────────────
                        // (手順5)決着時
                        //────────────────────────────────────────
                        if (Util_Application.IsKettyaku(ky))                                    // 決着が付いているなら☆
                        {
                            Util_Application.DoTejun5_SyuryoTaikyoku1(playing, ky, syuturyoku); // 対局終了時
                        }
                    }

                    //────────────────────────────────────────
                    // (手順6)ゲーム用の指し手以外のコマンドライン実行
                    //────────────────────────────────────────
                    string commandline = Util_Commandline.Commandline;
                    int    caret       = Util_Commandline.Caret;
                    Util_Commandline.IsQuit         = false;
                    Util_Commandline.IsKyokumenEcho = true; // ゲーム・モードの場合、特に指示がなければ コマンド終了後、局面表示を返すぜ☆
                    if (null == commandline)
                    {
                        // 未設定
                    }
                    else if (commandline == "")
                    {
                        // 空打ちは無視するか、からっぽモードでは、ゲームモードに切り替えるぜ☆(^▽^)
                        if (GameMode.Karappo == Util_Application.GameMode)// 感想戦での発動防止☆
                        {
                            // ゲームモード(対局開始)
                            Util_Application.GameMode = GameMode.Game;
                        }
                    }
                    // なるべく、アルファベット順☆(^▽^)同じつづりで始まる単語の場合、語句の長い単語を優先にしないと if 文が通らないぜ☆www
                    else if (caret == commandline.IndexOf("@", caret))
                    {
                        playing.Atmark(commandline);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("#", caret))
                    {
                        // 受け付けるが、何もしないぜ☆(^▽^)www
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("bitboard", caret))
                    {
                        // テスト用だぜ☆(^~^)
                        if (commandline == "bitboard")
                        {
                            // ビットボード表示☆

                            // 筋
                            {
                                for (int iSuji = 0; iSuji < Option_Application.Optionlist.BanYokoHaba; iSuji++)
                                {
                                    Util_Information.Setumei_1Bitboard($"筋{iSuji}", ky.BB_SujiArray[iSuji], syuturyoku);
                                }
                                syuturyoku.AppendLine();
                            }
                            // 段
                            {
                                for (int iDan = 0; iDan < Option_Application.Optionlist.BanTateHaba; iDan++)
                                {
                                    Util_Information.Setumei_1Bitboard($"段{iDan}", ky.BB_DanArray[iDan], syuturyoku);
                                }
                                syuturyoku.AppendLine();
                            }
                            // トライ
                            {
                                Util_Information.Setumei_Bitboards(new string[] { "対局者1", "対局者2(トライ)" },
                                                                   new Bitboard[] { ky.BB_Try[(int)Phase.Black], ky.BB_Try[(int)Phase.White] }, syuturyoku);
                                syuturyoku.AppendLine();
                            }

                            Util_Information.HyojiKomanoIbasho(ky.Shogiban, syuturyoku);                       // 駒の居場所☆
                            Util_Information.HyojiKomanoKikiSu(ky.Shogiban, syuturyoku);                       // 駒の重ね利き数☆
                            Util_Information.HyojiKomanoKiki(ky.Shogiban, syuturyoku);                         // 駒の利き☆
                            Util_Information.HyojiKomanoUgoki(ky.Shogiban, ky.Sindan.MASU_YOSOSU, syuturyoku); // 駒の動き☆
                            return;
                        }

                        // うしろに続く文字は☆(^▽^)
                        int caret2 = 0;
                        Util_String.TobasuTangoToMatubiKuhaku(commandline, ref caret2, "bitboard ");

                        if (caret2 == commandline.IndexOf("kiki", caret2))
                        {
                            // 重ね利きビットボード表示☆

                            // 駒別
                            {
                                // 再計算
                                Shogiban saikeisan = new Shogiban(ky.Sindan);
                                saikeisan.Tukurinaosi_1_Clear_KikiKomabetu();
                                saikeisan.Tukurinaosi_2_Input_KikiKomabetu(ky.Sindan);
                                saikeisan.TukurinaosiBBKikiZenbu();

                                syuturyoku.AppendLine("利き:(再計算)全部、駒別");
                                Util_Information.HyojiKomanoKiki(saikeisan, syuturyoku);

                                // 現行
                                syuturyoku.AppendLine("利き:(現行)全部、駒別");
                                Util_Information.HyojiKomanoKiki(ky.Shogiban, syuturyoku);
                            }

                            // 全部
                            {
                                // 再計算
                                Shogiban saikeisan = new Shogiban(ky.Sindan);
                                saikeisan.TukurinaosiKikisuZenbu(ky.Shogiban, ky.Sindan);
                                saikeisan.TukurinaosiKikisuKomabetu(ky.Shogiban, ky.Sindan);

                                syuturyoku.AppendLine("利き数:(再計算)全部、駒別");
                                Util_Information.HyojiKomanoKikiSu(saikeisan, syuturyoku);

                                // 現行
                                syuturyoku.AppendLine("利き数:全部(現行)全部、駒別");
                                Util_Information.HyojiKomanoKikiSu(ky.Shogiban, syuturyoku);
                            }

                            return;
                        }
                        else if (caret2 == commandline.IndexOf("remake", caret2))
                        {
                            // 駒の動き方を作り直し
                            ky.Shogiban.Tukurinaosi_1_Clear_KomanoUgokikata(ky.Sindan.MASU_YOSOSU);
                            ky.Shogiban.Tukurinaosi_2_Input_KomanoUgokikata(ky.Sindan);
                        }

                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("cando", caret))
                    {
                        // GameMode.Game == Util_Application.GameMode ? CommandMode.NingenYoConsoleGame : CommandMode.NigenYoConsoleKaihatu,
                        // うしろに続く文字は☆(^▽^)
                        int caret2 = 0;
                        Util_String.TobasuTangoToMatubiKuhaku(commandline, ref caret2, "cando ");

                        if (!Med_Parser.TryFenMove(Option_Application.Optionlist.USI, commandline, ref caret2, ky.Sindan, out Move ss))
                        {
                            throw new Exception($"パースエラー [{commandline}]");
                        }

                        if (ky.CanDoMove(ss, out MoveMatigaiRiyu riyu))
                        {
                            syuturyoku.AppendLine("cando, true");
                        }
                        else
                        {
                            syuturyoku.Append("cando, false, ");
                            syuturyoku.AppendLine(riyu.ToString());
                        }
                    }
                    else if (caret == commandline.IndexOf("clear", caret))
                    {
                        Util_Machine.Clear();
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("do", caret))
                    {
                        playing.Do(
                            Option_Application.Optionlist.USI,
                            commandline,
                            ky,
                            GameMode.Game == Util_Application.GameMode ? CommandMode.NingenYoConsoleGame : CommandMode.NigenYoConsoleKaihatu,
                            syuturyoku);
                    }
                    else if (caret == commandline.IndexOf("gameover", caret))
                    {
                        playing.Gameover(commandline, ky, syuturyoku);
                    }
                    else if (caret == commandline.IndexOf("go", caret))
                    {
                        var isSfen = Option_Application.Optionlist.USI;
                        var mode   = CommandMode.NigenYoConsoleKaihatu;
                        playing.Go(isSfen, mode, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("hash", caret))
                    {
                        playing.Hash(ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("hirate", caret))
                    {
                        playing.Hirate(Option_Application.Optionlist.USI, ky, syuturyoku);
                    }
                    else if (caret == commandline.IndexOf("honyaku", caret))
                    {
                        playing.Honyaku(commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("hyoka", caret))
                    {
                        playing.Hyoka(commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("isready", caret))
                    {
                        playing.ReadyOk(syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("jam", caret))
                    {
                        playing.Jam(Option_Application.Optionlist.USI, ky, syuturyoku);
                    }
                    else if (caret == commandline.IndexOf("jokyo", caret))
                    {
                        playing.Jokyo(commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("joseki", caret))
                    {
                        playing.Joseki(Option_Application.Optionlist.USI, commandline, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("kansosen", caret))
                    {
                        // 駒の場所を表示するぜ☆(^▽^)
                        playing.Kansosen(Option_Application.Optionlist.USI, commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("kifu", caret))
                    {
                        // 駒の場所を表示するぜ☆(^▽^)
                        playing.Kifu(Option_Application.Optionlist.USI, commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("kikikazu", caret))
                    {
                        // 利きの数を調べるぜ☆(^▽^)
                        playing.KikiKazu(commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("kiki", caret))
                    {
                        // 利きを調べるぜ☆(^▽^)
                        playing.Kiki(Option_Application.Optionlist.USI, commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("koma", caret))
                    {
                        // 駒の場所を表示するぜ☆(^▽^)
                        playing.Koma_cmd(Option_Application.Optionlist.USI, commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("ky", caret))
                    {
                        // 局面を表示するぜ☆(^▽^)
                        Util_Machine.Assert_Sabun_Kiki("飛び利き増やす1", ky.Sindan);
                        playing.Ky(Option_Application.Optionlist.USI, commandline, ky, syuturyoku);
                        Util_Machine.Assert_Sabun_Kiki("飛び利き増やす2", ky.Sindan);

                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("manual", caret))
                    {
                        // "man" と同じ☆(^▽^)
                        playing.Man(syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("man", caret))
                    {
                        // "manual" と同じ☆(^▽^)
                        playing.Man(syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("masu", caret))
                    {
                        playing.Masu_cmd(commandline, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("nikoma", caret))
                    {
                        playing.Nikoma(Option_Application.Optionlist.USI, commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("position", caret))
                    {
                        playing.Position();

                        // うしろに続く文字は☆(^▽^)
                        int caret2 = 0;
                        Util_String.YomuTangoTobasuMatubiKuhaku(commandline, ref caret2, out string token);

                        if ("position" == token)
                        {
                            // パース☆!(^▽^)
                            if (!ky.ParsePositionvalue(Option_Application.Optionlist.USI, commandline, ref caret2, true, false, out string moves, syuturyoku))
                            {
                                string msg = "パースに失敗だぜ☆(^~^)! #黒牛";
                                syuturyoku.AppendLine(msg);
                                var msg2 = syuturyoku.ToString();
                                syuturyoku.Clear();
                                Logger.Flush(msg2);
                                throw new Exception(msg);
                            }

                            // 棋譜を作成するぜ☆(^▽^)
                            Kifu kifu = new Kifu();

                            // 初期局面
                            {
                                StringBuilder mojiretu = new StringBuilder();
                                ky.AppendFenTo(Option_Application.Optionlist.USI, mojiretu);
                                kifu.SyokiKyokumenFen = mojiretu.ToString();
                            }

                            // うしろに続く文字は☆(^▽^)
                            Util_String.YomuTangoTobasuMatubiKuhaku(commandline, ref caret2, out token);
                            if ("" != moves)
                            {
                                // moves が続いていたら☆(^~^)

                                // 頭の moves を取り除くぜ☆(*^~^*)
                                moves = moves.Substring("moves ".Length);

                                kifu.AddMoves(Option_Application.Optionlist.USI, moves, ky.Sindan);

                                // positionで渡された最終局面まで進めようぜ☆(^▽^)www
                                kifu.GoToFinish(Option_Application.Optionlist.USI, ky, syuturyoku);
                            }

                            // 初回は「position startpos」しか送られてこない☆(^~^)
                        }
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("quit", caret))
                    {
                        playing.Quit();
                        Util_Commandline.IsQuit = true;
                    }
                    else if (caret == commandline.IndexOf("result", caret))
                    {
                        playing.Result(ky, syuturyoku, CommandMode.NigenYoConsoleKaihatu);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("rnd", caret))
                    {
                        playing.Rnd(ky, syuturyoku);
                    }
                    else if (caret == commandline.IndexOf("move", caret))
                    {
                        playing.MoveCmd(Option_Application.Optionlist.USI, commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("see", caret))
                    {
                        playing.See(Option_Application.Optionlist.USI, commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("seiseki", caret))
                    {
                        playing.Seiseki(Option_Application.Optionlist.USI, commandline, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("setoption", caret))
                    {
                        // // とりあえず無視☆(*^~^*)

                        // 「setoption name 名前 value 値」といった書式なので、
                        // 「set 名前 値」に変えたい。

                        // うしろに続く文字は☆(^▽^)
                        int caret2 = 0;
                        Util_String.TobasuTangoToMatubiKuhaku(commandline, ref caret2, "setoption ");
                        Util_String.TobasuTangoToMatubiKuhaku(commandline, ref caret2, "name ");
                        int end = commandline.IndexOf("value ", caret2);
                        if (-1 != end)
                        {
                            StringBuilder sb = new StringBuilder();
                            sb.Append("set ");
                            sb.Append(commandline.Substring(caret2, end - caret2)); //名前
                            caret2 = end + "value ".Length;
                            sb.Append(commandline.Substring(caret2));               //値

                            playing.Set(sb.ToString(), ky, syuturyoku);
                        }

                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("set", caret))
                    {
                        playing.Set(commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("taikyokusya", caret))
                    {
                        playing.Taikyokusya_cmd(commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("test", caret))
                    {
                        playing.Test(Option_Application.Optionlist.USI, commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("tantaitest", caret))
                    {
                        playing.TantaiTest(playing, Option_Application.Optionlist.USI, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("tumeshogi", caret))
                    {
                        // "tu" と同じ☆(^▽^)
                        playing.TumeShogi(Option_Application.Optionlist.USI, commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("tu", caret))
                    {
                        // "tumeshogi" と同じ☆(^▽^)
                        playing.TumeShogi(Option_Application.Optionlist.USI, commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("undo", caret))
                    {
                        playing.Undo(commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("usinewgame", caret))
                    {
                        playing.UsiNewGame();
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("usi", caret))
                    {
                        //ここは普通、来ない☆(^~^)
                        var     engineName   = engineConf.GetEngine("Name");
                        Version version      = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
                        var     engineAuthor = engineConf.GetEngine("Author");

                        playing.UsiOk($"{engineName} {version.Major}.{version.Minor}.{version.Build}", engineAuthor, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else
                    {
                        // 表示(コンソール・ゲーム用)
                        syuturyoku.Append("「");
                        syuturyoku.Append(commandline);
                        syuturyoku.AppendLine("」☆?(^▽^)");

                        syuturyoku.AppendLine("そんなコマンドは無いぜ☆(>_<) man で調べろだぜ☆(^▽^)");
                        var msg = syuturyoku.ToString();
                        syuturyoku.Clear();
                        Logger.Flush(msg);
                    }

                    if (Util_Commandline.IsQuit)
                    {
                        break;//goto gt_EndLoop1;
                    }

                    // 次の入力を促す表示をしてるだけだぜ☆(^~^)
                    Util_Commandline.ShowPrompt(playing, Option_Application.Optionlist.USI, ky, syuturyoku);
                }//無限ループ
                 //gt_EndLoop1:
                 //;

                // 開発モードでは、ユーザー入力を待機するぜ☆(^▽^)

                // (手順5)アプリケーション終了時に呼び出せだぜ☆(^▽^)!
                Face_Kifuwarabe.OnApplicationFinished(syuturyoku);
            }
            catch (Exception ex)
            {
                // エラーが起こりました。
                //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

                // どうにもできないので  ログだけ取って無視します。
                Logger.Fatal($"(^ー^)「大外枠でキャッチ」:{ex}");
                Console.Out.WriteLine("bestmove resign");
                //throw;//追加
            }
        }
示例#16
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);
            }
        }
示例#17
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
            {
                // 該当しないものは無視だぜ☆(^▽^)
            }
        }
示例#18
0
        public IEnumerator GetProgramDetailsByID(ProgramDetailsInfo result, string id)
        {
            string strUri = "https://external.api.yle.fi/v1/programs/items/";

            _sb.Length = 0;
            _sb.Append(strUri);
            _sb.Append(id);
            _sb.Append(".json?");
            _sb.Append(_authInfo);

            string requestData = _sb.ToString();

            while (_netThread.Request(requestData) == false)
            {
                yield return(null);
            }

            string resultString = null;

            while (_netThread.PopResponseData(ref resultString) == false)
            {
                yield return(null);
            }

            JSONObject jsonResult  = new JSONObject(resultString);
            JSONObject data        = jsonResult ["data"];
            JSONObject title       = data ["title"];
            JSONObject description = data ["description"];
            JSONObject image       = data ["image"];
            //JSONObject typeMedia = data ["typeMedia"];
            JSONObject        type              = data ["type"];
            JSONObject        duration          = data ["duration"];
            List <JSONObject> publicationEvents = data ["publicationEvent"].list;
            JSONObject        publicationEvent  = null;
            JSONObject        startTime         = null;
            JSONObject        region            = null;

            if (publicationEvents.Count > 0)
            {
                publicationEvent = publicationEvents [0];
                startTime        = publicationEvent ["startTime"];
                region           = publicationEvent ["region"];
            }

            if (title != null &&
                title ["fi"] != null)
            {
                string[] titles = Util_String.SplitTitle(Util_String.ReplaceString(title ["fi"].str));

                if (titles.Length > 1)
                {
                    result.title1 = titles[0];
                    result.title2 = titles[1];
                }
                else
                {
                    result.title1 = null;
                    result.title2 = titles[0];
                }
            }

            if (description != null &&
                description ["fi"] != null)
            {
                result.description = Util_String.ReplaceString(description ["fi"].str);
            }

            if (image != null &&
                image.Count > 0 &&
                image["id"] != null)
            {
                int    size        = Screen.width;
                string imageFormat = "jpg";
                string imageUrl    = string.Format("http://images.cdn.yle.fi/image/upload/w_{0},h_{1},c_fit/{2}.{3}", size, size, image["id"].str, imageFormat);

                WWW www = new WWW(imageUrl);

                yield return(www);

                result.image = Sprite.Create(www.texture, new Rect(0, 0, www.texture.width, www.texture.height), new Vector2(0, 0));

                Resources.UnloadUnusedAssets();
            }

            if (type != null)
            {
                result.type = type.str;
            }

            if (duration != null)
            {
                result.duration = Util_String.ToDisplayDuration(duration.str);
            }

            if (startTime != null)
            {
                result.startTime = Util_String.ToDisplayStartTime(startTime.str);
            }

            if (region != null)
            {
                result.region = region.str;
            }

            _netThread.FinishResponse();
        }
示例#19
0
        public IEnumerator GetPrograms(SearchProgramParameter parameter, int maxSearchCount)
        {
            List <ProgramInfo> result = new List <ProgramInfo> ();

            string strUri = "https://external.api.yle.fi/v1/programs/items.json?";

            _sb.Length = 0;
            _sb.Append(strUri);
            _sb.Append("q=");
            _sb.Append(parameter.keyword);
            _sb.Append('&');
            _sb.Append("offset=");
            _sb.Append(parameter.offset);
            _sb.Append('&');
            //_sb.Append ("category=5-135&");
            _sb.Append("availability=ondemand&");       // available
            _sb.Append("contentprotection=22-0,22-1&"); // exclude drm protected
            //_sb.Append ("region=world&"); // exclude fi region
            _sb.Append("language=fi&");                 // exclude fi region
            _sb.Append(_authInfo);

            string requestData = _sb.ToString();

            while (_netThread.Request(requestData) == false)
            {
                yield return(null);
            }

            string resultString = null;

            while (_netThread.PopResponseData(ref resultString) == false)
            {
                yield return(null);
            }

            _netThread.FinishResponse();

            JSONObject jsonResult = new JSONObject(resultString);
            JSONObject meta       = jsonResult ["meta"];

            parameter.metaCount = (int)meta ["count"].i;
            int               limit    = (int)meta ["limit"].i;
            JSONObject        data     = jsonResult ["data"];
            List <JSONObject> programs = data.list;

            if (programs.Count == 0)
            {
                parameter.offset += limit;
            }

            foreach (var program in programs)
            {
                parameter.offset++;

                if (IsValidSubject(program ["subject"]) == false)
                {
                    continue;
                }

                JSONObject        title             = program ["title"];
                JSONObject        description       = program ["description"];
                JSONObject        type              = program ["type"];
                List <JSONObject> publicationEvents = program ["publicationEvent"].list;
                JSONObject        publicationEvent  = null;
                JSONObject        startTime         = null;

                if (publicationEvents.Count > 0)
                {
                    publicationEvent = publicationEvents [0];
                    startTime        = publicationEvent ["startTime"];
                }

                ProgramInfo newInfo = new ProgramInfo();

                newInfo.number = parameter.number;
                parameter.number++;

                newInfo.id = program ["id"].str;

                if (title != null &&
                    title ["fi"] != null)
                {
                    newInfo.title = title ["fi"].str;
                }

                if (title != null &&
                    title ["fi"] != null)
                {
                    string[] titles = Util_String.SplitTitle(Util_String.ReplaceString(title ["fi"].str));

                    if (titles != null)
                    {
                        if (titles.Length > 1)
                        {
                            newInfo.title = string.Format("{0} | {1}", titles[1], titles[0]);
                        }
                        else
                        {
                            newInfo.title = titles[0];
                        }
                    }
                }

                if (description != null &&
                    description ["fi"] != null)
                {
                    newInfo.description = Util_String.ReplaceString(description ["fi"].str);
                }

                if (type != null)
                {
                    newInfo.type = type.str;
                }

                if (startTime != null)
                {
                    newInfo.startTime = Util_String.ToDisplayStartTime(startTime.str);
                }

                result.Add(newInfo);

                parameter.searchCount++;

                if (parameter.searchCount >= maxSearchCount)
                {
                    break;
                }
            }

            parameter.programInfos.AddRange(result);
        }