Esempio n. 1
0
 public static void ReadCommandline(ProgramSupport programSupport, StringBuilder hyoji)
 {
     Logger.Flush(hyoji);
     programSupport.SetCommandline(Util_Machine.ReadLine());
     hyoji.AppendLine(programSupport.commandline);
     Logger.Flush_NoEcho(hyoji);
 }
Esempio n. 2
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;//追加
            }
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 4
0
        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();
        }