///// <summary> ///// ************************************************************************************************************************ ///// 先後の交代 ///// ************************************************************************************************************************ ///// </summary> ///// <param name="pside">先後</param> ///// <returns>ひっくりかえった先後</returns> //public static Playerside AlternatePside(Playerside pside) //{ // Playerside result; // switch (pside) // { // case Playerside.P1: // result = Playerside.P2; // break; // case Playerside.P2: // result = Playerside.P1; // break; // default: // result = pside; // break; // } // return result; //} ///// <summary> ///// 変換『「指し手→局面」のコレクション』→『「駒、指し手」のペアのリスト』 ///// </summary> //public static List<Couple<Finger,Masu>> MovebetuSky_ToKamList( // SkyConst src_Sky_genzai, // Dictionary<ShootingStarlightable, SkyBuffer> ss // ) //{ // List<Couple<Finger, Masu>> kmList = new List<Couple<Finger, Masu>>(); // // TODO: // foreach(KeyValuePair<ShootingStarlightable,SkyBuffer> entry in ss) // { // RO_Star_Koma srcKoma = Util_Starlightable.AsKoma(entry.Key.LongTimeAgo); // RO_Star_Koma dstKoma = Util_Starlightable.AsKoma(entry.Key.Now); // Masu srcMasu = srcKoma.Masu; // Masu dstMasu = dstKoma.Masu; // Finger figKoma = Util_Sky.Fingers_AtMasuNow(src_Sky_genzai,srcMasu).ToFirst(); // kmList.Add(new Couple<Finger, Masu>(figKoma, dstMasu)); // } // return kmList; //} /// <summary> /// 「成り」ができる動きなら真。 /// </summary> /// <returns></returns> public static bool IsPromotionable( out bool isPromotionable, RO_Star srcKoma, RO_Star dstKoma ) { bool successful = true; isPromotionable = false; if (Okiba.ShogiBan != Conv_SyElement.ToOkiba(srcKoma.Masu)) { successful = false; goto gt_EndMethod; } if (Util_Komasyurui14.IsNari(srcKoma.Komasyurui)) { // 既に成っている駒は、「成り」の指し手を追加すると重複エラーになります。 // 成りになれない、で正常終了します。 goto gt_EndMethod; } int srcDan; if (!Util_MasuNum.TryMasuToDan(srcKoma.Masu, out srcDan)) { throw new Exception("段に変換失敗"); } int dstDan; if (!Util_MasuNum.TryMasuToDan(dstKoma.Masu, out dstDan)) { throw new Exception("段に変換失敗"); } // 先手か、後手かで大きく処理を分けます。 switch (dstKoma.Pside) { case Playerside.P1: { if (srcDan <= 3) { // 3段目から上にあった駒が移動したのなら、成りの資格ありです。 isPromotionable = true; goto gt_EndMethod; } if (dstDan <= 3) { // 3段目から上に駒が移動したのなら、成りの資格ありです。 isPromotionable = true; goto gt_EndMethod; } } break; case Playerside.P2: { if (7 <= srcDan) { // 7段目から下にあった駒が移動したのなら、成りの資格ありです。 isPromotionable = true; goto gt_EndMethod; } if (7 <= dstDan) { // 7段目から下に駒が移動したのなら、成りの資格ありです。 isPromotionable = true; goto gt_EndMethod; } } break; default: throw new Exception("未定義のプレイヤーサイドです。"); } gt_EndMethod: ; return(successful); }
/// <summary> /// CSAの指し手を、SFENの指し手に変換します。 /// </summary> /// <param name="csa"></param> /// <param name="ittemae_Sky">1手前の局面。ルート局面などの理由で1手前の局面がない場合はヌル。</param> /// <returns></returns> public static string ToSfen(CsaKifuMove csa, SkyConst ittemae_Sky_orNull) { StringBuilder sb = new StringBuilder(); int dstSuji; int.TryParse(csa.DestinationMasu[0].ToString(), out dstSuji); string dstDan = Conv_Suji.ToAlphabet(csa.DestinationMasu[1]); // 元位置の筋と段は、あとで必ず使う。(成りの判定) int srcSuji; int.TryParse(csa.SourceMasu[0].ToString(), out srcSuji); int srcDan; int.TryParse(csa.SourceMasu[1].ToString(), out srcDan); if ("00" == csa.SourceMasu) { // 打 string syurui; switch (csa.Syurui) { case Word_Csa.FU_FU_____: syurui = SfenWord.P_PAWN__; break; case Word_Csa.KY_KYO____: syurui = SfenWord.L_LANCE_; break; case Word_Csa.KE_KEI____: syurui = SfenWord.N_KNIGHT; break; case Word_Csa.GI_GIN____: syurui = SfenWord.S_SILVER; break; case Word_Csa.KI_KIN____: syurui = SfenWord.G_GOLD__; break; case Word_Csa.KA_KAKU___: syurui = SfenWord.B_BISHOP; break; case Word_Csa.HI_HISYA__: syurui = SfenWord.R_ROOK__; break; case Word_Csa.OU_OU_____: syurui = SfenWord.K_KING__; break; //おまけ default: syurui = SfenWord.ERROR___; break; //エラー } sb.Append(syurui); sb.Append("*"); } else { string srcDan_alphabet = Conv_Suji.ToAlphabet(csa.SourceMasu[1]); sb.Append(srcSuji); sb.Append(srcDan_alphabet); } sb.Append(dstSuji); sb.Append(dstDan); bool nari = false; switch (csa.Syurui) { case Word_Csa.TO_TOKIN__: nari = true; break; case Word_Csa.NY_NARIKYO: nari = true; break; case Word_Csa.NK_NARIKEI: nari = true; break; case Word_Csa.NG_NARIGIN: nari = true; break; case Word_Csa.UM_UMA____: nari = true; break; case Word_Csa.RY_RYU____: nari = true; break; } // // 「成り」をしたのかどうかを、調べます。 // { if (null != ittemae_Sky_orNull && "00" != csa.SourceMasu) { // ルート局面ではなく、かつ、打ではないとき。 //ittemae_Sky_orNull.Foreach_Starlights((Finger finger, Starlight light, ref bool toBreak) => //{ // RO_Star_Koma koma = Util_Starlightable.AsKoma(light.Now); // Logger.Trace($"[{finger}] {koma.Masu.Word}" "{koma.Pside}" "{KomaSyurui14Array.Ichimoji[(int)koma.Syurui]}"); //}); SyElement srcMasu = Util_Masu10.OkibaSujiDanToMasu(Okiba.ShogiBan, srcSuji, srcDan); RO_Star srcKoma = Util_Sky_KomaQuery.InMasuNow(ittemae_Sky_orNull, srcMasu); Debug.Assert(null != srcKoma, "元位置の駒を取得できなかった。1"); if (!Util_Komasyurui14.IsNari(srcKoma.Komasyurui) && nari)//移動元で「成り」でなかった駒が、移動後に「成駒」になっていた場合。 { sb.Append("+"); } } } return(sb.ToString()); }