/// <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="fingers_banjoSeme"></param> /// <param name="fingers_banjoKurau"></param> /// <param name="fingers_motiSeme"></param> /// <param name="fingers_motiKurau"></param> /// <param name="src_Sky"></param> /// <param name="tebanSeme"></param> /// <param name="tebanKurau"></param> public static void Split_Moti1p_Moti2p( out Fingers fingers_moti1p, // 持駒 1P out Fingers fingers_moti2p, // 持駒 2= SkyConst src_Sky ) { Fingers fingers_moti1p_temp = new Fingers(); // (3)持ち駒_攻め手 Fingers fingers_moti2p_temp = new Fingers(); // (4)持ち駒_食らう側 src_Sky.Foreach_Starlights((Finger finger, IMoveHalf dd, ref bool toBreak) => { RO_Star koma = Util_Starlightable.AsKoma(dd.Now); if (Conv_SyElement.ToOkiba(koma.Masu) == Okiba.Sente_Komadai) { // // 1P 駒台 // fingers_moti1p_temp.Add(finger); } else if (Conv_SyElement.ToOkiba(koma.Masu) == Okiba.Gote_Komadai) { // // 2P 駒台 // fingers_moti2p_temp.Add(finger); } }); fingers_moti1p = fingers_moti1p_temp; fingers_moti2p = fingers_moti2p_temp; }
/// <summary> /// 1P玉と、2P玉を取得します。 /// </summary> /// <param name="koma_1PGyoku_orNull"></param> /// <param name="koma_2PGyoku_orNull"></param> /// <param name="src_Sky"></param> public static void Split_1PGyoku_2PGyoku( out RO_Star koma_1PGyoku_orNull, out RO_Star koma_2PGyoku_orNull, SkyConst src_Sky ) { RO_Star koma_1PGyoku_temp = null; RO_Star koma_2PGyoku_temp = null; src_Sky.Foreach_Starlights((Finger finger, IMoveHalf ds, ref bool toBreak) => { RO_Star koma = Util_Starlightable.AsKoma(ds.Now); if ( Okiba.ShogiBan == Conv_SyElement.ToOkiba(koma.Masu) && PieceType.K == koma.Komasyurui ) { if (Playerside.P1 == koma.Pside) { koma_1PGyoku_temp = koma;// 1P玉の位置 } else if (Playerside.P2 == koma.Pside) { koma_2PGyoku_temp = koma;// 2P玉の位置 } } }); koma_1PGyoku_orNull = koma_1PGyoku_temp; koma_2PGyoku_orNull = koma_2PGyoku_temp; }
/// <summary> /// 用途例:持ち駒を確認するために使います。 /// </summary> /// <param name="hkomas_gen_MOTI"></param> /// <returns></returns> public static string JsonElements_KomaHandles(bool enableLog, SkyConst src_Sky, List <int> hKomas, string comment) { StringBuilder sb = new StringBuilder(); if (!enableLog) { goto gt_EndMethod; } //sb.AppendLine(" ["); sb.AppendLine(" { act:\"colorMasu\", style:\"rgba(100,240,100,0.5)\" },"); foreach (int hKoma in hKomas) { RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(hKoma).Now); string komaImg = Util_Converter_LogGraphicEx.Finger_ToString(src_Sky, hKoma, ""); sb.AppendLine($" {{ act:\"drawImg\", img:\"{komaImg}\", masu: {Conv_SyElement.ToMasuNumber(koma.Masu)} }},");//FIXME:おかしい? } sb.AppendLine($" {{ act:\"drawText\", text:\"{comment}\" , x:0, y:20 }},"); //sb.AppendLine(" ],"); gt_EndMethod: return(sb.ToString()); }
/// <summary> /// 指定の場所にある駒を返します。 /// /// 先後は見ますが、将棋盤限定です。 /// /// </summary> /// <param name="okiba">置き場</param> /// <param name="masu">筋、段</param> /// <param name="uc_Main">メインパネル</param> /// <returns>駒。無ければヌル。</returns> public static Finger InShogibanMasuNow(SkyConst src_Sky, Playerside pside, SyElement masu) { Finger foundKoma = Fingers.Error_1; foreach (Finger finger in Finger_Honshogi.Items_KomaOnly) { IMoveHalf sl = src_Sky.StarlightIndexOf(finger); RO_Star koma = Util_Starlightable.AsKoma(sl.Now); int suji1; int suji2; int dan1; int dan2; Util_MasuNum.TryMasuToSuji(koma.Masu, out suji1); Util_MasuNum.TryMasuToSuji(masu, out suji2); Util_MasuNum.TryMasuToDan(koma.Masu, out dan1); Util_MasuNum.TryMasuToDan(masu, out dan2); // 先後は見ますが、将棋盤限定です。 if ( koma.Pside == pside && Conv_SyElement.ToOkiba(koma.Masu) == Okiba.ShogiBan && suji1 == suji2 && dan1 == dan2 ) { foundKoma = finger; break; } } return(foundKoma); }
/// <summary> /// 成った /// </summary> /// <returns></returns> public static bool IsNattaMove(IMove move) { // 元種類が不成、現種類が成 の場合のみ真。 bool natta = true; RO_Star srcKoma = Util_Starlightable.AsKoma(move.LongTimeAgo); RO_Star dstKoma = Util_Starlightable.AsKoma(move.Now); // 成立しない条件を1つでも満たしていれば、偽 確定。 if ( Komahaiyaku185.n000_未設定 == srcKoma.Haiyaku //Ks14.H00_Null == Haiyaku184Array.Syurui[(int)this.SrcHaiyaku] || Komahaiyaku185.n000_未設定 == dstKoma.Haiyaku //Ks14.H15_ErrorKoma == Haiyaku184Array.Syurui[(int)this.Haiyaku] || Util_Komasyurui14.FlagNari[(int)Util_Komahaiyaku184.Syurui(srcKoma.Haiyaku)] || !Util_Komasyurui14.FlagNari[(int)Util_Komahaiyaku184.Syurui(dstKoma.Haiyaku)] ) { natta = false; } return(natta); }
/// <summary> /// 不一致判定: 先後、駒種類 が、自分と同じものが <ひとつもない> /// </summary> /// <returns></returns> public static bool NeverOnaji(IMoveHalf ms, SkyConst src_Sky, params Fingers[] komaGroupArgs) { bool unmatched = true; foreach (Fingers komaGroup in komaGroupArgs) { foreach (Finger figKoma in komaGroup.Items) { RO_Star koma1 = Util_Starlightable.AsKoma(ms.Now); RO_Star koma2 = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now); if ( koma1.Pside == koma2.Pside && // 誰のものか Util_Komahaiyaku184.Syurui(koma1.Haiyaku) == Util_Komahaiyaku184.Syurui(koma2.Haiyaku) // 駒の種類は ) { // 1つでも一致するものがあれば、終了します。 unmatched = false; goto gt_EndLoop; } } } gt_EndLoop: return(unmatched); }
/// <summary> /// ************************************************************************************************************************ /// 元位置。 /// ************************************************************************************************************************ /// </summary> /// <returns></returns> public static IMove Src(IMove move) { RO_Starbeam result; RO_Star srcKoma = Util_Starlightable.AsKoma(move.LongTimeAgo); RO_Star dstKoma = Util_Starlightable.AsKoma(move.Now); result = new RO_Starbeam( new RO_Star( dstKoma.Pside, Masu_Honshogi.Query_Basho(Masu_Honshogi.nError), // ソースのソースは未定義。 PieceType.None ), // ソースの目的地はソース new RO_Star( dstKoma.Pside, srcKoma.Masu, srcKoma.Komasyurui ), PieceType.None ); return(result); }
/// <summary> /// FIXME:使ってない? /// </summary> /// <param name="masuNumber"></param> /// <param name="koma"></param> public void AddKoma(int masuNumber, RO_Star koma) { if (Conv_MasuHandle.OnShogiban(masuNumber)) { this.ban81.Add(masuNumber, koma); } else if (Conv_MasuHandle.OnSenteKomadai(masuNumber)) { if (this.motiBlack.ContainsKey(koma.Komasyurui)) { this.motiBlack[koma.Komasyurui] = this.motiBlack[koma.Komasyurui]; } else { this.motiBlack.Add(koma.Komasyurui, 0); } } else if (Conv_MasuHandle.OnGoteKomadai(masuNumber)) { if (this.motiWhite.ContainsKey(koma.Komasyurui)) { this.motiWhite[koma.Komasyurui] = this.motiWhite[koma.Komasyurui]; } else { this.motiWhite.Add(koma.Komasyurui, 0); } } }
/// <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="src_Sky"></param> /// <param name="finger"></param> /// <param name="masu"></param> /// <param name="pside_genTeban"></param> /// <param name="logTag"></param> /// <returns></returns> public static SkyConst Sasu( SkyConst src_Sky, //指定局面 Finger finger, //動かす駒 SyElement masu, //移動先マス bool toNaru //成るなら真 ) { SkyBuffer sky_buf = new SkyBuffer(src_Sky); // 現局面を元に、新規局面を書き換えます。 sky_buf.SetKaisiPside(Conv_Playerside.Reverse(src_Sky.KaisiPside)); // 開始先後を逆転させます。 sky_buf.SetTemezumi(sky_buf.Temezumi + 1); // 1手進めます。 SkyConst src_Sky2 = SkyConst.NewInstance(sky_buf, -1 //sky_bufでもう変えてあるので、そのまま。 ); // 移動先に相手の駒がないか、確認します。 Finger tottaKoma = Util_Sky_FingersQuery.InMasuNow(src_Sky2, masu).ToFirst(); if (tottaKoma != Fingers.Error_1) { // なにか駒を取ったら SyElement akiMasu; if (src_Sky.KaisiPside == Playerside.P1) { akiMasu = Util_IttesasuRoutine.GetKomadaiKomabukuroSpace(Okiba.Sente_Komadai, src_Sky2); } else { akiMasu = Util_IttesasuRoutine.GetKomadaiKomabukuroSpace(Okiba.Gote_Komadai, src_Sky2); } RO_Star koma = Util_Starlightable.AsKoma(sky_buf.StarlightIndexOf(tottaKoma).Now); // FIXME:配役あってるか? sky_buf.PutOverwriteOrAdd_Starlight(tottaKoma, new RO_Starlight(new RO_Star(src_Sky.KaisiPside, akiMasu, koma.Komasyurui)));//tottaKoma, } // 駒を1個動かします。 // FIXME: 取った駒はどうなっている? { RO_Star koma = Util_Starlightable.AsKoma(sky_buf.StarlightIndexOf(finger).Now); PieceType komaSyurui = koma.Komasyurui; if (toNaru) { komaSyurui = Util_Komasyurui14.ToNariCase(komaSyurui); } sky_buf.PutOverwriteOrAdd_Starlight(finger, new RO_Starlight(new RO_Star(src_Sky.KaisiPside, masu, komaSyurui))); } return(SkyConst.NewInstance(sky_buf, -1//sky_bufでもう進めてあるので、そのまま。 )); }
public void Log3( SkyConst src_Sky, Playerside tebanKurau, //手番(喰らう側) Playerside tebanSeme, //手番(利きを調べる側) Fingers fingers_kurau_IKUSA, //戦駒(喰らう側) Fingers fingers_kurau_MOTI, // 持駒(喰らう側) Fingers fingers_seme_IKUSA, //戦駒(利きを調べる側) Fingers fingers_seme_MOTI // 持駒(利きを調べる側) ) { // 攻め手の駒の位置 KaisetuBoard boardLog_clone = new KaisetuBoard(this.BrdMove); foreach (Finger finger in fingers_seme_IKUSA.Items) { RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(finger).Now); Gkl_KomaMasu km = new Gkl_KomaMasu( Util_Converter_LogGraphicEx.PsideKs14_ToString(tebanSeme, Util_Komahaiyaku184.Syurui(koma.Haiyaku), ""), Conv_SyElement.ToMasuNumber(koma.Masu) ); boardLog_clone.KomaMasu1.Add(km); } foreach (Finger finger in fingers_kurau_IKUSA.Items) { RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(finger).Now); this.BrdMove.KomaMasu2.Add(new Gkl_KomaMasu( Util_Converter_LogGraphicEx.PsideKs14_ToString(tebanKurau, Util_Komahaiyaku184.Syurui(koma.Haiyaku), ""), Conv_SyElement.ToMasuNumber(koma.Masu) )); } foreach (Finger finger in fingers_seme_MOTI.Items) { RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(finger).Now); Gkl_KomaMasu km = new Gkl_KomaMasu( Util_Converter_LogGraphicEx.PsideKs14_ToString(tebanSeme, Util_Komahaiyaku184.Syurui(koma.Haiyaku), ""), Conv_SyElement.ToMasuNumber(koma.Masu) ); this.BrdMove.KomaMasu3.Add(km); } foreach (Finger finger in fingers_kurau_MOTI.Items) { RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(finger).Now); this.BrdMove.KomaMasu4.Add(new Gkl_KomaMasu( Util_Converter_LogGraphicEx.PsideKs14_ToString(tebanKurau, Util_Komahaiyaku184.Syurui(koma.Haiyaku), ""), Conv_SyElement.ToMasuNumber(koma.Masu) )); } this.BrdMove = boardLog_clone; }
/// <summary> /// 不成 /// </summary> public static bool IsFunari(RO_Starlight ms) { bool result; RO_Star koma = Util_Starlightable.AsKoma(ms.Now); result = !Util_Komasyurui14.FlagNari[(int)Util_Komahaiyaku184.Syurui(koma.Haiyaku)]; return(result); }
/// <summary> /// 後手 /// </summary> /// <returns></returns> public static bool IsGote(IMoveHalf ms) { bool result; RO_Star koma = Util_Starlightable.AsKoma(ms.Now); result = Playerside.P2 == koma.Pside; return(result); }
/// <summary> /// 外字を利用した、デバッグ用の駒の名前1文字だぜ☆ /// </summary> /// <returns></returns> public static char ToGaiji(RO_Starlight ms) { char result; RO_Star koma = Util_Starlightable.AsKoma(ms.Now); result = Util_Komasyurui14.ToGaiji(Util_Komahaiyaku184.Syurui(koma.Haiyaku), koma.Pside); return(result); }
/// <summary> /// 成ケース /// </summary> /// <returns></returns> public static PieceType ToNariCase(RO_Starlight ms) { PieceType result; RO_Star koma = Util_Starlightable.AsKoma(ms.Now); result = Util_Komasyurui14.NariCaseHandle[(int)Util_Komahaiyaku184.Syurui(koma.Haiyaku)]; return(result); }
/// <summary> /// 駒台の上にあれば真。 /// </summary> /// <returns></returns> public static bool OnKomadai(RO_Starlight ms) { bool result; RO_Star koma = Util_Starlightable.AsKoma(ms.Now); result = (Okiba.Sente_Komadai | Okiba.Gote_Komadai).HasFlag( Conv_SyElement.ToOkiba(koma.Masu)); return(result); }
public static bool IsNareruKoma(IMoveHalf ms) { bool result; RO_Star koma = Util_Starlightable.AsKoma(ms.Now); result = Util_Komasyurui14.FlagNareruKoma[(int)Util_Komahaiyaku184.Syurui(koma.Haiyaku)]; return(result); }
/// <summary> /// 移動前と、移動後の場所が異なっていれば真。 /// </summary> /// <returns></returns> public static bool DoneMove(RO_Starbeam ss) { bool result; RO_Star koma1 = Util_Starlightable.AsKoma(ss.Now); RO_Star koma2 = Util_Starlightable.AsKoma(Util_Sky258A.Src(ss).Now); result = Conv_SyElement.ToMasuNumber(koma1.Masu) != Conv_SyElement.ToMasuNumber(koma2.Masu); return(result); }
/// <summary> /// “打” <アクション時> /// </summary> /// <returns></returns> public static bool IsDaAction(IMove move) { Debug.Assert(null != move, "指し手がヌルでした。"); bool result; RO_Star srcKoma = Util_Starlightable.AsKoma(move.LongTimeAgo); result = Okiba.ShogiBan != Conv_SyElement.ToOkiba(srcKoma.Masu) &&//駒台(駒袋)から打ったとき。 Okiba.Empty != Conv_SyElement.ToOkiba(srcKoma.Masu);//初期配置から移動しても、打にはしません。 return(result); }
/// <summary> /// 先後一致判定。 /// </summary> /// <param name="ms2"></param> /// <returns></returns> public static bool MatchPside(RO_Starlight ms1, RO_Starlight ms2) { bool result; RO_Star koma1 = Util_Starlightable.AsKoma(ms1.Now); RO_Star koma2 = Util_Starlightable.AsKoma(ms2.Now); result = koma1.Pside == koma2.Pside; return(result); }
//Dictionary<Starbeamable, KyokumenWrapper> public static Dictionary <string, SasuEntry> KomabetuMasusToMoveBetuSky( List_OneAndMulti <Finger, SySet <SyElement> > sMs, SkyConst src_Sky) { Dictionary <string, SasuEntry> moveBetuEntry = new Dictionary <string, SasuEntry>(); sMs.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) => { RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(key).Now); foreach (SyElement dstMasu in value.Elements) { IMove move = Util_Sky258A.BuildMove( new RO_Star(src_Sky.KaisiPside, koma.Masu, koma.Haiyaku), new RO_Star(src_Sky.KaisiPside, dstMasu, koma.Haiyaku),//FIXME:配役は適当。 PieceType.None ); string moveStr = ConvMoveStrSfen.ToMoveStrSfen(move);//重複防止用のキー SasuEntry sasuEntry = new SasuEntry( move, key, //動かす駒 dstMasu, //移動先升 false //成りません。 ); if (!moveBetuEntry.ContainsKey(moveStr)) { moveBetuEntry.Add(moveStr, sasuEntry); } } }); return(moveBetuEntry); /* * Dictionary<Starbeamable, KyokumenWrapper> result = new Dictionary<Starbeamable, KyokumenWrapper>(); * foreach (KeyValuePair<string, SasuEntry> entry in movebetuEntry) * { * result.Add( * entry.Value.NewMove, * new KyokumenWrapper(Util_Sasu341.Sasu( * src_Sky,//指定局面 * entry.Value.Finger,//動かす駒 * entry.Value.Masu,//移動先升 * entry.Value.Naru,//成りません。 * logTag * ))); * } * * return result; */ }
/// <summary> /// フィンガー番号→駒→駒のある升の集合 /// </summary> /// <param name="fingers"></param> /// <param name="src_Sky"></param> /// <returns></returns> public static SySet <SyElement> ToMasus(Fingers fingers, SkyConst src_Sky) { SySet <SyElement> masus = new SySet_Default <SyElement>("何かの升"); foreach (Finger finger in fingers.Items) { RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(finger).Now); masus.AddElement(koma.Masu); } return(masus); }
/// <summary> /// ************************************************************************************************************************ /// 棋譜用の符号テキスト(*1)を作ります。 /// ************************************************************************************************************************ /// /// *1…「▲5五銀上」など。 /// /// “同”表記に「置き換えない」バージョンです。 /// /// </summary> /// <param name="move"></param> /// <param name="previousKomaP"></param> /// <returns></returns> public static string ToString_NoUseDou( JsaFugoImpl jsaFugo, RO_Starbeam move ) { StringBuilder sb = new StringBuilder(); RO_Star koma = Util_Starlightable.AsKoma(move.Now); sb.Append(Conv_Playerside.ToSankaku(koma.Pside)); //------------------------------ // “同”に変換せず、“筋・段”をそのまま出します。 //------------------------------ int suji; int dan; Util_MasuNum.TryMasuToSuji(koma.Masu, out suji); Util_MasuNum.TryMasuToDan(koma.Masu, out dan); sb.Append(Conv_Int.ToArabiaSuji(suji)); sb.Append(Conv_Int.ToKanSuji(dan)); //------------------------------ // “歩”とか。“全”ではなく“成銀” <符号用> //------------------------------ sb.Append(Util_Komasyurui14.Fugo[(int)jsaFugo.Syurui]); //------------------------------ // “右”とか //------------------------------ sb.Append(Conv_MigiHidari.ToStr(jsaFugo.MigiHidari)); //------------------------------ // “寄”とか //------------------------------ sb.Append(Conv_AgaruHiku.ToStr(jsaFugo.AgaruHiku)); //------------------------------ // “成”とか //------------------------------ sb.Append(Conv_NariNarazu.Nari_ToStr(jsaFugo.Nari)); //------------------------------ // “打”とか //------------------------------ sb.Append(Conv_DaHyoji.ToBool(jsaFugo.DaHyoji)); return(sb.ToString()); }
/// <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="light"></param> /// <returns></returns> public static SySet <SyElement> KomaKidou_Potential(Finger finger, SkyConst src_Sky) { SySet <SyElement> result; RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(finger).Now); // // ポテンシャルなので、貫通しているのは仕様通り。 // // FIXME: 成香が横に進めることが分かっているか? // result = Array_Rule01_PotentialMove15.ItemMethods[(int)koma.Komasyurui](koma.Pside, koma.Masu); return(result); }
/// <summary> /// ************************************************************************************************************************ /// 指定のマスにあるスプライトを返します。(本将棋用) /// ************************************************************************************************************************ /// </summary> /// <param name="masu">マス番号</param> /// <param name="logTag">ログ名</param> /// <returns>スプライト番号。なければエラー番号。</returns> public static Fingers InMasuNow(SkyConst src_Sky, SyElement masu) { Fingers found = new Fingers(); foreach (Finger finger in Finger_Honshogi.Items_KomaOnly) { RO_Star koma = Util_Koma.FromFinger(src_Sky, finger); if (Masu_Honshogi.Basho_Equals(koma.Masu, masu)) { found.Add(finger); } } return(found); }
/// <summary> /// 駒のハンドルを返します。 /// </summary> /// <param name="pside"></param> /// <param name="hKomas"></param> /// <returns></returns> public static Fingers InPsideNow(SkyConst srcSky, Playerside pside) { Fingers fingers = new Fingers(); srcSky.Foreach_Starlights((Finger finger, IMoveHalf ds, ref bool toBreak) => { RO_Star koma = Util_Starlightable.AsKoma(ds.Now); if (pside == koma.Pside) { fingers.Add(finger); } }); return(fingers); }
/// <summary> /// ************************************************************************************************************************ /// 指定のマスにある駒を返します。(本将棋用) /// ************************************************************************************************************************ /// </summary> /// <param name="masu">マス番号</param> /// <returns>スプライト番号。なければエラー番号。</returns> public static RO_Star InMasuNow(SkyConst src_Sky, SyElement masu) { RO_Star koma = null; Finger fig = Util_Sky_FingersQuery.InMasuNow(src_Sky, masu).ToFirst(); if (Fingers.Error_1 == fig) { // 指定の升には駒がない。 goto gt_EndMethod; } koma = Util_Koma.FromFinger(src_Sky, fig); gt_EndMethod: return(koma); }
/// <summary> /// 升コレクション。 /// </summary> /// <param name="src_Sky"></param> /// <param name="pside"></param> /// <returns></returns> public static SySet <SyElement> Masus_Now(SkyConst src_Sky, Playerside pside) { SySet_Default <SyElement> masus = new SySet_Default <SyElement>("今の升"); src_Sky.Foreach_Starlights((Finger finger, IMoveHalf mlLight, ref bool toBreak) => { RO_Star koma = Util_Starlightable.AsKoma(mlLight.Now); if (koma.Pside == pside && Conv_SyElement.ToOkiba(koma.Masu) == Okiba.ShogiBan) { masus.AddElement(koma.Masu); } }); return(masus); }