Ejemplo n.º 1
0
        /// <summary>
        /// [初期配置]ボタン
        /// </summary>
        public static void Perform_SyokiHaichi(
            MainGui_Csharp mainGui
            )
        {
            mainGui.Link_Server.Model_Taikyoku.Kifu.Clear();                                                  // 棋譜を空っぽにします。
            mainGui.Link_Server.Model_Taikyoku.Kifu.SetProperty(Word_KifuTree.PropName_Startpos, "startpos"); //平手の初期局面
            Playerside firstPside = Playerside.P1;

            KifuNode newNode = new KifuNodeImpl(
                Util_Sky258A.RootMove,                                     //ルートなので
                new KyokumenWrapper(Util_SkyWriter.New_Hirate(firstPside)) //[初期配置]ボタン押下時
                );

            // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
            // ここで棋譜の変更をします。
            // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
            string jsaFugoStr;

            Util_Functions_Server.SetCurNode_Srv(
                mainGui.Link_Server.Model_Taikyoku,
                mainGui.Model_Manual,
                newNode, out jsaFugoStr);
            mainGui.RepaintRequest.SetFlag_RefreshRequest();

            mainGui.RepaintRequest.SetFlag_RecalculateRequested();// 駒の再描画要求
            mainGui.RepaintRequest.SyuturyokuRequest = RepaintRequestGedanTxt.Clear;
            mainGui.RepaintRequest.SetFlag_RefreshRequest();
        }
Ejemplo n.º 2
0
        public Model_ManualImpl()
        {
            //
            // 駒なし
            //
            this.GuiTemezumi = 0;
            Playerside firstPside = Playerside.P1;

            this.GuiPside    = firstPside;
            this.guiSkyConst = Util_SkyWriter.New_Komabukuro(firstPside);// 描画モデル作成時
        }
Ejemplo n.º 3
0
        public Game()
        {
            this.FirstPside = Playerside.P1;

            // FIXME:平手とは限らないが、平手という前提で作っておく。
            this.Kifu = new KifuTreeImpl(
                new KifuNodeImpl(
                    Util_Sky258A.RootMove,
                    new KyokumenWrapper(SkyConst.NewInstance(
                                            Util_SkyWriter.New_Hirate(this.FirstPside),
                                            0  // 初期局面は 0手目済み
                                            )) // きふわらべ起動時
                    )
                );
            this.Kifu.SetProperty(Word_KifuTree.PropName_Startpos, "startpos");// 平手 // FIXME:平手とは限らないが。
        }
Ejemplo n.º 4
0
        static void Main(string[] args)
        {
            MessageBox.Show("AIMSサーバー");

            var engineConf = new EngineConf();

            EntitiesLayer.Implement(engineConf);

            string filepath = engineConf.GetResourceFullPath("AimsDataSetteiXml");

            MessageBox.Show($"設定ファイルパス=[{filepath}]");

            //
            // 設定XMLファイル
            //
            SetteiXmlFile setteiXmlFile;

            {
                setteiXmlFile = new SetteiXmlFile(filepath);
                //if (!setteiXmlFile.Exists())
                //{
                //    // ファイルが存在しませんでした。

                //    // 作ります。
                //    setteiXmlFile.Write();
                //}

                setteiXmlFile.Read();

                // デバッグ
                //setteiXmlFile.DebugWrite();
            }


            MessageBox.Show($"AIMSサーバー\n将棋エンジン・ファイルパス=[{setteiXmlFile.ShogiEngineFilePath}]");

            SkyConst src_Sky = Util_SkyWriter.New_Hirate(Playerside.P1);

            AimsServerImpl aimsServer = new AimsServerImpl(src_Sky, 0);

            aimsServer.ShogiEngineFilePath = setteiXmlFile.ShogiEngineFilePath;

            aimsServer.AtBegin();
            aimsServer.AtBody();
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 棋譜ツリーを、平手初期局面 で準備します。
        /// </summary>
        public static void CreateKifuTree(out KifuTree kifu)
        {
            // 初期局面では、Player 1 の手番とします。
            Playerside firstPside = Playerside.P1;

            // 棋譜
            kifu = new KifuTreeImpl(
                new KifuNodeImpl(
                    Util_Sky258A.RootMove,
                    new KyokumenWrapper(SkyConst.NewInstance(
                                            Util_SkyWriter.New_Hirate(firstPside),
                                            0//初期局面なので、0手目済み。
                                            ))
                    )
                );
            kifu.SetProperty(Word_KifuTree.PropName_Startpos, "startpos");// 平手

            Debug.Assert(!Conv_MasuHandle.OnKomabukuro(
                             Conv_SyElement.ToMasuNumber(((RO_Star)kifu.CurNode.Value.KyokumenConst.StarlightIndexOf((Finger)0).Now).Masu)
                             ), "駒が駒袋にあった。");
        }
Ejemplo n.º 6
0
        /// <summary>
        /// 将棋エンジンから、データを非同期受信(*1)します。
        ///
        ///         *1…こっちの都合に合わせず、データが飛んできます。
        ///
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public override void OnListenUpload_Async(object sender, DataReceivedEventArgs e)
        {
            string line = e.Data;

            if (null == line)
            {
                // 無視
            }
            else
            {
                switch (this.Owner_AimsServer.Phase_AimsServer)
                {
                case Phase_AimsServer._01_Server_Booted: break;    //thru

                case Phase_AimsServer._02_WaitAimsUsiok: break;    //thru

                case Phase_AimsServer._03_WaitEngineLive: break;   //thru

                case Phase_AimsServer._04_WaitEngineUsiok:
                {
                    if (line.StartsWith("option "))
                    {
                        //ok MessageBox.Show($"将棋サーバー「Firstフェーズで、将棋エンジンから、オプション[{line}]が返ってきたぜ☆!」");
                    }
                    else if (line.StartsWith("id "))
                    {
                        //ok MessageBox.Show($"将棋サーバー「Firstフェーズで、将棋エンジンから、アイディー[{line}]が返ってきたぜ☆!」");
                    }
                    else if ("usiok" == line)
                    {
                        //------------------------------------------------------------
                        // AIMS GUIへ: 「isready」を転送します。
                        //------------------------------------------------------------
                        //MessageBox.Show($"将棋サーバー「将棋エンジンから、usiokが返ってきたぜ☆!\nサーバーは WaitAimsIsready フェーズに移るぜ☆\nAIMS GUIには isready を送るぜ☆!」");
                        this.Owner_AimsServer.SetPhase_AimsServer(Phase_AimsServer._05_WaitAimsReadyok);
                        Console.Out.WriteLine("isready");
                    }
                    else
                    {
                        MessageBox.Show($"将棋サーバー「WaitEngineUsiokフェーズで、将棋エンジンから、[{line}]が返ってきたぜ☆!」");
                    }
                }
                break;

                case Phase_AimsServer._05_WaitEngineReadyok:
                {
                    //------------------------------------------------------------
                    // 将棋エンジンからの「readyok」コマンドを待っています。
                    //------------------------------------------------------------
                    if ("readyok" == line)
                    {
                        //MessageBox.Show("将棋サーバー「将棋エンジンから、readyokが返ってきたぜ☆!\n" +
                        //    "AIMS GUI が先手と仮定し、\n" +
                        //    "サーバーは WaitAimsBestmove フェーズに移るぜ☆\n" +
                        //    "AIMS GUI、将棋エンジンの双方に usinewgame コマンドを送るぜ☆!」");

                        //------------------------------------------------------------
                        // 対局開始!
                        //------------------------------------------------------------
                        Console.Out.WriteLine("usinewgame");
                        ((EngineClient)this.Owner_EngineClient).ShogiEngineProcessWrapper.Send_Usinewgame();

                        // FIXME:平手とは限らないが、平手という前提で、毎回一から作りなおします。
                        Playerside firstPside = Playerside.P1;
                        this.Owner_AimsServer.Model_Taikyoku.SetKifu(new KifuTreeImpl(
                                                                         new KifuNodeImpl(
                                                                             Util_Sky258A.RootMove,
                                                                             new KyokumenWrapper(SkyConst.NewInstance(
                                                                                                     Util_SkyWriter.New_Hirate(firstPside),
                                                                                                     0 // 初期局面は 0手目済み
                                                                                                     ))
                                                                             )
                                                                         ));
                        this.Owner_AimsServer.Model_Taikyoku.Kifu.SetProperty(Word_KifuTree.PropName_Startpos, "startpos");


                        ////
                        //// どちらが先手かにもよるが。
                        //// AIMS GUI が先手と仮定します。
                        ////
                        MessageBox.Show("将棋サーバー「AIMS GUI が先手と仮定し、\n" +
                                        "サーバーは WaitAimsBestmove フェーズに移るぜ☆\n" +
                                        "将棋エンジンには position    コマンド、\n" +
                                        "AIMS GUI  には position,go コマンドを送るぜ☆!」");
                        this.Owner_AimsServer.SetPhase_AimsServer(Phase_AimsServer._101_WaitAimsBestmove);

                        // 将棋エンジンに対して
                        // 例:「position startpos moves 7g7f」
                        ((EngineClient)this.Owner_EngineClient).ShogiEngineProcessWrapper.Send_Position(
                            Util_KirokuGakari.ToSfen_PositionCommand(this.Owner_AimsServer.Model_Taikyoku.Kifu)
                            );

                        // AIMS GUIに対して
                        // 例:「position startpos moves 7g7f」
                        Console.Out.WriteLine(Util_KirokuGakari.ToSfen_PositionCommand(this.Owner_AimsServer.Model_Taikyoku.Kifu));

                        Console.Out.WriteLine("go");
                    }
                }
                break;

                default:
                {
                    MessageBox.Show($"将棋サーバー「該当なしフェーズで、将棋エンジンから、[{line}]が返ってきたぜ☆!」");
                }
                break;
                }

                /*
                 * else if (line.StartsWith("info"))
                 * {
                 * }
                 * else if (line.StartsWith("bestmove resign"))
                 * {
                 * // 将棋エンジンが、投了されました。
                 * //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                 *
                 * //------------------------------------------------------------
                 * // あなたの負けです☆
                 * //------------------------------------------------------------
                 * ((EngineClient)this.Owner_EngineClient).ShogiEngineProcessWrapper.Send_Gameover_lose();
                 *
                 * //------------------------------------------------------------
                 * // 将棋エンジンを終了してください☆
                 * //------------------------------------------------------------
                 * ((EngineClient)this.Owner_EngineClient).ShogiEngineProcessWrapper.Send_Quit();
                 * }
                 * else if (line.StartsWith("bestmove"))
                 * {
                 * // 将棋エンジンが、手を指されました。
                 * //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                 *
                 * ((Server)((EngineClient)this.Owner_EngineClient).Owner_Server).SetInputString99(
                 *  ((Server)((EngineClient)this.Owner_EngineClient).Owner_Server).InputString99 + line.Substring("bestmove".Length + "".Length)
                 *  );
                 *
                 * OwataMinister.BY_GUI.Logger.WriteLineAddMemo($"USI受信:bestmove input99=[{((Server)((EngineClient)this.Owner_EngineClient).Owner_Server).InputString99}");
                 * }
                 */
            }
        }
Ejemplo n.º 7
0
        /// <summary>
        /// ************************************************************************************************************************
        /// 起動直後の流れです。
        /// ************************************************************************************************************************
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Uc_Form1Main_Load(object sender, EventArgs e)
        {
            Uc_Form2Main uc_Form2Main = ((Form1_Shogi)this.ParentForm).Form2_Console.Uc_Form2Main;

            //
            // 設定XMLファイル
            //
            {
                this.setteiXmlFile = new SetteiXmlFile(this.MainGui.EngineConf.GetResourceBasename("DataSetteiXml"));
                if (!this.SetteiXmlFile.Exists())
                {
                    // ファイルが存在しませんでした。

                    // 作ります。
                    this.SetteiXmlFile.Write();
                }

                this.SetteiXmlFile.Read();

                // デバッグ
                this.SetteiXmlFile.DebugWrite();
            }


            //----------
            // 棋譜
            //----------
            //
            //      先後や駒など、対局に用いられる事柄、物を事前準備しておきます。
            //

            //----------
            // 駒の並べ方
            //----------
            //
            //      平手に並べます。
            //
            {
                this.MainGui.Link_Server.Model_Taikyoku.Kifu.Clear();                                                  // 棋譜を空っぽにします。
                this.MainGui.Link_Server.Model_Taikyoku.Kifu.SetProperty(Word_KifuTree.PropName_Startpos, "startpos"); //平手の初期局面
                Playerside firstPside = Playerside.P1;                                                                 //Playerside.P2
                this.MainGui.Model_Manual.SetGuiSky(
                    Util_SkyWriter.New_Hirate(firstPside)                                                              //起動直後
                    );
                //this.ShogiGui.Model_PnlTaikyoku.Kifu.SetProperty(Word_KifuTree.PropName_FirstPside, Playerside.P1);
            }



            // 全駒の再描画
            this.MainGui.RepaintRequest = new RepaintRequestImpl();
            this.MainGui.RepaintRequest.SetFlag_RecalculateRequested();

            //----------
            // フェーズ
            //----------
            this.MainGui.SetScene(SceneName.SceneB_1TumamitaiKoma);

            //----------
            // 監視
            //----------
            this.gameEngineTimer1.Start();

            //----------
            // 将棋エンジンが、コンソールの振りをします。
            //----------
            //
            //      このメインパネルに、コンソールの振りをさせます。
            //      将棋エンジンがあれば、将棋エンジンの入出力を返すように内部を改造してください。
            //
            TextboxListener.SetTextboxListener(
                uc_Form2Main.ReadText, uc_Form2Main.WriteLine_Syuturyoku);


            //----------
            // 画面の出力欄
            //----------
            //
            //      出力欄(上下段)を空っぽにします。
            //
            uc_Form2Main.WriteLine_Syuturyoku("");



            this.MainGui.Response("Launch");

            // これで、最初に見える画面の準備は終えました。
            // あとは、操作者の入力を待ちます。
        }
Ejemplo n.º 8
0
        /// <summary>
        /// 平手初期局面が -100点~+100点 に収まるように調整します。
        ///
        /// 7回だけ調整します。
        ///
        /// [0]回目: 順位を 64 ずらす。
        /// [1]回目: 順位を 32 ずらす。
        /// [2]回目: 順位を 16 ずらす。
        /// [3]回目: 順位を 8 ずらす。
        /// [4]回目: 順位を 4 ずらす。
        /// [5]回目: 順位を 2 ずらす。
        /// [6]回目: 順位を 1 ずらす。
        ///
        /// これで、1方向に最長で(順位換算で) 130 ほどずれます。
        ///
        /// </summary>
        public static void Adjust_HirateSyokiKyokumen_0ten_AndFvParamRange(
            ref bool ref_isRequestDoEvents,
            FeatureVector fv)
        {
            if (null == Util_StartZero.src_Sky_hirateSyokikyokumen)
            {
                // 平手初期局面
                Util_StartZero.src_Sky_hirateSyokikyokumen = SkyConst.NewInstance(
                    Util_SkyWriter.New_Hirate(Playerside.P1),
                    0                     // 初期局面は 0手目済み
                    );
            }

            if (null == Util_StartZero.n54List_hirateSyokikyokumen)
            {
                //----------------------------------------
                // 40枚の駒、または14種類の持駒。多くても54要素。
                //----------------------------------------
                Util_StartZero.n54List_hirateSyokikyokumen = Util_54List.Calc_54List(Util_StartZero.src_Sky_hirateSyokikyokumen);
            }

            Hyokakansu_NikomaKankeiPp kansu = new Hyokakansu_NikomaKankeiPp();



            //--------------------------------------------------------------------------------
            // Check
            //--------------------------------------------------------------------------------
            //
            // 平手初期局面の点数を調べます。
            //
            float score;

#if DEBUG || LEARN
            KyHyokaMeisai_Koumoku meisaiKoumoku_orNull;
#endif
            kansu.Evaluate(
                out score,
#if DEBUG || LEARN
                out meisaiKoumoku_orNull,
#endif
                Util_StartZero.src_Sky_hirateSyokikyokumen,
                fv
                );

            if (-100 <= score && score <= 100)
            {
                // 目標達成。
                goto gt_Goal;
            }

            for (int iCount = 0; iCount < 7; iCount++)//最大で7回調整します。
            {
                // 初期局面の評価値が、-100~100 よりも振れていれば、0 になるように調整します。

                //--------------------------------------------------------------------------------
                // 点数を、順位に変換します。
                //--------------------------------------------------------------------------------
                Util_Ranking.Perform_Ranking(fv);

                //
                // 調整量
                //
                int chosei_offset = Util_StartZero.tyoseiryo[iCount];// 調整量を、調整します。どんどん幅が広くなっていきます。

                if (-100 <= score && score <= 100)
                {
                    // 目標達成。
                    goto gt_Goal;
                }
                else if (100 < score)// ±0か、マイナスに転じさせたい。
                {
                    chosei_offset *= -1;
                }

                int changedCells;
                Util_FvScoreing.Fill54x54_Add(out changedCells, chosei_offset, src_Sky_hirateSyokikyokumen, fv,
                                              Util_StartZero.n54List_hirateSyokikyokumen);

                // 順位を、点数に変換します。
                Util_Zooming.ZoomTo_FvParamRange(fv);

                // フォームの更新を要求します。
                ref_isRequestDoEvents = true;

                //--------------------------------------------------------------------------------
                // Check
                //--------------------------------------------------------------------------------
                //
                // 平手初期局面の点数を調べます。
                //
                kansu.Evaluate(
                    out score,
#if DEBUG || LEARN
                    out meisaiKoumoku_orNull,
#endif
                    Util_StartZero.src_Sky_hirateSyokikyokumen,
                    fv
                    );

                if (-100 <= score && score <= 100)
                {
                    // 目標達成。
                    goto gt_Goal;
                }

                // 目標を達成していないなら、ループを繰り返します。
            }

gt_Goal:
            ;
        }
Ejemplo n.º 9
0
        /// <summary>
        /// 指し手一覧を、リストボックスに表示します。
        /// </summary>
        /// <param name="uc_Main"></param>
        public static void ShowMoveList(
            LearningData learningData,
            Uc_Main uc_Main
            )
        {
            //
            // まず、リストを空っぽにします。
            //
            uc_Main.LstMove.Items.Clear();

            Playerside firstPside = Playerside.P1;
            KifuTree   kifu1      = new KifuTreeImpl(
                new KifuNodeImpl(
                    Util_Sky258A.RootMove,
                    new KyokumenWrapper(SkyConst.NewInstance(
                                            Util_SkyWriter.New_Hirate(firstPside),
                                            0  //初期局面は 0手済み。
                                            )) //日本の符号読取時
                    )
                );
            //kifu1.AssertPside(kifu1.CurNode, "ShowMoveList",logTag);

            List <CsaKifuMove> moveList = learningData.CsaKifu.MoveList;

            foreach (CsaKifuMove csaMove in moveList)
            {
                // 開始局面
                SkyConst kaisi_Sky = kifu1.CurNode.Value.KyokumenConst;

                //
                // csaMove を データ指し手 に変換するには?
                //
                IMove nextMove;
                {
                    Playerside pside = UtilCsaMove.ToPside(csaMove);

                    // 元位置
                    SyElement srcMasu = UtilCsaMove.ToSrcMasu(csaMove);
                    Finger    figSrcKoma;
                    if (Masu_Honshogi.IsErrorBasho(srcMasu))// 駒台の "00" かも。
                    {
                        //駒台の駒。
                        PieceType utuKomasyurui = Util_Komasyurui14.NarazuCaseHandle(UtilCsaMove.ToKomasyurui(csaMove));// 打つ駒の種類。

                        Okiba komadai;
                        switch (pside)
                        {
                        case Playerside.P1: komadai = Okiba.Sente_Komadai; break;

                        case Playerside.P2: komadai = Okiba.Gote_Komadai; break;

                        default: komadai = Okiba.Empty; break;
                        }

                        figSrcKoma = Util_Sky_FingersQuery.InOkibaPsideKomasyuruiNow(kaisi_Sky, komadai, pside, utuKomasyurui).ToFirst();
                    }
                    else
                    {
                        // 盤上の駒。
                        figSrcKoma = Util_Sky_FingerQuery.InMasuNow(kaisi_Sky, pside, srcMasu);
                    }
                    RO_Star srcKoma = Util_Starlightable.AsKoma(kaisi_Sky.StarlightIndexOf(figSrcKoma).Now);

                    // 先位置
                    SyElement dstMasu     = UtilCsaMove.ToDstMasu(csaMove);
                    Finger    figFoodKoma = Util_Sky_FingerQuery.InShogibanMasuNow(kaisi_Sky, pside, dstMasu);
                    PieceType foodKomasyurui;
                    if (figFoodKoma == Fingers.Error_1)
                    {
                        // 駒のない枡
                        foodKomasyurui = PieceType.None;//取った駒無し。
                    }
                    else
                    {
                        // 駒のある枡
                        foodKomasyurui = Util_Starlightable.AsKoma(kaisi_Sky.StarlightIndexOf(figFoodKoma).Now).Komasyurui;//取った駒有り。
                    }
                    IMoveSource dstKoma = new RO_Star(
                        pside,
                        dstMasu,
                        UtilCsaMove.ToKomasyurui(csaMove)
                        );

                    nextMove = new RO_Starbeam(
                        srcKoma,       // 移動元
                        dstKoma,       // 移動先
                        foodKomasyurui ////取った駒
                        );
                }

                {
                    //----------------------------------------
                    // 一手指したい。
                    //----------------------------------------
                    //
                    //↓↓一手指し
                    IttesasuResult ittesasuResult;
                    Util_IttesasuRoutine.Before1(
                        new IttesasuArgImpl(
                            kifu1.CurNode.Value,
                            ((KifuNode)kifu1.CurNode).Value.KyokumenConst.KaisiPside,
                            nextMove,
                            kifu1.CurNode.Value.KyokumenConst.Temezumi + 1//1手進める
                            ),
                        out ittesasuResult,
                        //kifu1,//診断用
                        "Utli_LearningViews#ShowMoveList"
                        );
                    Debug.Assert(ittesasuResult.Get_SyuryoNode_OrNull != null, "ittesasuResult.Get_SyuryoNode_OrNull がヌル☆?!");
                    Util_IttesasuRoutine.Before2(
                        ref ittesasuResult
                        );
                    //
                    //次ノートを追加します。次ノードを、これからのカレントとします。
                    //
                    //kifu1.AssertChildPside(kifu1.CurNode.Value.ToKyokumenConst.KaisiPside, ittesasuResult.Get_SyuryoNode_OrNull.Value.ToKyokumenConst.KaisiPside);
                    Util_IttesasuRoutine.After3_ChangeCurrent(
                        kifu1,
                        ConvMoveStrSfen.ToMoveStrSfen(ittesasuResult.Get_SyuryoNode_OrNull.Key),// nextMoveStr,
                        ittesasuResult.Get_SyuryoNode_OrNull
                        );
                    // これで、棋譜ツリーに、構造変更があったはず。
                    //↑↑一手指し
                }


                string sfen;
                if (kifu1.CurNode.IsRoot())
                {
                    sfen = UtilCsaMove.ToSfen(csaMove, null);
                }
                else
                {
                    sfen = UtilCsaMove.ToSfen(csaMove, kifu1.CurNode.GetParentNode().Value.KyokumenConst);
                }
                HonpuMoveListItemImpl listItem = new HonpuMoveListItemImpl(csaMove, sfen);
                uc_Main.LstMove.Items.Add(listItem);
            }

            //----------------------------------------
            // ソート
            //----------------------------------------
            //List<MoveListItemImpl> list = new List<MoveListItemImpl>();
            //list.Sort((MoveListItemImpl a, MoveListItemImpl b) =>
            //{
            //    return a - b;
            //});
        }