/// <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(); }
public Model_ManualImpl() { // // 駒なし // this.GuiTemezumi = 0; Playerside firstPside = Playerside.P1; this.GuiPside = firstPside; this.guiSkyConst = Util_SkyWriter.New_Komabukuro(firstPside);// 描画モデル作成時 }
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:平手とは限らないが。 }
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(); }
/// <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) ), "駒が駒袋にあった。"); }
/// <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}"); * } */ } }
/// <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"); // これで、最初に見える画面の準備は終えました。 // あとは、操作者の入力を待ちます。 }
/// <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: ; }
/// <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; //}); }