/// <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="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> /// <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; }
public static SyElement OkibaSujiDanToMasu(Okiba okiba, int masuHandle) { switch (Conv_SyElement.ToOkiba(masuHandle)) { case Okiba.Sente_Komadai: masuHandle -= Conv_SyElement.ToMasuNumber(Conv_Okiba.GetFirstMasuFromOkiba(Okiba.Sente_Komadai)); break; case Okiba.Gote_Komadai: masuHandle -= Conv_SyElement.ToMasuNumber(Conv_Okiba.GetFirstMasuFromOkiba(Okiba.Gote_Komadai)); break; case Okiba.KomaBukuro: masuHandle -= Conv_SyElement.ToMasuNumber(Conv_Okiba.GetFirstMasuFromOkiba(Okiba.KomaBukuro)); break; case Okiba.ShogiBan: // そのんまま break; default: // エラー break; } masuHandle = masuHandle + Conv_SyElement.ToMasuNumber(Conv_Okiba.GetFirstMasuFromOkiba(okiba)); return(Conv_MasuHandle.ToMasu(masuHandle)); }
/// <summary> /// /// </summary> /// <param name="okiba"></param> /// <param name="suji"></param> /// <param name="dan"></param> /// <returns></returns> public static int Handle_OkibaSujiDanToMasu(Okiba okiba, int suji, int dan) { int masuHandle = -1; switch (okiba) { case Okiba.ShogiBan: if (1 <= suji && suji <= Util_Masu10.SHOGIBAN_LAST_SUJI && 1 <= dan && dan <= Util_Masu10.SHOGIBAN_LAST_DAN) { masuHandle = (suji - 1) * Util_Masu10.SHOGIBAN_LAST_DAN + (dan - 1); } break; case Okiba.Sente_Komadai: case Okiba.Gote_Komadai: case Okiba.KomaBukuro: if (1 <= suji && suji <= Util_Masu10.KOMADAI_LAST_SUJI && 1 <= dan && dan <= Util_Masu10.KOMADAI_LAST_DAN) { masuHandle = (suji - 1) * Util_Masu10.KOMADAI_LAST_DAN + (dan - 1); masuHandle += Conv_SyElement.ToMasuNumber(Conv_Okiba.GetFirstMasuFromOkiba(okiba)); } break; default: break; } return(masuHandle); }
/// <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"); } }
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> /// <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 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); }
/// <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="masu"></param> /// <param name="pside"></param> /// <returns></returns> public static SyElement BothSenteView(SyElement masu, Playerside pside) { SyElement result = masu; // 将棋盤上で後手なら、180°回転します。 if (Okiba.ShogiBan == Conv_SyElement.ToOkiba(masu) && pside == Playerside.P2) { result = Masu_Honshogi.Masus_All[80 - Conv_SyElement.ToMasuNumber(masu)]; } // 将棋盤で先手、または 駒台か 駒袋なら、指定されたマスにそのまま入れます。 return(result); }
/// <summary> /// FIXME: 使ってない? /// /// 変換「自駒が動ける升」→「自駒が動ける手」 /// </summary> /// <param name="kmDic_Self"></param> /// <returns></returns> public static Maps_OneAndMulti <Finger, IMove> ToKomabetuMove( Maps_OneAndOne <Finger, SySet <SyElement> > kmDic_Self, Node <IMove, KyokumenWrapper> siteiNode_genzai ) { Maps_OneAndMulti <Finger, IMove> komaTe = new Maps_OneAndMulti <Finger, IMove>(); // // kmDic_Self.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) => { foreach (SyElement masuHandle in value.Elements) { RO_Star koma = Util_Starlightable.AsKoma(siteiNode_genzai.Value.KyokumenConst.StarlightIndexOf(key).Now); IMove move = new RO_Starbeam( //key, // 元 koma, // 先 new RO_Star( koma.Pside, Masu_Honshogi.Masus_All[Conv_SyElement.ToMasuNumber(masuHandle)], koma.Haiyaku //TODO:成るとか考えたい ), PieceType.None //取った駒不明 ); //sbSfen.Append(sbSfen.ToString()); if (komaTe.ContainsKey(key)) { // すでに登録されている駒 komaTe.AddExists(key, move); } else { // まだ登録されていない駒 komaTe.AddNew(key, move); } } }); return(komaTe); }
/// <summary> /// 指定した置き場にある駒のハンドルを返します。 /// </summary> /// <param name="kifu"></param> /// <param name="okiba"></param> /// <returns></returns> public static Fingers InOkibaNow(SkyConst src_Sky, Okiba okiba) { Fingers komas = new Fingers(); foreach (Finger figKoma in Finger_Honshogi.Items_KomaOnly) { RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now); if (okiba == Conv_SyElement.ToOkiba(koma.Masu)) { komas.Add(figKoma); } } return(komas); }
/// <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); }
/// <summary> /// ********************************************************************************************************************** /// 駒のハンドルを返します。 /// ********************************************************************************************************************** /// </summary> /// <param name="okiba"></param> /// <param name="kifuD"></param> /// <returns></returns> public static Fingers InOkibaPsideNow(SkyConst src_Sky, Okiba okiba, Playerside pside) { Fingers fingers = new Fingers(); 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 && pside == koma.Pside ) { fingers.Add(finger); } }); return(fingers); }
/// <summary> /// [巻戻し]時の、駒台にもどる動きを吸収。 /// </summary> /// <param name="syurui2"></param> /// <param name="move">棋譜に記録するために「指す前/指した後」を含めた手。</param> /// <param name="kifu"></param> /// <param name="isMakimodosi"></param> /// <returns></returns> private static IMoveHalf Do37_KomaOnDestinationMasu( PieceType syurui2, IMove move, SkyConst src_Sky ) { IMoveHalf dst; RO_Star srcKoma = Util_Starlightable.AsKoma(move.LongTimeAgo); //移動元 RO_Star dstKoma = Util_Starlightable.AsKoma(move.Now); //移動先 SyElement masu; if ( Okiba.Gote_Komadai == Conv_SyElement.ToOkiba(srcKoma.Masu) || Okiba.Sente_Komadai == Conv_SyElement.ToOkiba(srcKoma.Masu) ) { //>>>>> 1手前が駒台なら // 駒台の空いている場所 masu = Util_IttesasuRoutine.GetKomadaiKomabukuroSpace(Conv_SyElement.ToOkiba(srcKoma.Masu), src_Sky); // 必ず空いている場所があるものとします。 } else { //>>>>> 1手前が将棋盤上なら // その位置 masu = srcKoma.Masu;//戻し先 } dst = new RO_Starlight( //move.Finger, new RO_Star(dstKoma.Pside, masu,//戻し先 syurui2) ); return(dst); }
/// <summary> /// ハブ・ノードの次ノード・リストをJSON化します。 /// </summary> /// <param name="enableLog"></param> /// <param name="src_Sky_base"></param> /// <param name="hubNode"></param> /// <param name="comment"></param> /// <param name="logTag"></param> /// <returns></returns> public static string JsonKyokumens_NextNodes(bool enableLog, SkyConst src_Sky_base, Node <IMove, KyokumenWrapper> hubNode, string comment) { StringBuilder sb = new StringBuilder(); if (!enableLog) { goto gt_EndMethod; } hubNode.Foreach_ChildNodes((string key, Node <IMove, KyokumenWrapper> node, ref bool toBreak) => { IMove move = node.Key; RO_Star srcKoma1 = Util_Starlightable.AsKoma(move.LongTimeAgo); RO_Star dstKoma = Util_Starlightable.AsKoma(move.Now); Finger srcKoma2 = Util_Sky_FingersQuery.InMasuNow(src_Sky_base, srcKoma1.Masu).ToFirst(); // 駒1つ PieceType ks14 = Util_Komahaiyaku184.Syurui(dstKoma.Haiyaku); sb.AppendLine(" ["); // マスの色 sb.AppendLine(" { act:\"colorMasu\", style:\"rgba(100,240,100,0.5)\" },"); // マス sb.AppendLine($" {{ act:\"drawMasu\" , masu:{Conv_SyElement.ToMasuNumber(dstKoma.Masu)} }},"); string komaImg = Util_Converter_LogGraphicEx.Finger_ToString(src_Sky_base, srcKoma2, ""); sb.AppendLine($" {{ act:\"drawImg\", img:\"{komaImg}\", masu: {Conv_SyElement.ToMasuNumber(dstKoma.Masu)} }},");//FIXME:おかしい? // コメント sb.AppendLine($" {{ act:\"drawText\", text:\"{comment}\" , x:0, y:20 }},"); sb.AppendLine(" ],"); }); gt_EndMethod: return(sb.ToString()); }
/// <summary> /// ************************************************************************************************************************ /// 局面上のオブジェクトを返します。置き場、先後サイド、駒の種類で絞りこみます。 /// ************************************************************************************************************************ /// </summary> /// <param name="src_Sky">局面データ。</param> /// <param name="okiba">置き場。</param> /// <param name="pside">先後サイド。</param> /// <param name="komaSyurui">駒の種類。</param> /// <returns></returns> public static Fingers InOkibaPsideKomasyuruiNow(SkyConst src_Sky, Okiba okiba, Playerside pside, PieceType komaSyurui) { Fingers fingers = new Fingers(); src_Sky.Foreach_Starlights((Finger finger, IMoveHalf light, ref bool toBreak) => { RO_Star koma = Util_Starlightable.AsKoma(light.Now); if ( okiba == Conv_SyElement.ToOkiba(koma.Masu) && pside == koma.Pside && komaSyurui == koma.Komasyurui ) { fingers.Add(finger); } }); return(fingers); }
/// <summary> /// 千日手判定用の、局面ハッシュを返します。 /// /// TODO: 持ち駒も判定したい。 /// </summary> /// <returns></returns> public static ulong ToKyokumenHash(Sky sky) { ulong hash = 0; foreach (Finger fig in sky.Fingers_All().Items) { RO_Star koma = Util_Starlightable.AsKoma(sky.StarlightIndexOf(fig).Now); // 盤上の駒。 FIXME: 持ち駒はまだ見ていない。 ulong value = Util_ZobristHashing.GetValue( Conv_SyElement.ToMasuNumber(koma.Masu), koma.Pside, koma.Komasyurui ); hash ^= value; } return(hash); }
/// <summary> /// ************************************************************************************************************************ /// 駒のハンドルを返します。 : 置き場、種類 /// ************************************************************************************************************************ /// </summary> /// <param name="okiba"></param> /// <param name="syurui"></param> /// <param name="kifu"></param> /// <returns></returns> public static Fingers InOkibaKomasyuruiNow(SkyConst src_Sky, Okiba okiba, PieceType syurui) { Fingers komas = new Fingers(); foreach (Finger figKoma in Finger_Honshogi.Items_KomaOnly) { RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now); if ( okiba == Conv_SyElement.ToOkiba(koma.Masu) && Util_Komasyurui14.Matches(syurui, koma.Komasyurui) // Util_Komahaiyaku184.Syurui(koma.Haiyaku) ) { komas.Add(figKoma); } } return(komas); }
private void ToBanObject201(SkyConst src_Sky) { this.kaisiPside = src_Sky.KaisiPside;// TODO: //Util_Sky.Assert_Honshogi(src_Sky); // 将棋の駒40個の場所を確認します。 foreach (Finger finger in src_Sky.Fingers_All().Items) { IMoveSource light = src_Sky.StarlightIndexOf(finger).Now; RO_Star komaKs = Util_Starlightable.AsKoma(light); Debug.Assert(Conv_MasuHandle.OnAll(Conv_SyElement.ToMasuNumber(komaKs.Masu)), $"(int)koma.Masu=[{Conv_SyElement.ToMasuNumber(komaKs.Masu)}]");//升番号 this.AddKoma(komaKs.Masu, new RO_Star(komaKs) ); } }
/// <summary> /// 駒の種類(不成として扱います)を指定して、駒を検索します。 /// </summary> /// <param name="okiba"></param> /// <param name="komasyurui"></param> /// <param name="uc_Main"></param> /// <returns>無ければ -1</returns> public static Finger InOkibaSyuruiNowIgnoreCase(SkyConst srcSky, Okiba okiba, PieceType komasyurui) { Finger found = Fingers.Error_1; PieceType syuruiNarazuCase = Util_Komasyurui14.NarazuCaseHandle(komasyurui); foreach (Finger finger in Finger_Honshogi.Items_KomaOnly) { RO_Star koma = Util_Starlightable.AsKoma(srcSky.StarlightIndexOf(finger).Now); if (Conv_SyElement.ToOkiba(koma.Masu) == okiba && Util_Komasyurui14.Matches(koma.ToNarazuCase(), syuruiNarazuCase)) { found = finger; break; } } return(found); }
public static void Split_Jigyoku_Aitegyoku( out RO_Star koma_Jigyoku_orNull, out RO_Star koma_Aitegyoku_orNull, SkyConst src_Sky, Playerside jiPside, Playerside aitePside ) { RO_Star koma_Jigyoku_temp = null; RO_Star koma_Aitegyoku_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) && jiPside == koma.Pside && PieceType.K == koma.Komasyurui ) { // // 自玉の位置 // koma_Jigyoku_temp = koma; } else if ( Okiba.ShogiBan == Conv_SyElement.ToOkiba(koma.Masu) && aitePside == koma.Pside && PieceType.K == koma.Komasyurui ) { // // 相手玉の位置 // koma_Aitegyoku_temp = koma; } }); koma_Jigyoku_orNull = koma_Jigyoku_temp; koma_Aitegyoku_orNull = koma_Aitegyoku_temp; }
/// <summary> /// 将棋盤上での検索 /// </summary> /// <param name="srcAll">候補マス</param> /// <param name="komas"></param> /// <returns></returns> public static bool Query_Koma( Playerside pside, PieceType syurui, SySet <SyElement> srcAll, SkyConst src_Sky,//KifuTree kifu, out Finger foundKoma ) { //SkyConst src_Sky = kifu.CurNode.Value.ToKyokumenConst; bool hit = false; foundKoma = Fingers.Error_1; foreach (New_Basho masu1 in srcAll.Elements)//筋・段。(先後、種類は入っていません) { foreach (Finger koma1 in Finger_Honshogi.Items_KomaOnly) { RO_Star koma2 = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(koma1).Now); if (pside == koma2.Pside && Okiba.ShogiBan == Conv_SyElement.ToOkiba(koma2.Masu) && Util_Komasyurui14.Matches(syurui, Util_Komahaiyaku184.Syurui(koma2.Haiyaku)) && masu1 == koma2.Masu ) { // 候補マスにいた //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> hit = true; foundKoma = koma1; break; } } } return(hit); }
/// <summary> /// ************************************************************************************************************************ /// 駒台の空いている升を返します。 /// ************************************************************************************************************************ /// </summary> /// <param name="okiba">先手駒台、または後手駒台</param> /// <param name="uc_Main">メインパネル</param> /// <returns>置ける場所。無ければヌル。</returns> public static SyElement GetKomadaiKomabukuroSpace(Okiba okiba, SkyConst src_Sky) { SyElement akiMasu = Masu_Honshogi.Query_Basho(Masu_Honshogi.nError); // 先手駒台または後手駒台の、各マスの駒がある場所を調べます。 bool[] exists = new bool[Util_Masu10.KOMADAI_KOMABUKURO_SPACE_LENGTH];//駒台スペースは40マスです。 src_Sky.Foreach_Starlights((Finger finger, IMoveHalf komaP, ref bool toBreak) => { RO_Star koma = Util_Starlightable.AsKoma(komaP.Now); if (Conv_SyElement.ToOkiba(koma.Masu) == okiba) { exists[ Conv_SyElement.ToMasuNumber(koma.Masu) - Conv_SyElement.ToMasuNumber(Conv_Okiba.GetFirstMasuFromOkiba(okiba)) ] = true; } }); //駒台スペースは40マスです。 for (int i = 0; i < Util_Masu10.KOMADAI_KOMABUKURO_SPACE_LENGTH; i++) { if (!exists[i]) { akiMasu = Masu_Honshogi.Masus_All[i + Conv_SyElement.ToMasuNumber(Conv_Okiba.GetFirstMasuFromOkiba(okiba))]; goto gt_EndMethod; } } gt_EndMethod: //Logger.Trace($"ゲット駒台駒袋スペース={akiMasu}"); return(akiMasu); }
/// <summary> /// ************************************************************************************************************************ /// 指定の筋にあるスプライトを返します。(本将棋用)二歩チェックに利用。 /// ************************************************************************************************************************ /// </summary> /// <param name="src_Sky"></param> /// <param name="okiba">置き場</param> /// <param name="pside">先後</param> /// <param name="pside">駒種類</param> /// <param name="suji">筋番号1~9</param> /// <returns></returns> public static Fingers InOkibaPsideKomasyuruiSujiNow(SkyConst src_Sky, Okiba okiba, Playerside pside, PieceType ks, int suji) { Fingers found = new Fingers(); foreach (Finger finger in Finger_Honshogi.Items_KomaOnly) { RO_Star koma2 = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(finger).Now); int suji2; Util_MasuNum.TryMasuToSuji(koma2.Masu, out suji2); if ( Conv_SyElement.ToOkiba(koma2.Masu) == okiba && koma2.Pside == pside && koma2.Komasyurui == ks && suji2 == suji ) { found.Add(finger); } } return(found); }
/// <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> /// 駒別マスをJSON化します。 /// </summary> /// <param name="enableLog"></param> /// <param name="src_Sky_base"></param> /// <param name="km_move"></param> /// <param name="comment"></param> /// <returns></returns> public static string JsonKyokumens_MultiKomabetuMasus(bool enableLog, SkyConst src_Sky_base, Maps_OneAndOne <Finger, SySet <SyElement> > km_move, string comment) { StringBuilder sb = new StringBuilder(); if (!enableLog) { goto gt_EndMethod; } km_move.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) => { // 駒1つ RO_Star koma = Util_Starlightable.AsKoma(src_Sky_base.StarlightIndexOf(key).Now); PieceType ks14 = Util_Komahaiyaku184.Syurui(koma.Haiyaku); sb.AppendLine(" ["); // マスの色 sb.AppendLine(" { act:\"colorMasu\", style:\"rgba(100,240,100,0.5)\" },"); // 全マス foreach (New_Basho masu in value.Elements) { sb.AppendLine($" {{ act:\"drawMasu\" , masu:{masu.MasuNumber} }},"); } string komaImg = Util_Converter_LogGraphicEx.Finger_ToString(src_Sky_base, key, ""); 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> /// <returns></returns> public static string LogHtml() { StringBuilder sb = new StringBuilder(); sb.AppendLine("<html>"); sb.AppendLine("<head>"); sb.AppendLine(" <title>強制転成表</title>"); sb.AppendLine(" <style type=\"text/css\">"); sb.AppendLine(" /* 将棋盤 */"); sb.AppendLine(" table{"); sb.AppendLine(" border-collapse:collapse;"); sb.AppendLine(" border:2px #2b2b2b solid;"); sb.AppendLine(" }"); sb.AppendLine(" td{"); sb.AppendLine(" border:1px #2b2b2b solid;"); sb.AppendLine(" background-color:#ffcc55;"); sb.AppendLine(" width:48px; height:48px;"); sb.AppendLine(" }"); sb.AppendLine(" </style>"); sb.AppendLine("</head>"); sb.AppendLine("<body>"); foreach (KeyValuePair <Komahaiyaku185, Dictionary <int, Komahaiyaku185> > entry1 in Array_ForcePromotion.HaiyakuMap) { sb.Append("<h1>"); sb.Append(entry1.Key); sb.AppendLine("</h1>"); sb.Append("<table>"); // 9一~1一、9二~1二、…9九~1九の順だぜ☆ for (int dan = 1; dan <= 9; dan++) { sb.AppendLine("<tr>"); sb.Append(" "); for (int suji = 9; suji >= 1; suji--) { SyElement masu = Util_Masu10.OkibaSujiDanToMasu(Okiba.ShogiBan, suji, dan); sb.Append("<td>"); if (entry1.Value.ContainsKey(Conv_SyElement.ToMasuNumber(masu))) { // 強制転成が起こるマスなら、画像を出します。 Komahaiyaku185 kh184 = entry1.Value[Conv_SyElement.ToMasuNumber(masu)]; int haiyakuHandle = (int)kh184; sb.Append("<img src=\"../Data/img/train"); if (haiyakuHandle < 10) { sb.Append("00"); } else if (haiyakuHandle < 100) { sb.Append("0"); } sb.Append(haiyakuHandle); sb.Append(".png\" />"); } sb.Append("</td>"); } sb.AppendLine(); sb.AppendLine("</tr>"); } sb.AppendLine("</table>"); } sb.AppendLine("</body>"); sb.AppendLine("</html>"); return(sb.ToString()); }
/// <summary> /// 盤1個分のログ。 /// </summary> private static void AAA_Write_Node( IEngineConf engineConf, ref int logFileCounter, string nodePath, KifuNode node, KifuTree kifu, string relFolder, KyokumenPngEnvironment reportEnvironment ) { string fileName = ""; // 出力先 fileName = Conv_Filepath.ToEscape($"_log_{((int)node.Score)}点_{logFileCounter}_{nodePath}.png"); relFolder = Conv_Filepath.ToEscape(relFolder); // // 画像ログ // if (true) { int srcMasu_orMinusOne = -1; int dstMasu_orMinusOne = -1; if (null != node.Key) { srcMasu_orMinusOne = Conv_SyElement.ToMasuNumber(((RO_Star)node.Key.LongTimeAgo).Masu); dstMasu_orMinusOne = Conv_SyElement.ToMasuNumber(((RO_Star)node.Key.Now).Masu); } KyokumenPngArgs_FoodOrDropKoma foodKoma; if (null != node.Key.FoodKomaSyurui) { switch (Util_Komasyurui14.NarazuCaseHandle((PieceType)node.Key.FoodKomaSyurui)) { case PieceType.None: foodKoma = KyokumenPngArgs_FoodOrDropKoma.NONE; break; case PieceType.P: foodKoma = KyokumenPngArgs_FoodOrDropKoma.FU__; break; case PieceType.L: foodKoma = KyokumenPngArgs_FoodOrDropKoma.KYO_; break; case PieceType.N: foodKoma = KyokumenPngArgs_FoodOrDropKoma.KEI_; break; case PieceType.S: foodKoma = KyokumenPngArgs_FoodOrDropKoma.GIN_; break; case PieceType.G: foodKoma = KyokumenPngArgs_FoodOrDropKoma.KIN_; break; case PieceType.R: foodKoma = KyokumenPngArgs_FoodOrDropKoma.HI__; break; case PieceType.B: foodKoma = KyokumenPngArgs_FoodOrDropKoma.KAKU; break; default: foodKoma = KyokumenPngArgs_FoodOrDropKoma.UNKNOWN; break; } } else { foodKoma = KyokumenPngArgs_FoodOrDropKoma.NONE; } // 評価明細に添付 Util_KyokumenPng_Writer.Write1( Conv_KifuNode.ToRO_Kyokumen1(node), srcMasu_orMinusOne, dstMasu_orMinusOne, foodKoma, ConvMoveStrSfen.ToMoveStrSfen(node.Key), relFolder, fileName, reportEnvironment ); logFileCounter++; } // // 評価明細 // { Util_KifuTreeLogWriter.AAAA_Write_HyokaMeisai(engineConf, fileName, node, relFolder, reportEnvironment); } }