/// <summary> /// 動かす駒を移動先へ。 /// </summary> /// <param name="figMovedKoma"></param> /// <param name="move">棋譜に記録するために「指す前/指した後」を含めた手。</param> /// <param name="obsoluted_kifu_mutable"></param> /// <param name="isMakimodosi"></param> private static void Do24_UgokasuKoma_IdoSakiHe( out Finger figMovedKoma, IMove move, Playerside kaisi_tebanside, SkyConst kaisi_Sky, string hint , [CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0 ) { figMovedKoma = Fingers.Error_1; //------------------------------------------------------------ // 選択 : 動かす駒 //------------------------------------------------------------ // 進むとき //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> //Debug.Assert(null != move, "Sasu24_UgokasuKoma_IdoSakiHe: 指し手がヌルでした。"); if (Util_Sky_BoolQuery.IsDaAction(move))// 多分、ここで move がヌルになるエラーがある☆ { //---------- // 駒台から “打” //---------- RO_Star srcKoma = Util_Starlightable.AsKoma(move.LongTimeAgo); RO_Star dstKoma = Util_Starlightable.AsKoma(move.Now); // FIXME: 駒台の、どの駒を拾うか? figMovedKoma = Util_Sky_FingerQuery.InOkibaSyuruiNowIgnoreCase( kaisi_Sky, Conv_SyElement.ToOkiba(srcKoma.Masu), Util_Komahaiyaku184.Syurui(dstKoma.Haiyaku) ); Debug.Assert(figMovedKoma != Fingers.Error_1, "駒を動かせなかった?14"); } else { //---------- // 将棋盤から //---------- RO_Star srcKoma = Util_Starlightable.AsKoma(move.LongTimeAgo); Debug.Assert(!Masu_Honshogi.IsErrorBasho(srcKoma.Masu), "srcKoma.Masuエラー。15"); RO_Star dstKoma = Util_Starlightable.AsKoma(move.Now); figMovedKoma = Util_Sky_FingerQuery.InShogibanMasuNow( kaisi_Sky, dstKoma.Pside, Util_Masu10.OkibaSujiDanToMasu( Conv_SyElement.ToOkiba(Masu_Honshogi.Masus_All[Conv_SyElement.ToMasuNumber(dstKoma.Masu)]), Conv_SyElement.ToMasuNumber(srcKoma.Masu) ) ); Debug.Assert(figMovedKoma != Fingers.Error_1, "駒を動かせなかった?13"); } }
/// <summary> /// 相手陣に入っていれば真。 /// /// 後手は 7,8,9 段。 /// 先手は 1,2,3 段。 /// </summary> /// <returns></returns> public static bool InAitejin(IMoveHalf ms) { bool result; RO_Star koma = Util_Starlightable.AsKoma(ms.Now); int dan; Util_MasuNum.TryMasuToDan(koma.Masu, out dan); result = (Util_Sky_BoolQuery.IsGote(ms) && 7 <= dan) || (Util_Sky_BoolQuery.IsSente(ms) && dan <= 3); return(result); }
/// <summary> /// 巻き戻しなら、非成りに戻します。 /// </summary> /// <param name="move">棋譜に記録するために「指す前/指した後」を含めた手。</param> /// <param name="isBack"></param> /// <returns></returns> private static PieceType Do30_MakimodosiNara_HinariNiModosu( IMove move, bool isBack) { //------------------------------------------------------------ // 確定 : 移動先升 //------------------------------------------------------------ PieceType syurui2; { //---------- // 成るかどうか //---------- RO_Star koma = Util_Starlightable.AsKoma(move.Now); if (Util_Sky_BoolQuery.IsNattaMove(move)) { if (isBack) { // 正順で成ったのなら、巻戻しでは「非成」に戻します。 syurui2 = Util_Komasyurui14.NarazuCaseHandle(Util_Komahaiyaku184.Syurui(koma.Haiyaku)); } else { syurui2 = Util_Komahaiyaku184.Syurui(koma.Haiyaku); } } else { syurui2 = Util_Komahaiyaku184.Syurui(koma.Haiyaku); } } return(syurui2); }
/// <summary> /// ************************************************************************************************************************ /// SFEN符号表記。 /// ************************************************************************************************************************ /// </summary> /// <returns></returns> public static string ToMoveStrSfen( IMove move, [CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0 ) { StringBuilder sb = new StringBuilder(); try { if (Util_Sky258A.RootMove == move) { sb.Append(ConvMoveStrSfen.KIFU_TREE_LOG_ROOT_FOLDER); goto gt_EndMethod; } RO_Star srcKoma = Util_Starlightable.AsKoma(move.LongTimeAgo); RO_Star dstKoma = Util_Starlightable.AsKoma(move.Now); //int srcDan; //if (!Util_MasuNum.TryMasuToDan(srcKoma.Masu, out srcDan)) //{ // throw new Exception("指定の元マス[$"{Util_Masu10.AsMasuNumber(srcKoma.Masu)}]は、段に変換できません。 : {memberName}.{sourceFilePath}.{sourceLineNumber}"); //} //int dan; //if (!Util_MasuNum.TryMasuToDan(dstKoma.Masu, out dan)) //{ // throw new Exception($"指定の先マス[{Util_Masu10.AsMasuNumber(dstKoma.Masu)}]は、段に変換できません。 : {memberName}.{sourceFilePath}.{sourceLineNumber}"); //} if (Util_Sky_BoolQuery.IsDaAction(move)) { // 打でした。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // (自)筋・(自)段は書かずに、「P*」といった表記で埋めます。 sb.Append(Util_Komasyurui14.SfenDa[(int)Util_Komahaiyaku184.Syurui(srcKoma.Haiyaku)]); sb.Append("*"); } else { //------------------------------------------------------------ // (自)筋 //------------------------------------------------------------ string strSrcSuji; int srcSuji; if (Util_MasuNum.TryMasuToSuji(srcKoma.Masu, out srcSuji)) { strSrcSuji = srcSuji.ToString(); } else { strSrcSuji = "N筋";//エラー表現 } sb.Append(strSrcSuji); //------------------------------------------------------------ // (自)段 //------------------------------------------------------------ string strSrcDan2; int srcDan2; if (Util_MasuNum.TryMasuToDan(srcKoma.Masu, out srcDan2)) { strSrcDan2 = Conv_Int.ToAlphabet(srcDan2); } else { strSrcDan2 = "N段";//エラー表現 } sb.Append(strSrcDan2); } //------------------------------------------------------------ // (至)筋 //------------------------------------------------------------ string strSuji; int suji2; if (Util_MasuNum.TryMasuToSuji(dstKoma.Masu, out suji2)) { strSuji = suji2.ToString(); } else { strSuji = "N筋";//エラー表現 } sb.Append(strSuji); //------------------------------------------------------------ // (至)段 //------------------------------------------------------------ string strDan; int dan2; if (Util_MasuNum.TryMasuToDan(dstKoma.Masu, out dan2)) { strDan = Conv_Int.ToAlphabet(dan2); } else { strDan = "N段";//エラー表現 } sb.Append(strDan); //------------------------------------------------------------ // 成 //------------------------------------------------------------ if (Util_Sky_BoolQuery.IsNattaMove(move)) { sb.Append("+"); } } catch (Exception e) { sb.Append(e.Message);//FIXME: } gt_EndMethod: ; return(sb.ToString()); }