/// <summary> /// 成る/成らない /// </summary> /// <param name="mainGui"></param> /// <param name="btnTumandeiruKoma"></param> /// <param name="logTag"></param> private void After_NaruNaranai_ButtonPushed( MainGui_Csharp mainGui , Shape_BtnKoma btnTumandeiruKoma ) { // 駒を動かします。 { // GuiからServerへ渡す情報 PieceType syurui; IMoveHalf dst; Util_Function_Csharp.Komamove1a_49Gui(out syurui, out dst, btnTumandeiruKoma, mainGui.Shape_PnlTaikyoku.NaruBtnMasu, mainGui); // ServerからGuiへ渡す情報 bool torareruKomaAri; RO_Star koma_Food_after; Util_Functions_Server.Komamove1a_50Srv(out torareruKomaAri, out koma_Food_after, dst, btnTumandeiruKoma.Koma, Util_Starlightable.AsKoma(dst.Now), mainGui.Model_Manual); Util_Function_Csharp.Komamove1a_51Gui(torareruKomaAri, koma_Food_after, mainGui); } { //---------- // 移動済表示 //---------- mainGui.Shape_PnlTaikyoku.SetHMovedKoma(btnTumandeiruKoma.Finger); //------------------------------ // 棋譜に符号を追加(マウスボタンが放されたとき)TODO:まだ早い。駒が成るかもしれない。 //------------------------------ // 棋譜 IMove move = new RO_Starbeam( //btnTumandeiruKoma.Finger, mainGui.Shape_PnlTaikyoku.MouseStarlightOrNull2.Now, mainGui.Model_Manual.GuiSkyConst.StarlightIndexOf(btnTumandeiruKoma.Finger).Now, mainGui.Shape_PnlTaikyoku.MousePos_FoodKoma != null ? mainGui.Shape_PnlTaikyoku.MousePos_FoodKoma.Komasyurui : PieceType.None );// 選択している駒の元の場所と、移動先 KifuNode newNode; { // // 成ったので、指し手データ差替え。 // StartposImporter.Assert_HirateHonsyogi(new SkyBuffer(mainGui.Model_Manual.GuiSkyConst), "newNode作成前"); newNode = new KifuNodeImpl( move, new KyokumenWrapper(SkyConst.NewInstance_ReversePside( // 先後を反転させます。 mainGui.Model_Manual.GuiSkyConst, mainGui.Model_Manual.GuiSkyConst.Temezumi + 1 //1手進める )) ); StartposImporter.Assert_HirateHonsyogi(new SkyBuffer(newNode.Value.KyokumenConst), "newNode作成後"); //「成る/成らない」ボタンを押したときです。 { //---------------------------------------- // 次ノード追加 //---------------------------------------- mainGui.Link_Server.Model_Taikyoku.Kifu.GetSennititeCounter().CountUp_New(Conv_Sky.ToKyokumenHash(newNode.Value.KyokumenConst), "After_NaruNaranai"); ((KifuNode)mainGui.Link_Server.Model_Taikyoku.Kifu.CurNode).PutTuginoitte_New(newNode); } // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // ここで棋譜の変更をします。 // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ string jsaFugoStr; Util_Functions_Server.SetCurNode_Srv( mainGui.Link_Server.Model_Taikyoku, mainGui.Model_Manual, newNode, out jsaFugoStr); mainGui.RepaintRequest.SetFlag_RefreshRequest(); //------------------------------ // 符号表示 //------------------------------ // 成る/成らないボタンを押したとき。 mainGui.Shape_PnlTaikyoku.SetFugo(jsaFugoStr); } //------------------------------ // チェンジターン //------------------------------ if (!mainGui.Shape_PnlTaikyoku.Requested_NaruDialogToShow) { //Logger.Trace("マウス左ボタンを押したのでチェンジターンします。"); mainGui.ChangedTurn(); } } mainGui.RepaintRequest.SetFlag_RecalculateRequested();// 駒の再描画要求 //Logger.Trace("つまんでいる駒を放します。(6)"); mainGui.SetFigTumandeiruKoma(-1);//駒を放した扱いです。 mainGui.Shape_PnlTaikyoku.SetNaruMasu(null); mainGui.RepaintRequest.SyuturyokuRequest = RepaintRequestGedanTxt.Kifu; mainGui.RepaintRequest.SetFlag_RefreshRequest(); IMove last; { Node <IMove, KyokumenWrapper> kifuElement = mainGui.Link_Server.Model_Taikyoku.Kifu.CurNode; last = (IMove)kifuElement.Key; } mainGui.ChangedTurn();//マウス左ボタンを押したのでチェンジターンします。 mainGui.Shape_PnlTaikyoku.Request_NaruDialogToShow(false); mainGui.GetWidget("BtnNaru").Visible = false; mainGui.GetWidget("BtnNaranai").Visible = false; mainGui.SetScene(SceneName.SceneB_1TumamitaiKoma); }
/// <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; //}); }