/// <summary> /// 一手戻します。 /// </summary> /// <param name="ittemodosuArg"></param> /// <param name="ittesasu_mutable"></param> /// <param name="ittemodosuResult"></param> /// <param name="logTag"></param> /// <param name="memberName"></param> /// <param name="sourceFilePath"></param> /// <param name="sourceLineNumber"></param> public static void Before1( IttemodosuArg ittemodosuArg, out IttemodosuResult ittemodosuResult , [CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0 ) { bool isMakimodosi = true; ittemodosuResult = new IttemodosuResultImpl(Fingers.Error_1, Fingers.Error_1, null, PieceType.None, null); // // 一手指し開始局面(不変) // 一手指し終了局面(null or 可変) // Playerside kaisi_tebanside = ((KifuNode)ittemodosuArg.KaisiNode).Value.KyokumenConst.KaisiPside; SkyConst kaisi_Sky = ittemodosuArg.KaisiNode.Value.KyokumenConst; // // 編集対象ノード(巻き戻し時と、進む時で異なる) // Node <IMove, KyokumenWrapper> editNodeRef; //------------------------------ // 符号の追加(一手進む) //------------------------------ { // 戻る時。 ittemodosuResult.Susunda_Sky_orNull = null; editNodeRef = ittemodosuArg.KaisiNode; } // // 動かす駒を移動先へ。 // Finger figMovedKoma; Util_IttemodosuRoutine.Do25_UgokasuKoma_IdoSakiHe( out figMovedKoma, ittemodosuArg.Move, kaisi_tebanside, kaisi_Sky ); ittemodosuResult.FigMovedKoma = figMovedKoma; //動かした駒更新 if (Fingers.Error_1 == ittemodosuResult.FigMovedKoma) { goto gt_EndMethod; } // // 巻き戻しなら、非成りに戻します。 // PieceType syurui2 = Util_IttemodosuRoutine.Do30_MakimodosiNara_HinariNiModosu(ittemodosuArg.Move, isMakimodosi); IMoveHalf dst; { dst = Util_IttemodosuRoutine.Do37_KomaOnDestinationMasu(syurui2, ittemodosuArg.Move, kaisi_Sky); } // Sky 局面データは、この関数の途中で何回か変更されます。ローカル変数に退避しておくと、同期が取れなくなります。 //------------------------------------------------------------ // あれば、取られていた駒を取得 //------------------------------------------------------------ Finger figFoodKoma;//取られていた駒 Util_IttemodosuRoutine.Do62_TorareteitaKoma_ifExists( ittemodosuArg.Move, kaisi_Sky, //巻き戻しのとき ittemodosuResult.Susunda_Sky_orNull, out figFoodKoma //変更される場合あり。 ); ittemodosuResult.FigFoodKoma = figFoodKoma; //取られていた駒更新 //------------------------------------------------------------ // 駒の移動 //------------------------------------------------------------ if (Fingers.Error_1 != figFoodKoma) { //------------------------------------------------------------ // 指されていた駒と、取られていた駒の移動 //------------------------------------------------------------ //------------------------------ // 指し手の、取った駒部分を差替えます。 //------------------------------ RO_Star koma = Util_Starlightable.AsKoma(ittemodosuArg.Move.Now); kaisi_Sky = SkyConst.NewInstance_OverwriteOrAdd_Light( kaisi_Sky, ittemodosuArg.KorekaranoTemezumi_orMinus1, // // 指されていた駒 // figMovedKoma, dst, // // 取られていた駒 // figFoodKoma, new RO_Starlight( new RO_Star( Conv_Playerside.Reverse(koma.Pside), //先後を逆にして駒台に置きます。 koma.Masu, // マス (PieceType)ittemodosuArg.Move.FoodKomaSyurui ) )); } else { //------------------------------------------------------------ // 指されていた駒の移動 //------------------------------------------------------------ kaisi_Sky = SkyConst.NewInstance_OverwriteOrAdd_Light( kaisi_Sky, ittemodosuArg.KorekaranoTemezumi_orMinus1, // // 指されていた駒 // figMovedKoma, dst ); } editNodeRef.Value.SetKyokumen(kaisi_Sky); // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // この時点で、必ず現局面データに差替えあり // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // ノード ittemodosuResult.SyuryoNode_OrNull = editNodeRef;// この変数を返すのがポイント。棋譜とは別に、現局面。 gt_EndMethod: ; }
/// <summary> /// 一手指します。 /// </summary> /// <param name="ittesasuArg"></param> /// <param name="ittesasu_mutable"></param> /// <param name="ittesasuResult"></param> /// <param name="memberName"></param> /// <param name="sourceFilePath"></param> /// <param name="sourceLineNumber"></param> public static void Before1( IttesasuArg ittesasuArg, out IttesasuResult ittesasuResult, string hint , [CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0 ) { //------------------------------ // 用意 //------------------------------ ittesasuResult = new IttesasuResultImpl(Fingers.Error_1, Fingers.Error_1, null, PieceType.None, null); SkyConst kaisi_Sky = ittesasuArg.KaisiKyokumen.KyokumenConst; // 一手指し開始局面(不変) Node <IMove, KyokumenWrapper> editNodeRef; // 編集対象ノード(巻き戻し時と、進む時で異なる) //------------------------------ // 符号(局面)の追加 //------------------------------ { //進むときは、必ずノードの追加と、カレントの移動がある。 //現局面ノードのクローンを作成します。 editNodeRef = new KifuNodeImpl(ittesasuArg.KorekaranoMove, new KyokumenWrapper( SkyConst.NewInstance_ReversePside(kaisi_Sky, ittesasuArg.KorekaranoTemezumi_orMinus1)) ); ittesasuResult.Susunda_Sky_orNull = editNodeRef.Value.KyokumenConst; } //------------------------------ // 動かす駒を移動先へ。 //------------------------------ Debug.Assert(null != ittesasuArg.KorekaranoMove, "これからの指し手がヌルでした。"); Finger figMovedKoma; Util_IttesasuRoutine.Do24_UgokasuKoma_IdoSakiHe( out figMovedKoma, ittesasuArg.KorekaranoMove, ittesasuArg.KaisiTebanside, kaisi_Sky, hint ); ittesasuResult.FigMovedKoma = figMovedKoma; //動かした駒更新 Debug.Assert(Fingers.Error_1 != ittesasuResult.FigMovedKoma, "動かした駒がない☆!?エラーだぜ☆!"); RO_Star korekaranoKoma = Util_Starlightable.AsKoma(ittesasuArg.KorekaranoMove.Now); IMoveHalf afterStar; { afterStar = Util_IttesasuRoutine.Do36_KomaOnDestinationMasu( korekaranoKoma.Komasyurui, ittesasuArg.KorekaranoMove, ittesasuResult.Susunda_Sky_orNull ); } // Sky 局面データは、この関数の途中で何回か変更されます。ローカル変数に退避しておくと、同期が取れなくなります。 //------------------------------------------------------------ // 駒を取る //------------------------------------------------------------ Finger figFoodKoma = Fingers.Error_1; RO_Star food_koma = null; Playerside food_pside = Playerside.Empty; SyElement food_akiMasu = Masu_Honshogi.Query_Basho(Masu_Honshogi.nError); { Util_IttesasuRoutine.Do61_KomaToru( afterStar, ittesasuResult.Susunda_Sky_orNull, out figFoodKoma, out food_koma, out food_pside, out food_akiMasu ); if (Fingers.Error_1 != figFoodKoma) { //>>>>> 指した先に駒があったなら ittesasuResult.FoodKomaSyurui = food_koma.Komasyurui; } else { ittesasuResult.FoodKomaSyurui = PieceType.None; } } Debug.Assert(figMovedKoma != Fingers.Error_1, "駒を動かせなかった?1"); if (Fingers.Error_1 != figFoodKoma) { //------------------------------------------------------------ // 指した駒と、取った駒の移動 //------------------------------------------------------------ //------------------------------ // 局面データの書き換え //------------------------------ ittesasuResult.Susunda_Sky_orNull = SkyConst.NewInstance_OverwriteOrAdd_Light( ittesasuResult.Susunda_Sky_orNull, ittesasuArg.KorekaranoTemezumi_orMinus1, // // 指した駒 // figMovedKoma, //指した駒番号 afterStar, //指した駒 // // 取った駒 // figFoodKoma, new RO_Starlight( new RO_Star( food_pside, food_akiMasu, //駒台の空きマスへ food_koma.ToNarazuCase() // 取られた駒の種類。表面を上に向ける。 ) ) ); } else { //------------------------------------------------------------ // 指した駒の移動 //------------------------------------------------------------ ittesasuResult.Susunda_Sky_orNull = SkyConst.NewInstance_OverwriteOrAdd_Light( ittesasuResult.Susunda_Sky_orNull, //駒を取って変化しているかもしれない? ittesasuArg.KorekaranoTemezumi_orMinus1, // これから作る局面の、手目済み。 // // 指した駒 // figMovedKoma, afterStar, // // 手得計算 // korekaranoKoma.Komasyurui, 0,// TODO: suji or index korekaranoKoma.Masu ); } editNodeRef.Value.SetKyokumen(ittesasuResult.Susunda_Sky_orNull); // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // この時点で、必ず現局面データに差替えあり // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // 局面データに変更があったものとして進めます。 // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ittesasuResult.FigFoodKoma = figFoodKoma; //取った駒更新 // // ノード ittesasuResult.Set_SyuryoNode_OrNull = editNodeRef;// この変数を返すのがポイント。棋譜とは別に、現局面。 }