/// <summary> /// 動かす駒を移動先へ。 /// </summary> /// <param name="figMovedKoma"></param> /// <param name="move">棋譜に記録するために「指す前/指した後」を含めた手。</param> /// <param name="obsoluted_kifu_mutable"></param> /// <param name="isMakimodosi"></param> private static void Do25_UgokasuKoma_IdoSakiHe( out Finger figMovedKoma, IMove move, Playerside kaisi_tebanside, SkyConst kaisi_Sky , [CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0 ) { figMovedKoma = Fingers.Error_1; //------------------------------------------------------------ // 選択 : 動かす駒 //------------------------------------------------------------ // [巻戻し]のとき //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // 打った駒も、指した駒も、結局は将棋盤の上にあるはず。 RO_Star koma = Util_Starlightable.AsKoma(move.Now); // 動かす駒 figMovedKoma = Util_Sky_FingerQuery.InShogibanMasuNow( kaisi_Sky, koma.Pside, koma.Masu//[巻戻し]のときは、先位置が 駒の居場所。 ); Debug.Assert(figMovedKoma != Fingers.Error_1, "駒を動かせなかった?5"); }
/// <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> /// ************************************************************************************************************************ /// 軌道上の駒たち /// ************************************************************************************************************************ /// </summary> /// <param name="km"></param> /// <returns></returns> public static void Fingers_EachSrcNow(out Fingers out_fingers, SySet <SyElement> srcList, SkyConst src_Sky, Playerside pside, IMoveHalf itaru) { out_fingers = new Fingers(); foreach (SyElement masu in srcList.Elements) { Finger finger = Util_Sky_FingerQuery.InShogibanMasuNow(src_Sky, pside, masu); if (Util_Finger.ForHonshogi(finger)) { // 指定の升に駒がありました。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> out_fingers.Add(finger); } } }
/// <summary> /// 含まれるか判定。 /// </summary> /// <param name="masus"></param> /// <returns></returns> public static bool ExistsIn(IMoveHalf sl, SySet <SyElement> masus, SkyConst srcSky) { bool matched = false; foreach (SyElement masu in masus.Elements) { RO_Star koma = Util_Starlightable.AsKoma(sl.Now); Finger finger = Util_Sky_FingerQuery.InShogibanMasuNow(srcSky, koma.Pside, masu); if ( finger != Fingers.Error_1 && //2014-07-21 先後も見るように追記。 koma.Masu == masu ) { matched = true; break; } } return(matched); }
/// <summary> /// あれば、取られていた駒を取得 /// </summary> /// <param name="move"></param> /// <param name="kaisi_Sky"></param> /// <param name="susunda_Sky_orNull"></param> /// <param name="out_figFoodKoma"></param> /// <param name="logTag"></param> private static void Do62_TorareteitaKoma_ifExists( IMove move, SkyConst kaisi_Sky,//巻き戻しのとき SkyConst susunda_Sky_orNull, out Finger out_figFoodKoma ) { if (PieceType.None != (PieceType)move.FoodKomaSyurui) { //---------------------------------------- // 取られていた駒があった場合 //---------------------------------------- RO_Star koma = Util_Starlightable.AsKoma(move.Now); // 駒台から、駒を検索します。 Okiba okiba; if (Playerside.P2 == koma.Pside) { okiba = Okiba.Gote_Komadai; } else { okiba = Okiba.Sente_Komadai; } // 取った駒は、種類が同じなら、駒台のどの駒でも同じです。 out_figFoodKoma = Util_Sky_FingerQuery.InOkibaSyuruiNowIgnoreCase(kaisi_Sky, okiba, (PieceType)move.FoodKomaSyurui); } else { //---------------------------------------- // 駒は取られていなかった場合 //---------------------------------------- out_figFoodKoma = Fingers.Error_1; } }
/// <summary> /// 符号1「7g7f」を元に、move を作ります。 /// /// <[再生]、[コマ送り]で呼び出されます> /// </summary> /// <returns></returns> public static void ToMove( bool isHonshogi, string str1, //123456789 か、 PLNSGKRB string str2, //abcdefghi か、 * string str3, //123456789 string str4, //abcdefghi string strNari, //+ out IMove move, KifuTree kifu, string hint ) { move = Util_Sky258A.NullObjectMove; Node <IMove, KyokumenWrapper> siteiNode = kifu.CurNode; SkyConst src_Sky = siteiNode.Value.KyokumenConst; //kifu.AssertPside(kifu.CurNode, $"str1={str1}"); Playerside pside1 = src_Sky.KaisiPside; #if DEBUG Debug.Assert(!Conv_MasuHandle.OnKomabukuro(Conv_SyElement.ToMasuNumber(((RO_Star)src_Sky.StarlightIndexOf((Finger)0).Now).Masu)), $"[{src_Sky.Temezumi}]手目、駒が駒袋にあった。"); #endif PieceType uttaSyurui; // 打った駒の種類 int srcSuji = Util_Koma.CTRL_NOTHING_PROPERTY_SUJI; int srcDan = Util_Koma.CTRL_NOTHING_PROPERTY_DAN; if ("*" == str2) { //>>>>>>>>>> 「打」でした。 Conv_String268.SfenUttaSyurui(str1, out uttaSyurui); } else { //>>>>>>>>>> 指しました。 uttaSyurui = PieceType.None;//打った駒はない☆ //------------------------------ // 1 //------------------------------ if (!int.TryParse(str1, out srcSuji)) { } //------------------------------ // 2 //------------------------------ srcDan = Conv_Alphabet.ToInt(str2); } //------------------------------ // 3 //------------------------------ int suji; if (!int.TryParse(str3, out suji)) { } //------------------------------ // 4 //------------------------------ int dan; dan = Conv_Alphabet.ToInt(str4); Finger koma; if ("*" == str2) { //>>>>> 「打」でした。 // 駒台から、打った種類の駒を取得 koma = Util_Sky_FingerQuery.InOkibaSyuruiNowIgnoreCase( siteiNode.Value.KyokumenConst, Conv_Playerside.ToKomadai(pside1),//FIXME: uttaSyurui); if (Fingers.Error_1 == koma) { throw new Exception($"TuginoItte_Sfen#GetData_FromTextSub:駒台から種類[{uttaSyurui}]の駒を掴もうとしましたが、エラーでした。"); } //// FIXME: 打のとき、srcSuji、srcDan が Int.Min } else { //>>>>> 打ではないとき SyElement masu1 = Util_Masu10.OkibaSujiDanToMasu(Okiba.ShogiBan, srcSuji, srcDan); Fingers komas1 = Util_Sky_FingersQuery.InMasuNow(//これが空っぽになるときがある。 src_Sky, masu1 ); koma = komas1.ToFirst(); if (Fingers.Error_1 == koma) { // // エラーの理由: // 0手目、平手局面を想定していたが、駒がすべて駒袋に入っているときなど // var sky2 = Util_Sky307.Json_1Sky(src_Sky, "エラー駒になったとき", $"{hint}_SF解3", src_Sky.Temezumi); string text2; if (masu1 is New_Basho) { text2 = $@"masu1.masuNumber=[{((New_Basho)masu1).MasuNumber}] komas1.Count=[{komas1.Count}]"; } else { text2 = "masu1.masuNumber=New_Basho型じゃない。"; } StringBuilder sb = new StringBuilder(); throw new Exception($@"TuginoItte_Sfen#GetData_FromTextSub:SFEN解析中の失敗:SFENでは [{srcSuji}]筋、[{srcDan}]段 にある駒を掴めと指示がありましたが、 将棋盤データの[{Conv_Sy.Query_Word(masu1.Bitfield)}]マスには、(駒が全て駒袋に入っているのか)駒がありませんでした。 hint=[{hint}] {text2} isHonshogi=[{isHonshogi}] str1=[{str1}] str2=[{str2}] str3=[{str3}] str4=[{str4}] strNari=[{strNari}] src_Sky.Temezumi=[{src_Sky.Temezumi}] 局面 = sfen {Util_StartposExporter.ToSfenstring(new StartposExporterImpl(src_Sky), true)} {sky2} "); } } PieceType dstSyurui; PieceType srcSyurui; Okiba srcOkiba; SyElement srcMasu; if ("*" == str2) { //>>>>> 打った駒の場合 dstSyurui = uttaSyurui; srcSyurui = uttaSyurui; switch (pside1) { case Playerside.P2: srcOkiba = Okiba.Gote_Komadai; break; case Playerside.P1: srcOkiba = Okiba.Sente_Komadai; break; default: srcOkiba = Okiba.Empty; break; } Finger srcKoma = Util_Sky_FingerQuery.InOkibaSyuruiNowIgnoreCase(siteiNode.Value.KyokumenConst, srcOkiba, srcSyurui); RO_Star dstKoma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(srcKoma).Now); srcMasu = dstKoma.Masu; } else { //>>>>> 盤上の駒を指した場合 RO_Star dstKoma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(koma).Now); dstSyurui = Util_Komahaiyaku184.Syurui(dstKoma.Haiyaku); srcSyurui = dstSyurui; //駒は「元・種類」を記憶していませんので、「現・種類」を指定します。 srcOkiba = Okiba.ShogiBan; srcMasu = Util_Masu10.OkibaSujiDanToMasu(srcOkiba, srcSuji, srcDan); } //------------------------------ // 5 //------------------------------ if ("+" == strNari) { // 成りました dstSyurui = Util_Komasyurui14.NariCaseHandle[(int)dstSyurui]; } //------------------------------ // 結果 //------------------------------ // 棋譜 move = new RO_Starbeam( //koma,//TODO: new RO_Star( pside1, srcMasu,//FIXME:升ハンドルにしたい srcSyurui ), new RO_Star( pside1, Util_Masu10.OkibaSujiDanToMasu(Okiba.ShogiBan, suji, dan),//符号は将棋盤の升目です。 FIXME:升ハンドルにしたい dstSyurui ), PieceType.None//符号からは、取った駒は分からない ); }