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); }
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); }
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); } }
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); } }
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);// パース・エラー☆(^▽^) }
/// <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); } }
/// <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); }
/// <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); }
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); } }
// /// <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); }
/// <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")); } }
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); }
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); } }
//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); }
/// <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;//追加 } }
/// <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); } }
/// <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 { // 該当しないものは無視だぜ☆(^▽^) } }
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(); }
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); }