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:平手とは限らないが。 }
/// <summary> /// /// </summary> /// <param name="kifu"></param> /// <param name="restText"></param> /// <param name="startposImporter"></param> /// <param name="logTag"></param> public static void OnChangeSky_Im_Client( Model_Taikyoku model_Taikyoku, KifuParserA_Genjo genjo ) { Logger.Trace($"(^△^)「{genjo.InputLine}」Util_InClient : クライアントの委譲メソッドキター☆"); string old_inputLine = genjo.InputLine;//退避 string rest; ISfenPosition2 ro_Kyokumen2_ForTokenize; Sfenstring146Conv.ToKyokumen2( genjo.InputLine, out rest, out ro_Kyokumen2_ForTokenize ); Logger.Trace($"(^△^)old_inputLine=「{old_inputLine}」 rest=「{rest}」 Util_InClient : ハハッ☆"); //string old_inputLine = genjo.InputLine; //genjo.InputLine = ""; //---------------------------------------- // 棋譜を空っぽにし、指定の局面を与えます。 //---------------------------------------- { model_Taikyoku.Kifu.Clear();// 棋譜を空っぽにします。 // 文字列から、指定局面を作成します。 Playerside pside = Playerside.P1; int temezumi = 0; model_Taikyoku.Kifu.GetRoot().Value.SetKyokumen( SkyConst.NewInstance( Conv_Sfenstring307.ToSkyConst(new SfenStringImpl(old_inputLine), pside, temezumi), temezumi //初期配置は 0手目済み。 ) ); //SFENのstartpos解析時 model_Taikyoku.Kifu.SetProperty(Word_KifuTree.PropName_Startpos, old_inputLine); //指定の初期局面 } }
/// <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) ), "駒が駒袋にあった。"); }
public Server_Impl(SkyConst src_Sky, int temezumi, Receiver receiver) { this.engineClient = new EngineClient_Impl(receiver); this.engineClient.SetOwner_Server(this); //---------- // モデル //---------- this.model_Taikyoku = new Model_TaikyokuImpl(new KifuTreeImpl( new KifuNodeImpl( Util_Sky258A.RootMove, new KyokumenWrapper(SkyConst.NewInstance( src_Sky, //model_Manual.GuiSkyConst, temezumi //model_Manual.GuiTemezumi )) ) )); this.Model_Taikyoku.Kifu.SetProperty(Word_KifuTree.PropName_Startpos, "9/9/9/9/9/9/9/9/9"); this.inputString99 = ""; }
/// <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> /// 平手初期局面が -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; //}); }
/// <summary> /// ************************************************************************************************************************ /// 将棋盤の上の駒を、全て駒袋に移動します。 [クリアー] /// ************************************************************************************************************************ /// </summary> public static void ClearKifu(MainGui_Csharp mainGui, RepaintRequest repaintRequest) { mainGui.Link_Server.Model_Taikyoku.Kifu.Clear();// 棋譜を空っぽにします。 SkyBuffer buffer_Sky = new SkyBuffer(mainGui.Model_Manual.GuiSkyConst); int figKoma; // 先手 figKoma = (int)Finger_Honshogi.SenteOh; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(/*figKoma,*/ new RO_Star(Playerside.P1, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro01), PieceType.K))); //先手王 figKoma = (int)Finger_Honshogi.GoteOh; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P2, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro02), PieceType.K))); //後手王 figKoma = (int)Finger_Honshogi.Hi1; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P1, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro03), PieceType.R))); //飛 figKoma = (int)Finger_Honshogi.Hi2; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P2, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro04), PieceType.R))); figKoma = (int)Finger_Honshogi.Kaku1; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P1, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro05), PieceType.B))); //角 figKoma = (int)Finger_Honshogi.Kaku2; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P2, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro06), PieceType.B))); figKoma = (int)Finger_Honshogi.Kin1; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P1, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro07), PieceType.G))); //金 figKoma = (int)Finger_Honshogi.Kin2; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P1, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro08), PieceType.G))); figKoma = (int)Finger_Honshogi.Kin3; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P2, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro09), PieceType.G))); figKoma = (int)Finger_Honshogi.Kin4; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P2, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro10), PieceType.G))); figKoma = (int)Finger_Honshogi.Gin1; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P1, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro11), PieceType.S))); //銀 figKoma = (int)Finger_Honshogi.Gin2; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P1, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro12), PieceType.S))); figKoma = (int)Finger_Honshogi.Gin3; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P2, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro13), PieceType.S))); figKoma = (int)Finger_Honshogi.Gin4; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P2, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro14), PieceType.S))); figKoma = (int)Finger_Honshogi.Kei1; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P1, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro15), PieceType.N))); //桂 figKoma = (int)Finger_Honshogi.Kei2; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P1, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro16), PieceType.N))); figKoma = (int)Finger_Honshogi.Kei3; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P2, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro17), PieceType.N))); figKoma = (int)Finger_Honshogi.Kei4; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P2, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro18), PieceType.N))); figKoma = (int)Finger_Honshogi.Kyo1; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P1, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro19), PieceType.L))); //香 figKoma = (int)Finger_Honshogi.Kyo2; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P1, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro20), PieceType.L))); figKoma = (int)Finger_Honshogi.Kyo3; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P2, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro21), PieceType.L))); figKoma = (int)Finger_Honshogi.Kyo4; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P2, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro22), PieceType.L))); figKoma = (int)Finger_Honshogi.Fu1; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P1, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro23), PieceType.P))); //歩 figKoma = (int)Finger_Honshogi.Fu2; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P1, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro24), PieceType.P))); figKoma = (int)Finger_Honshogi.Fu3; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P1, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro25), PieceType.P))); figKoma = (int)Finger_Honshogi.Fu4; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P1, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro26), PieceType.P))); figKoma = (int)Finger_Honshogi.Fu5; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P1, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro27), PieceType.P))); figKoma = (int)Finger_Honshogi.Fu6; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P1, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro28), PieceType.P))); figKoma = (int)Finger_Honshogi.Fu7; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P1, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro29), PieceType.P))); figKoma = (int)Finger_Honshogi.Fu8; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P1, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro30), PieceType.P))); figKoma = (int)Finger_Honshogi.Fu9; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P1, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro31), PieceType.P))); figKoma = (int)Finger_Honshogi.Fu10; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P2, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro32), PieceType.P))); //歩 figKoma = (int)Finger_Honshogi.Fu11; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P2, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro33), PieceType.P))); figKoma = (int)Finger_Honshogi.Fu12; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P2, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro34), PieceType.P))); figKoma = (int)Finger_Honshogi.Fu13; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P2, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro35), PieceType.P))); figKoma = (int)Finger_Honshogi.Fu14; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P2, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro36), PieceType.P))); figKoma = (int)Finger_Honshogi.Fu15; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P2, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro37), PieceType.P))); figKoma = (int)Finger_Honshogi.Fu16; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P2, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro38), PieceType.P))); figKoma = (int)Finger_Honshogi.Fu17; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P2, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro39), PieceType.P))); figKoma = (int)Finger_Honshogi.Fu18; buffer_Sky.PutOverwriteOrAdd_Starlight(figKoma, new RO_Starlight(new RO_Star(Playerside.P2, Masu_Honshogi.Query_Basho(Masu_Honshogi.nfukuro40), PieceType.P))); { KifuNode newNode = new KifuNodeImpl( Util_Sky258A.RootMove, //ルートなので new KyokumenWrapper(SkyConst.NewInstance( buffer_Sky, 0//空っぽに戻すので、 0手済みに変更。 )) ); string jsaFugoStr; Util_Functions_Server.SetCurNode_Srv( mainGui.Link_Server.Model_Taikyoku, mainGui.Model_Manual, newNode, out jsaFugoStr); repaintRequest.SetFlag_RefreshRequest(); mainGui.Link_Server.Model_Taikyoku.Kifu.SetProperty(Word_KifuTree.PropName_Startpos, "9/9/9/9/9/9/9/9/9 b K1R1B1G2S2N2L2P9 k1r1b1g2s2n2l2p9 1"); } }