public static void ReadCommandline(ProgramSupport programSupport, StringBuilder hyoji) { Logger.Flush(hyoji); programSupport.SetCommandline(Util_Machine.ReadLine()); hyoji.AppendLine(programSupport.commandline); Logger.Flush_NoEcho(hyoji); }
/// <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> /// ここからコンソール・アプリケーションが始まるぜ☆(^▽^) /// /// PCのコンソール画面のプログラムなんだぜ☆(^▽^) /// Unityでは中身は要らないぜ☆(^~^) /// </summary> /// <param name="args"></param> static void Main(string[] args) { var playing = new Playing(); var programSupport = new ProgramSupport(); // (手順2)きふわらべの応答は、文字列になって ここに入るぜ☆(^▽^) // syuturyoku.ToContents() メソッドで中身を取り出せるぜ☆(^~^) StringBuilder hyoji = PureAppli.syuturyoku1; Interproject.project = new WinconsoleProject(); if (PureAppli.TryFail_Init()) { Logger.Flush(hyoji); throw new Exception(hyoji.ToString()); } // コンソールゲーム用の設定上書き ConsolegameSettei.Init_PureAppliOverride(); // まず最初に「USI\n」が届くかどうかを判定☆(^~^) Util_ConsoleGame.ReadCommandline(programSupport, hyoji); if (programSupport.commandline == "usi") { // 「将棋所」で本将棋を指す想定☆(^~^) // CommandA.Atmark("@USI9x9", hyoji); PureSettei.usi = true; PureSettei.fenSyurui = FenSyurui.sfe_n; PureSettei.p1Com = false; PureSettei.p2Com = false; PureSettei.tobikikiTukau = true; // FIXME: 飛び利きはまだ不具合修正されていないぜ☆(^~^) ComSettei.himodukiHyokaTukau = true; // FIXME: 紐付き評価は、使うとしておこう☆(^~^) // ルールを確定してから 局面を作れだぜ☆(^~^) LisGenkyoku.SetRule( GameRule.HonShogi, 9, 9, @"シウネイライネウシ キ ゾ ヒヒヒヒヒヒヒヒヒ ひひひひひひひひひ ぞ き しうねいらいねうし" , new Dictionary <Motigoma, int>() { { Motigoma.K, 0 }, { Motigoma.Z, 0 }, { Motigoma.H, 0 }, { Motigoma.k, 0 }, { Motigoma.z, 0 }, { Motigoma.h, 0 }, } ); var profilePath = System.Configuration.ConfigurationManager.AppSettings["Profile"]; var toml = Toml.ReadFile(Path.Combine(profilePath, "Engine.toml")); var engineName = toml.Get <TomlTable>("Engine").Get <string>("Name"); Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; var engineAuthor = toml.Get <TomlTable>("Engine").Get <string>("Author"); playing.UsiOk(programSupport.commandline, $"{engineName} {version.Major}.{version.Minor}.{version.Build}", engineAuthor, hyoji); } else { SpkNaration.Speak_TitleGamen(hyoji);// とりあえず、タイトル画面表示☆(^~^) Logger.Flush(hyoji); } //Face_Kifuwarabe.Execute("", Option_Application.Kyokumen, syuturyoku); // 空打ちで、ゲームモードに入るぜ☆(^▽^) // 空打ちで、ゲームモードに入るぜ☆(^▽^) // このプログラムでは(A)コマンド・モード、(B)ゲーム・モード の2種類があるぜ☆ // 最初は コマンド・モードになっている☆(^~^) // // ゲームモード // (1)手番 // 人間、コンピューターの設定が有効になり、 // 人間の手番のときにしかコマンドが打てなくなるぜ☆ // (2)合法手 // 指し手の合法手チェックを行うぜ☆ // (3)自動着手 // コンピューターは自分の手番で 指すぜ☆ // (4)決着 // 決着すると ゲームモード を抜けるぜ☆ 連続対局設定の場合は抜けない☆(^▽^) // // コマンドモード // (1)手番 // MAN vs MAN扱い // (2)合法手 // チェックしない☆ ひよこをナナメに進めるのも、ワープするのも可能☆ // (3)自動着手 // しない☆ // (4)決着 // しない☆ [Enter]キーを空打ちすると、ゲームモードに変わるぜ☆(^▽^) bool result1 = Pure.SUCCESSFUL_FALSE; for (; ;) //メインループ(無限ループ) { #region (手順2)ユーザー入力 //──────────────────────────────────────── // (手順2)ユーザー入力 //──────────────────────────────────────── Util_ConsoleGame.Begin_Mainloop(playing, programSupport, hyoji); if (programSupport.commandline != null) { // コマンド・バッファーにコマンドラインが残っていたようなら、そのまま使うぜ☆(^▽^) } else if ( GameMode.Game == PureAppli.gameMode // ゲームモードの場合☆ && Console02.IsComputerNoBan() // コンピューターの番の場合☆ ) { programSupport.ClearCommandline(); // コマンドラインは消しておくぜ☆(^▽^) } else { Util_ConsoleGame.ReadCommandline(programSupport, hyoji);// コンソールからのキー入力を受け取るぜ☆(^▽^)(コンソール・ゲーム用) } #endregion #region ゲームセクション if (GameMode.Game == PureAppli.gameMode) { #region 手番の開始時 //──────────────────────────────────────── // 手番の開始時 //──────────────────────────────────────── // 手番の開始時に 何かやることがあれば ここに書けだぜ☆(^~^) #endregion #region (手順3)人間の手番 //──────────────────────────────────────── // (手順3)人間の手番 //──────────────────────────────────────── if (Console02.IsNingenNoBan()) // 人間の手番 { // ゲームモードでの人間の手番では、さらにコマンド解析 // ここで do コマンド(do b3b2 等)を先行して解析するぜ☆(^▽^) if (programSupport.caret != programSupport.commandline.IndexOf("do ", programSupport.caret)) { // do以外のコマンドであれば、コマンドラインを保持したまま、そのまま続行 } // 以下、do コマンドの場合☆ else if (!programSupport.ParseDoMove(out Move inputMove)) { // do コマンドのパースエラー表示(コンソール・ゲーム用)☆(^~^) SpkMove.AppendSetumei(MoveMatigaiRiyu.ParameterSyosikiMatigai, hyoji); hyoji.AppendLine(); Logger.Flush(hyoji); programSupport.CommentCommandline(); // コマンドの誤発動防止 } else if (!GenkyokuOpe.CanDoMove(inputMove, out MoveMatigaiRiyu reason)) // 指し手の合否チェック { // イリーガル・ムーブなどの、エラー理由表示☆(^~^) SpkMove.AppendSetumei(reason, hyoji); hyoji.AppendLine(); Logger.Flush(hyoji); } else { // do コマンドを実行するぜ☆(^▽^) // 1手指す☆!(^▽^) if (!Util_Control.Try_DoMove_Input(inputMove #if DEBUG , PureSettei.fenSyurui , (IDebugMojiretu)hyoji #endif )) { result1 = Pure.FailTrue("Try_DoMove_Input"); goto gt_EndLoop1; } // 勝敗判定☆(^▽^) if (!Util_Kettyaku.Try_JudgeKettyaku(inputMove #if DEBUG , hyoji #endif )) { result1 = Pure.FailTrue("Try_JudgeKettyaku"); goto gt_EndLoop1; } // 局面出力 SpkBan_1Column.Setumei_NingenGameYo(PureMemory.kifu_endTeme, hyoji); } }// 人間おわり☆(^▽^) #endregion #region (手順4)コンピューターの手番 //──────────────────────────────────────── // (手順4)コンピューターの手番 //──────────────────────────────────────── else if (Console02.IsComputerNoBan()) //コンピューターの番☆ { SpkNaration.Speak_ComputerSikochu(hyoji); // 表示(コンピューター思考中☆) Logger.Flush(hyoji); // コンピューターに1手指させるぜ☆ Util_Tansaku.PreGo(); if (Util_Tansaku.TryFail_Go(hyoji)) { result1 = Pure.FailTrue("Try_Go"); goto gt_EndLoop1; } // 勝敗判定☆(^▽^) if (!Util_Kettyaku.Try_JudgeKettyaku(PureMemory.tnsk_kohoMove #if DEBUG , hyoji #endif )) { result1 = Pure.FailTrue("Try_JudgeKettyaku"); goto gt_EndLoop1; } SpkNaration.Speak_KettyakuJi(hyoji);// 決着していた場合はメッセージ表示☆(^~^) Logger.Flush(hyoji); }// コンピューターの手番おわり☆(^~^) #endregion #region (手順5)決着時 //──────────────────────────────────────── // (手順5)決着時 //──────────────────────────────────────── if (Genkyoku.IsKettyaku())// 決着が付いているなら☆ { // 対局終了時 // 表示(コンソール・ゲーム用) { playing.Result(hyoji, CommandMode.NingenYoConsoleGame); hyoji.AppendLine("終わったぜ☆(^▽^)"); Logger.Flush(hyoji); } // 棋譜の初期局面を更新☆ { StringBuilder kyFen_temp = new StringBuilder(); SpkGenkyokuOpe.AppendFenTo(PureSettei.fenSyurui, kyFen_temp); PureMemory.kifu_syokiKyokumenFen = kyFen_temp.ToString(); } // TODO: 成績は保存しないにしても、棋譜は欲しいときもあるぜ☆(^~^) // 棋譜を作ろうぜ☆ hyoji.AppendLine("感想戦を行う場合は kansosen と打てだぜ☆(^▽^) そのあと kifu 1 とか打て☆(^▽^)"); hyoji.AppendLine("終わるときは hirate な☆(^▽^)"); Logger.Flush(hyoji); // 初期局面に戻すぜ☆(^▽^) Util_Taikyoku.Clear(); // 棋譜カーソルを0にすれば、初期局面に戻るだろ☆www(^▽^) MoveGenAccessor.BackTemeToFirst_AndClearTeme(); if (Util_Machine.IsRenzokuTaikyokuStop()) { // 連続対局を止めるぜ☆(^▽^) ConsolegameSettei.renzokuTaikyoku = false; hyoji.AppendLine($"{Util_Machine.RENZOKU_TAIKYOKU_STOP_FILE }> done"); } if (!ConsolegameSettei.renzokuTaikyoku) { // ゲームモードを解除するぜ☆(^~^) if (GameMode.Game == PureAppli.gameMode)// 感想戦での発動防止☆ { PureAppli.gameMode = GameMode.Karappo; } } else { // 連続対局中☆(^~^) } // コマンドの誤発動防止 programSupport.CommentCommandline(); } #endregion } #endregion #region (手順6)ゲーム用の指し手以外のコマンドライン実行 //──────────────────────────────────────── // (手順6)ゲーム用の指し手以外のコマンドライン実行 //──────────────────────────────────────── bool result2 = Pure.SUCCESSFUL_FALSE; string cmdline = programSupport.commandline; int caret = programSupport.caret; programSupport.isQuit = false; programSupport.isKyokumenEcho1 = false; // ゲーム・モードの場合、特に指示がなければ コマンド終了後、局面表示を返すぜ☆ if (playing.isMultipleLineCommand) { // TODO: 複数行コマンド中☆(^~^) //syuturyoku.AppendLine($"TODO: ky set 複数行コマンド中☆(^~^)(2) commandline={ commandline}"); //isKyokumenEcho1 = false; if (cmdline == ".") { // 「.」だけの行が来たら終了だぜ☆(^~^) playing.isMultipleLineCommand = false; // 実行☆(^~^) playing.dlgt_multipleLineCommand(playing.multipleLineCommand); playing.multipleLineCommand.Clear(); //syuturyoku.AppendLine($"TODO: 複数行コマンドは={ sbMultipleLineCommand}"); } else { playing.multipleLineCommand.Add(cmdline); } goto gt_EndCommand; } if (null == cmdline) { // 未設定 programSupport.isKyokumenEcho1 = true; } else if (cmdline == "") { programSupport.isKyokumenEcho1 = true; // 空打ちは無視するか、からっぽモードでは、ゲームモードに切り替えるぜ☆(^▽^) if (GameMode.Karappo == PureAppli.gameMode)// 感想戦での発動防止☆ { // ゲームモード(対局開始) PureAppli.gameMode = GameMode.Game; } } // なるべく、アルファベット順☆(^▽^)同じつづりで始まる単語の場合、語句の長い単語を優先にしないと if 文が通らないぜ☆www else if (caret == cmdline.IndexOf("@", caret)) { playing.Atmark(cmdline, hyoji); } else if (caret == cmdline.IndexOf("#", caret)) { } // 受け付けるが、何もしないぜ☆(^▽^)www else if (caret == cmdline.IndexOf("bitboard", caret)) { // ビットボードの表示テスト用だぜ☆(^~^) if (playing.TryFail_Bitboard(cmdline, hyoji)) { result2 = Pure.FailTrue("TryFail_Bitboard"); goto gt_EndCommand; } } else if (caret == cmdline.IndexOf("cando", caret)) { playing.CanDo(PureSettei.fenSyurui, cmdline, GameMode.Game == PureAppli.gameMode ? CommandMode.NingenYoConsoleGame : CommandMode.NigenYoConsoleKaihatu, hyoji); programSupport.isKyokumenEcho1 = true; } else if (caret == cmdline.IndexOf("chikanhyo", caret)) { if (playing.TryFail_ChikanHyo(cmdline, hyoji )) { result2 = Pure.FailTrue("TryFail_ChikanHyo"); goto gt_EndCommand; } } else if (caret == cmdline.IndexOf("clear", caret)) { playing.Clear(); } else if (caret == cmdline.IndexOf("dosub", caret)) { if (playing.TryFail_DoSub(cmdline, hyoji)) { result2 = Pure.FailTrue("TryFail_Do"); goto gt_EndCommand; } programSupport.isKyokumenEcho1 = true; } else if (caret == cmdline.IndexOf("do", caret)) { if (playing.TryFail_Do( PureSettei.fenSyurui, cmdline, GameMode.Game == PureAppli.gameMode ? CommandMode.NingenYoConsoleGame : CommandMode.NigenYoConsoleKaihatu, hyoji )) { result2 = Pure.FailTrue("TryFail_Do"); goto gt_EndCommand; } programSupport.isKyokumenEcho1 = true; } #if DEBUG else if (caret == cmdline.IndexOf("dump", caret)) { if (CommandD.TryFail_Dump(cmdline, hyoji )) { return(Pure.FailTrue("TryFail_Dump")); } } #endif else if (caret == cmdline.IndexOf("fugo", caret)) { if (playing.TryFail_Fugo(cmdline, hyoji )) { result2 = Pure.FailTrue("TryFail_Fugo"); goto gt_EndCommand; } } else if (caret == cmdline.IndexOf("gameover", caret)) { playing.Gameover(cmdline, hyoji); programSupport.isKyokumenEcho1 = true; } else if (caret == cmdline.IndexOf("go", caret)) { var result3 = playing.TryFail_Go( PureSettei.usi, PureSettei.fenSyurui, CommandMode.NigenYoConsoleKaihatu , hyoji ); if (result3) { result2 = Pure.FailTrue("Try_Go"); goto gt_EndCommand; } } else if (caret == cmdline.IndexOf("hirate", caret)) { playing.Hirate(cmdline, hyoji); programSupport.isKyokumenEcho1 = true; } else if (caret == cmdline.IndexOf("honyaku", caret)) { playing.Honyaku(cmdline, hyoji); } else if (caret == cmdline.IndexOf("hyoka", caret)) { playing.Hyoka(cmdline, hyoji); } else if (caret == cmdline.IndexOf("ojama", caret)) { if (playing.TryFail_Ojama(cmdline, hyoji )) { result2 = Pure.FailTrue("TryFail_Ojama"); goto gt_EndCommand; } } else if (caret == cmdline.IndexOf("isready", caret)) { playing.ReadOk(cmdline, hyoji); } else if (caret == cmdline.IndexOf("jokyo", caret)) { playing.Jokyo(cmdline, hyoji); } else if (caret == cmdline.IndexOf("kansosen", caret)) { playing.Kansosen(PureSettei.fenSyurui, cmdline, hyoji); } // 駒の場所を表示するぜ☆(^▽^) else if (caret == cmdline.IndexOf("kifu", caret)) { playing.Kifu(PureSettei.fenSyurui, cmdline, hyoji); } // 駒の場所を表示するぜ☆(^▽^) else if (caret == cmdline.IndexOf("kikisu", caret)) { // 利きの数を調べるぜ☆(^▽^) // 旧名「kikikazu」→「kikisu」 playing.Kikisu(cmdline, hyoji); } else if (caret == cmdline.IndexOf("kiki", caret)) { // 利きを調べるぜ☆(^▽^) var result3 = playing.TryFail_Kiki(cmdline, hyoji); if (result3) { result2 = Pure.FailTrue("TryFail_Kiki"); goto gt_EndCommand; } } else if (caret == cmdline.IndexOf("koma", caret)) { Pure.Sc.Push("komaコマンド"); playing.Koma_cmd(PureSettei.fenSyurui, cmdline, hyoji); Pure.Sc.Pop(); }// 駒の場所を表示するぜ☆(^▽^) else if (caret == cmdline.IndexOf("ky", caret)) { // 局面をクリアーしてやり直すときもここを通るので、ここで局面アサートを入れてはいけないぜ☆(^~^) if (playing.TryFail_Ky(cmdline, hyoji)) { result2 = Pure.FailTrue("Try_Ky"); goto gt_EndCommand; } }// 局面を表示するぜ☆(^▽^) else if (caret == cmdline.IndexOf("manual", caret)) { playing.Man(hyoji); } // "man" と同じ☆(^▽^) else if (caret == cmdline.IndexOf("man", caret)) { playing.Man(hyoji); } // "manual" と同じ☆(^▽^) else if (caret == cmdline.IndexOf("masu", caret)) { playing.Masu_cmd(cmdline, hyoji); } else if (caret == cmdline.IndexOf("nanamedan", caret)) { if (playing.TryFail_Nanamedan(cmdline, hyoji )) { result2 = Pure.FailTrue("TryFail_Nanamedan"); goto gt_EndCommand; } } else if (caret == cmdline.IndexOf("nisinsu", caret)) { if (playing.TryFail_Nisinsu(cmdline, hyoji )) { result2 = Pure.FailTrue("TryFail_Nisinsu"); goto gt_EndCommand; } } else if (caret == cmdline.IndexOf("position", caret)) { playing.Position(PureSettei.fenSyurui, cmdline, hyoji); } else if (caret == cmdline.IndexOf("prego", caret)) { playing.PreGo(cmdline, hyoji); } else if (caret == cmdline.IndexOf("quit", caret)) { programSupport.isQuit = true; programSupport.isKyokumenEcho1 = true; } else if (caret == cmdline.IndexOf("result", caret)) { playing.Result(hyoji, CommandMode.NigenYoConsoleKaihatu); } else if (caret == cmdline.IndexOf("rnd", caret)) { if (!playing.Try_Rnd( #if DEBUG (IDebugMojiretu)hyoji #endif )) { result2 = Pure.FailTrue("commandline"); goto gt_EndCommand; } programSupport.isKyokumenEcho1 = true; } else if (caret == cmdline.IndexOf("move", caret)) { if (playing.TryFail_Move_cmd(cmdline, hyoji)) { result2 = Pure.FailTrue("TryFail_Move_cmd"); goto gt_EndCommand; } } else if (caret == cmdline.IndexOf("setoption", caret)) { playing.Setoption(cmdline, hyoji); } else if (caret == cmdline.IndexOf("set", caret)) { playing.Set(cmdline, hyoji); } else if (caret == cmdline.IndexOf("taikyokusya", caret)) { playing.Taikyokusya_cmd(cmdline, hyoji); } else if (caret == cmdline.IndexOf("tansaku", caret)) { playing.Tansaku(cmdline, hyoji); } else if (caret == cmdline.IndexOf("test", caret)) { if (playing.TryFail_Test(cmdline, hyoji)) { result2 = Pure.FailTrue("TryFail_Test"); goto gt_EndCommand; } } else if (caret == cmdline.IndexOf("tonarikiki", caret)) { if (playing.TryFail_Tonarikiki(cmdline, hyoji)) { result2 = Pure.FailTrue("TryFail_Tonarikiki"); goto gt_EndCommand; } } else if (caret == cmdline.IndexOf("tumeshogi", caret)) { playing.TumeShogi(PureSettei.fenSyurui, cmdline, hyoji); } // "tu" と同じ☆(^▽^) else if (caret == cmdline.IndexOf("tu", caret)) { playing.TumeShogi(PureSettei.fenSyurui, cmdline, hyoji); } // "tumeshogi" と同じ☆(^▽^) else if (caret == cmdline.IndexOf("ugokikata", caret)) { if (playing.TryFail_Ugokikata(cmdline, hyoji)) { result2 = Pure.FailTrue("TryFail_Ugokikata"); goto gt_EndCommand; } } else if (caret == cmdline.IndexOf("undo", caret)) { playing.Undo(cmdline, hyoji); } else if (caret == cmdline.IndexOf("updaterule", caret)) { playing.UpdateRule(cmdline, hyoji); } else if (caret == cmdline.IndexOf("usinewgame", caret)) { playing.UsiNewGame(cmdline, hyoji); } else if (caret == cmdline.IndexOf("usi", caret)) { //ここは普通、来ない☆(^~^) var profilePath = System.Configuration.ConfigurationManager.AppSettings["Profile"]; var toml = Toml.ReadFile(Path.Combine(profilePath, "Engine.toml")); var engineName = toml.Get <TomlTable>("Engine").Get <string>("Name"); Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; var engineAuthor = toml.Get <TomlTable>("Engine").Get <string>("Author"); playing.UsiOk(cmdline, $"{engineName} {version.Major}.{version.Minor}.{version.Build}", engineAuthor, hyoji); } else { // 表示(コンソール・ゲーム用) hyoji.Append("「"); hyoji.Append(cmdline); hyoji.AppendLine("」☆?(^▽^)"); hyoji.AppendLine("そんなコマンドは無いぜ☆(>_<) man で調べろだぜ☆(^▽^)"); Logger.Flush(hyoji); programSupport.isKyokumenEcho1 = true; } gt_EndCommand: if (result2) { result1 = Pure.FailTrue("Try_DoCommandline"); goto gt_EndLoop1; } if (programSupport.isQuit) { break;//goto gt_EndLoop1; } // 次の入力を促す表示をしてるだけだぜ☆(^~^) programSupport.ShowPrompt(playing, PureSettei.fenSyurui, hyoji); #endregion }//無限ループ gt_EndLoop1: ; if (result1) { Logger.Flush(hyoji); Console.WriteLine("おわり☆(^▽^)"); Console.ReadKey(); //throw new Exception(syuturyoku.ToContents()); } // 開発モードでは、ユーザー入力を待機するぜ☆(^▽^) //──────────────────────────────────────── // (手順7)保存して終了 //──────────────────────────────────────── // 保存していないものを保存するぜ☆(^▽^) // ファイルに書き出していないログが溜まっていれば、これで全部書き出します。 Logger.Flush(PureAppli.syuturyoku1); }
public static void Test(StringBuilder hyoji) { //* { float[] alphas = new float[] { 1 / (WINDOW / 5.0f), 1 / (WINDOW / 6.0f), 1 / (WINDOW / 7.0f), 1 / (WINDOW / 8.0f), 1 / (WINDOW / 9.0f), }; float[] nazos = new float[] {//謎の数字 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, }; for (int iA = 0; iA < alphas.Length; iA++) { float alpha = alphas[iA]; float nazo = nazos[iA]; hyoji.AppendLine($"nazo = [{ nazo }] alpha = [{ alpha }]"); // nazo が 7 の時に合わせて x を入れてあるぜ☆(^~^) hyoji.AppendLine($"sisu(-256.0000) → [{ string.Format("{0,12:F9}", Sisu(alpha, -256.0000f)) }] y=Sigmoid({ string.Format("{0,12:F9}", Sigmoid(alpha, -256.0000f)) })"); //[7] hyoji.AppendLine($"sisu(-255.0000) → [{ string.Format("{0,12:F9}", Sisu(alpha, -255.0000f)) }] y=Sigmoid({ string.Format("{0,12:F9}", Sigmoid(alpha, -255.0000f)) })"); // hyoji.AppendLine($"sisu(-219.4285) → [{ string.Format("{0,12:F9}", Sisu(alpha, -219.4285f)) }] y=Sigmoid({ string.Format("{0,12:F9}", Sigmoid(alpha, -219.4285f)) })"); //[5.999998] hyoji.AppendLine($"sisu(-192.0000) → [{ string.Format("{0,12:F9}", Sisu(alpha, -192.0000f)) }] y=Sigmoid({ string.Format("{0,12:F9}", Sigmoid(alpha, -192.0000f)) })"); //[5.25] hyoji.AppendLine($"sisu(-182.8571) → [{ string.Format("{0,12:F9}", Sisu(alpha, -182.8571f)) }] y=Sigmoid({ string.Format("{0,12:F9}", Sigmoid(alpha, -182.8571f)) })"); //[4.999999] hyoji.AppendLine($"sisu(-146.2857) → [{ string.Format("{0,12:F9}", Sisu(alpha, -146.2857f)) }] y=Sigmoid({ string.Format("{0,12:F9}", Sigmoid(alpha, -146.2857f)) })"); //[4] hyoji.AppendLine($"sisu(-128.0000) → [{ string.Format("{0,12:F9}", Sisu(alpha, -128.0000f)) }] y=Sigmoid({ string.Format("{0,12:F9}", Sigmoid(alpha, -128.0000f)) })"); //[3.5] hyoji.AppendLine($"sisu(-109.7142) → [{ string.Format("{0,12:F9}", Sisu(alpha, -109.7142f)) }] y=Sigmoid({ string.Format("{0,12:F9}", Sigmoid(alpha, -109.7142f)) })"); //[2.999998] hyoji.AppendLine($"sisu(- 73.1428) → [{ string.Format("{0,12:F9}", Sisu(alpha, -73.1428f)) }] y=Sigmoid({ string.Format("{0,12:F9}", Sigmoid(alpha, -73.1428f)) })"); //[1.999998] hyoji.AppendLine($"sisu(- 36.5714) → [{ string.Format("{0,12:F9}", Sisu(alpha, -36.5714f)) }] y=Sigmoid({ string.Format("{0,12:F9}", Sigmoid(alpha, -36.5714f)) })"); //[0.9999992] hyoji.AppendLine($"sisu(- 1.0000) → [{ string.Format("{0,12:F9}", Sisu(alpha, -1.0000f)) }] y=Sigmoid({ string.Format("{0,12:F9}", Sigmoid(alpha, -1.0000f)) })"); //[0.02734375] hyoji.AppendLine($"sisu( 0.0000) → [{ string.Format("{0,12:F9}", Sisu(alpha, 0.0000f)) }] y=Sigmoid({ string.Format("{0,12:F9}", Sigmoid(alpha, 0.0000f)) })"); //[0] hyoji.AppendLine($"sisu( 1.0000) → [{ string.Format("{0,12:F9}", Sisu(alpha, 1.0000f)) }] y=Sigmoid({ string.Format("{0,12:F9}", Sigmoid(alpha, 1.0000f)) })"); //[-0.02734375] hyoji.AppendLine($"sisu( 36.5714) → [{ string.Format("{0,12:F9}", Sisu(alpha, 36.5714f)) }] y=Sigmoid({ string.Format("{0,12:F9}", Sigmoid(alpha, 36.5714f)) })"); //[-0.9999992] hyoji.AppendLine($"sisu( 73.1428) → [{ string.Format("{0,12:F9}", Sisu(alpha, 73.1428f)) }] y=Sigmoid({ string.Format("{0,12:F9}", Sigmoid(alpha, 73.1428f)) })"); //[-1.999998] hyoji.AppendLine($"sisu( 109.7142) → [{ string.Format("{0,12:F9}", Sisu(alpha, 109.7142f)) }] y=Sigmoid({ string.Format("{0,12:F9}", Sigmoid(alpha, 109.7142f)) })"); //[-2.999998] hyoji.AppendLine($"sisu( 128.0000) → [{ string.Format("{0,12:F9}", Sisu(alpha, 128.0000f)) }] y=Sigmoid({ string.Format("{0,12:F9}", Sigmoid(alpha, 128.0000f)) })"); //[-3.5] hyoji.AppendLine($"sisu( 146.2857) → [{ string.Format("{0,12:F9}", Sisu(alpha, 146.2857f)) }] y=Sigmoid({ string.Format("{0,12:F9}", Sigmoid(alpha, 146.2857f)) })"); //[-4] hyoji.AppendLine($"sisu( 182.8571) → [{ string.Format("{0,12:F9}", Sisu(alpha, 182.8571f)) }] y=Sigmoid({ string.Format("{0,12:F9}", Sigmoid(alpha, 182.8571f)) })"); //[-4.999999] hyoji.AppendLine($"sisu( 192.0000) → [{ string.Format("{0,12:F9}", Sisu(alpha, 192.0000f)) }] y=Sigmoid({ string.Format("{0,12:F9}", Sigmoid(alpha, 192.0000f)) })"); //[-5.25] hyoji.AppendLine($"sisu( 219.4285) → [{ string.Format("{0,12:F9}", Sisu(alpha, 219.4285f)) }] y=Sigmoid({ string.Format("{0,12:F9}", Sigmoid(alpha, 219.4285f)) })"); //[-5.999998] hyoji.AppendLine($"sisu( 255.0000) → [{ string.Format("{0,12:F9}", Sisu(alpha, 255.0000f)) }] y=Sigmoid({ string.Format("{0,12:F9}", Sigmoid(alpha, 255.0000f)) })"); // hyoji.AppendLine($"sisu( 256.0000) → [{ string.Format("{0,12:F9}", Sisu(alpha, 256.0000f)) }] y=Sigmoid({ string.Format("{0,12:F9}", Sigmoid(alpha, 256.0000f)) })"); //[-7] hyoji.AppendLine(); } } // */ /* * nazo = [5] alpha = [0.01953125] * sisu(-256.0000) → [ 5.000000000] y=Sigmoid( 0.006692851) * sisu(-255.0000) → [ 4.980469000] y=Sigmoid( 0.006823955) * sisu(-219.4285) → [ 4.285713000] y=Sigmoid( 0.013576940) * sisu(-192.0000) → [ 3.750000000] y=Sigmoid( 0.022977370) * sisu(-182.8571) → [ 3.571428000] y=Sigmoid( 0.027346810) * sisu(-146.2857) → [ 2.857143000] y=Sigmoid( 0.054313280) * sisu(-128.0000) → [ 2.500000000] y=Sigmoid( 0.075858180) * sisu(-109.7142) → [ 2.142856000] y=Sigmoid( 0.105000700) * sisu(- 73.1428) → [ 1.428570000] y=Sigmoid( 0.193321600) * sisu(- 36.5714) → [ 0.714285100] y=Sigmoid( 0.328652700) * sisu(- 1.0000) → [ 0.019531250] y=Sigmoid( 0.495117400) * sisu( 0.0000) → [ 0.000000000] y=Sigmoid( 0.500000000) * sisu( 1.0000) → [-0.019531250] y=Sigmoid( 0.504882600) * sisu( 36.5714) → [-0.714285100] y=Sigmoid( 0.671347300) * sisu( 73.1428) → [-1.428570000] y=Sigmoid( 0.806678500) * sisu( 109.7142) → [-2.142856000] y=Sigmoid( 0.894999300) * sisu( 128.0000) → [-2.500000000] y=Sigmoid( 0.924141800) * sisu( 146.2857) → [-2.857143000] y=Sigmoid( 0.945686700) * sisu( 182.8571) → [-3.571428000] y=Sigmoid( 0.972653200) * sisu( 192.0000) → [-3.750000000] y=Sigmoid( 0.977022600) * sisu( 219.4285) → [-4.285713000] y=Sigmoid( 0.986423100) * sisu( 255.0000) → [-4.980469000] y=Sigmoid( 0.993176000) * sisu( 256.0000) → [-5.000000000] y=Sigmoid( 0.993307200) * * nazo = [6] alpha = [0.0234375] * sisu(-256.0000) → [ 6.000000000] y=Sigmoid( 0.002472623) * sisu(-255.0000) → [ 5.976563000] y=Sigmoid( 0.002531111) * sisu(-219.4285) → [ 5.142856000] y=Sigmoid( 0.005807068) * sisu(-192.0000) → [ 4.500000000] y=Sigmoid( 0.010986940) * sisu(-182.8571) → [ 4.285713000] y=Sigmoid( 0.013576930) * sisu(-146.2857) → [ 3.428571000] y=Sigmoid( 0.031414380) * sisu(-128.0000) → [ 3.000000000] y=Sigmoid( 0.047425870) * sisu(-109.7142) → [ 2.571427000] y=Sigmoid( 0.071000150) * sisu(- 73.1428) → [ 1.714284000] y=Sigmoid( 0.152608800) * sisu(- 36.5714) → [ 0.857142200] y=Sigmoid( 0.297936800) * sisu(- 1.0000) → [ 0.023437500] y=Sigmoid( 0.494140900) * sisu( 0.0000) → [ 0.000000000] y=Sigmoid( 0.500000000) * sisu( 1.0000) → [-0.023437500] y=Sigmoid( 0.505859100) * sisu( 36.5714) → [-0.857142200] y=Sigmoid( 0.702063300) * sisu( 73.1428) → [-1.714284000] y=Sigmoid( 0.847391200) * sisu( 109.7142) → [-2.571427000] y=Sigmoid( 0.928999800) * sisu( 128.0000) → [-3.000000000] y=Sigmoid( 0.952574100) * sisu( 146.2857) → [-3.428571000] y=Sigmoid( 0.968585600) * sisu( 182.8571) → [-4.285713000] y=Sigmoid( 0.986423100) * sisu( 192.0000) → [-4.500000000] y=Sigmoid( 0.989013100) * sisu( 219.4285) → [-5.142856000] y=Sigmoid( 0.994193000) * sisu( 255.0000) → [-5.976563000] y=Sigmoid( 0.997468900) * sisu( 256.0000) → [-6.000000000] y=Sigmoid( 0.997527400) * * nazo = [7] alpha = [0.02734375] * sisu(-256.0000) → [ 7.000000000] y=Sigmoid( 0.000911051) * sisu(-255.0000) → [ 6.972656000] y=Sigmoid( 0.000936283) * sisu(-219.4285) → [ 5.999998000] y=Sigmoid( 0.002472628) * sisu(-192.0000) → [ 5.250000000] y=Sigmoid( 0.005220126) * sisu(-182.8571) → [ 4.999999000] y=Sigmoid( 0.006692858) * sisu(-146.2857) → [ 4.000000000] y=Sigmoid( 0.017986210) * sisu(-128.0000) → [ 3.500000000] y=Sigmoid( 0.029312230) * sisu(-109.7142) → [ 2.999998000] y=Sigmoid( 0.047425980) * sisu(- 73.1428) → [ 1.999998000] y=Sigmoid( 0.119203100) * sisu(- 36.5714) → [ 0.999999200] y=Sigmoid( 0.268941600) * sisu(- 1.0000) → [ 0.027343750] y=Sigmoid( 0.493164500) * sisu( 0.0000) → [ 0.000000000] y=Sigmoid( 0.500000000) * sisu( 1.0000) → [-0.027343750] y=Sigmoid( 0.506835500) * sisu( 36.5714) → [-0.999999200] y=Sigmoid( 0.731058400) * sisu( 73.1428) → [-1.999998000] y=Sigmoid( 0.880796900) * sisu( 109.7142) → [-2.999998000] y=Sigmoid( 0.952574000) * sisu( 128.0000) → [-3.500000000] y=Sigmoid( 0.970687700) * sisu( 146.2857) → [-4.000000000] y=Sigmoid( 0.982013800) * sisu( 182.8571) → [-4.999999000] y=Sigmoid( 0.993307100) * sisu( 192.0000) → [-5.250000000] y=Sigmoid( 0.994779900) * sisu( 219.4285) → [-5.999998000] y=Sigmoid( 0.997527400) * sisu( 255.0000) → [-6.972656000] y=Sigmoid( 0.999063700) * sisu( 256.0000) → [-7.000000000] y=Sigmoid( 0.999088900) * * nazo = [8] alpha = [0.03125] * sisu(-256.0000) → [ 8.000000000] y=Sigmoid( 0.000335350) * sisu(-255.0000) → [ 7.968750000] y=Sigmoid( 0.000345992) * sisu(-219.4285) → [ 6.857141000] y=Sigmoid( 0.001050812) * sisu(-192.0000) → [ 6.000000000] y=Sigmoid( 0.002472623) * sisu(-182.8571) → [ 5.714284000] y=Sigmoid( 0.003287666) * sisu(-146.2857) → [ 4.571428000] y=Sigmoid( 0.010237290) * sisu(-128.0000) → [ 4.000000000] y=Sigmoid( 0.017986210) * sisu(-109.7142) → [ 3.428569000] y=Sigmoid( 0.031414450) * sisu(- 73.1428) → [ 2.285712000] y=Sigmoid( 0.092313180) * sisu(- 36.5714) → [ 1.142856000] y=Sigmoid( 0.241796300) * sisu(- 1.0000) → [ 0.031250000] y=Sigmoid( 0.492188100) * sisu( 0.0000) → [ 0.000000000] y=Sigmoid( 0.500000000) * sisu( 1.0000) → [-0.031250000] y=Sigmoid( 0.507811800) * sisu( 36.5714) → [-1.142856000] y=Sigmoid( 0.758203700) * sisu( 73.1428) → [-2.285712000] y=Sigmoid( 0.907686800) * sisu( 109.7142) → [-3.428569000] y=Sigmoid( 0.968585600) * sisu( 128.0000) → [-4.000000000] y=Sigmoid( 0.982013800) * sisu( 146.2857) → [-4.571428000] y=Sigmoid( 0.989762700) * sisu( 182.8571) → [-5.714284000] y=Sigmoid( 0.996712300) * sisu( 192.0000) → [-6.000000000] y=Sigmoid( 0.997527400) * sisu( 219.4285) → [-6.857141000] y=Sigmoid( 0.998949200) * sisu( 255.0000) → [-7.968750000] y=Sigmoid( 0.999654000) * sisu( 256.0000) → [-8.000000000] y=Sigmoid( 0.999664700) * * nazo = [9] alpha = [0.03515625] * sisu(-256.0000) → [ 9.000000000] y=Sigmoid( 0.000123395) * sisu(-255.0000) → [ 8.964844000] y=Sigmoid( 0.000127809) * sisu(-219.4285) → [ 7.714283000] y=Sigmoid( 0.000446206) * sisu(-192.0000) → [ 6.750000000] y=Sigmoid( 0.001169510) * sisu(-182.8571) → [ 6.428570000] y=Sigmoid( 0.001612155) * sisu(-146.2857) → [ 5.142857000] y=Sigmoid( 0.005807060) * sisu(-128.0000) → [ 4.500000000] y=Sigmoid( 0.010986940) * sisu(-109.7142) → [ 3.857140000] y=Sigmoid( 0.020691170) * sisu(- 73.1428) → [ 2.571427000] y=Sigmoid( 0.071000150) * sisu(- 36.5714) → [ 1.285713000] y=Sigmoid( 0.216579300) * sisu(- 1.0000) → [ 0.035156250] y=Sigmoid( 0.491211900) * sisu( 0.0000) → [ 0.000000000] y=Sigmoid( 0.500000000) * sisu( 1.0000) → [-0.035156250] y=Sigmoid( 0.508788200) * sisu( 36.5714) → [-1.285713000] y=Sigmoid( 0.783420700) * sisu( 73.1428) → [-2.571427000] y=Sigmoid( 0.928999800) * sisu( 109.7142) → [-3.857140000] y=Sigmoid( 0.979308800) * sisu( 128.0000) → [-4.500000000] y=Sigmoid( 0.989013100) * sisu( 146.2857) → [-5.142857000] y=Sigmoid( 0.994193000) * sisu( 182.8571) → [-6.428570000] y=Sigmoid( 0.998387900) * sisu( 192.0000) → [-6.750000000] y=Sigmoid( 0.998830500) * sisu( 219.4285) → [-7.714283000] y=Sigmoid( 0.999553800) * sisu( 255.0000) → [-8.964844000] y=Sigmoid( 0.999872200) * sisu( 256.0000) → [-9.000000000] y=Sigmoid( 0.999876600) */ Logger.Flush(hyoji); Util_Machine.ReadKey(); }