/// <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); }
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> /// 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="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> /// 動かす駒を移動先へ。 /// </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> /// <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> /// 指定した置き場にある駒のハンドルを返します。 /// </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> /// ************************************************************************************************************************ /// 局面上のオブジェクトを返します。置き場、先後サイド、駒の種類で絞りこみます。 /// ************************************************************************************************************************ /// </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> /// ************************************************************************************************************************ /// 駒のハンドルを返します。 : 置き場、種類 /// ************************************************************************************************************************ /// </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); }
/// <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="masus"></param> /// <param name="memo"></param> /// <returns></returns> public static string Log_Masus(SySet <SyElement> masus, string memo) { StringBuilder sb = new StringBuilder(); int errorCount = 0; // フォルスクリア bool[] ban81 = new bool[81]; // フラグ立て foreach (New_Basho basho in masus.Elements) { if (Okiba.ShogiBan == Conv_SyElement.ToOkiba(Masu_Honshogi.Masus_All[basho.MasuNumber])) { ban81[basho.MasuNumber] = true; } } sb.AppendLine("...(^▽^)さて、局面は☆?"); if (null != memo && "" != memo.Trim()) { sb.AppendLine(memo); } sb.AppendLine(" 9 8 7 6 5 4 3 2 1"); sb.AppendLine("┏━┯━┯━┯━┯━┯━┯━┯━┯━┓"); for (int dan = 1; dan <= 9; dan++) { sb.Append("┃"); for (int suji = 9; suji >= 1; suji--)// 筋は左右逆☆ { SyElement masu = Util_Masu10.OkibaSujiDanToMasu(Okiba.ShogiBan, suji, dan); if (Okiba.ShogiBan == Conv_SyElement.ToOkiba(masu)) { if (ban81[Conv_SyElement.ToMasuNumber(masu)]) { sb.Append("●"); } else { sb.Append(" "); } } else { errorCount++; sb.Append(" "); } if (suji == 1)//1筋が最後だぜ☆ { sb.Append("┃"); sb.AppendLine(Conv_Int.ToKanSuji(dan)); } else { sb.Append("│"); } } if (dan == 9) { sb.AppendLine("┗━┷━┷━┷━┷━┷━┷━┷━┷━┛"); } else { sb.AppendLine("┠─┼─┼─┼─┼─┼─┼─┼─┼─┨"); } } // 後手駒台 sb.Append("エラー数:"); sb.AppendLine(errorCount.ToString()); sb.AppendLine("...(^▽^)ドウダッタカナ~☆"); return(sb.ToString()); }
/// <summary> /// 4分割します。 /// </summary> /// <param name="fs_banjoSeme">fingers</param> /// <param name="fs_banjoKurau"></param> /// <param name="fs_motiSeme"></param> /// <param name="fs_motiKurau"></param> /// <param name="src_Sky"></param> /// <param name="tebanSeme"></param> /// <param name="tebanKurau"></param> public static void Split_BanjoSeme_BanjoKurau_MotiSeme_MotiKurau( out Fingers fs_banjoSeme, //戦駒(利きを調べる側) out Fingers fs_banjoKurau, //戦駒(喰らう側) out Fingers fs_motiSeme, // 持駒(利きを調べる側) out Fingers fs_motiKurau, // 持駒(喰らう側) SkyConst src_Sky, Playerside tebanSeme, Playerside tebanKurau ) { Fingers fs_banjoSeme_temp = new Fingers(); // (1)盤上駒_攻め手 Fingers fs_banjoKurau_temp = new Fingers(); // (2)盤上駒_食らう側 Fingers fs_motiSeme_temp = new Fingers(); // (3)持ち駒_攻め手 Fingers fs_motiKurau_temp = new Fingers(); // (4)持ち駒_食らう側 src_Sky.Foreach_Starlights((Finger finger, IMoveHalf light, ref bool toBreak) => { RO_Star star = Util_Starlightable.AsKoma(light.Now);//駒 if (Conv_SyElement.ToOkiba(star.Masu) == Okiba.ShogiBan) { // // 盤上 // if (tebanSeme == star.Pside) { fs_banjoSeme_temp.Add(finger);// (1)盤上駒_攻め手 } else if (tebanKurau == star.Pside) { fs_banjoKurau_temp.Add(finger);// (2)盤上駒_食らう側 } } else if (Conv_SyElement.ToOkiba(star.Masu) == Okiba.Sente_Komadai) { // // P1駒台 // if (tebanSeme == Playerside.P1) { // 攻手がP1のとき、P1駒台は。 fs_motiSeme_temp.Add(finger);// (3)持ち駒_攻め手 } else if (tebanSeme == Playerside.P2) { // 攻手がP2のとき、P1駒台は。 fs_motiKurau_temp.Add(finger);// (4)持ち駒_食らう側 } else { throw new Exception("駒台の持ち駒を調べようとしましたが、先手でも、後手でもない指定でした。"); } } else if (Conv_SyElement.ToOkiba(star.Masu) == Okiba.Gote_Komadai) { // // P2駒台 // if (tebanSeme == Playerside.P1) { // 攻手がP1のとき、P2駒台は。 fs_motiKurau_temp.Add(finger);// (3)持ち駒_攻め手 } else if (tebanSeme == Playerside.P2) { // 攻手がP2のとき、P2駒台は。 fs_motiSeme_temp.Add(finger);// (4)持ち駒_食らう側 } else { throw new Exception("駒台の持ち駒を調べようとしましたが、先手でも、後手でもない指定でした。"); } } else { throw new Exception("駒台の持ち駒を調べようとしましたが、盤上でも、駒台でもない指定でした。"); } }); fs_banjoSeme = fs_banjoSeme_temp; // (1)盤上駒_攻め手 fs_banjoKurau = fs_banjoKurau_temp; // (2)盤上駒_食らう側 fs_motiSeme = fs_motiSeme_temp; // (3)持ち駒_攻め手 fs_motiKurau = fs_motiKurau_temp; // (4)持ち駒_食らう側 }
/// <summary> /// 「グラフィカル局面ログ」出力用だぜ☆ /// </summary> public static string Json_1Sky( SkyConst src_Sky, string memo, string hint, int temezumi_yomiGenTeban_forLog//読み進めている現在の手目済 //[CallerMemberName] string memberName = "", //[CallerFilePath] string sourceFilePath = "", //[CallerLineNumber] int sourceLineNumber = 0 ) { //...(^▽^)さて、局面は☆? StringBuilder sb = new StringBuilder(); sb.AppendLine("["); // コメント string comment; { StringBuilder cmt = new StringBuilder(); // メモ cmt.Append(memo); comment = cmt.ToString(); } sb.AppendLine($" {{ act:\"drawText\", text:\"{comment}\", x: 20, y:20 }},");//FIXME: \記号が入ってなければいいが☆ int hKoma = 0; int hMasu_sente = 81; int hMasu_gote = 121; // 全駒 src_Sky.Foreach_Starlights((Finger finger, IMoveHalf light, ref bool toBreak) => { RO_Star koma = Util_Starlightable.AsKoma(light.Now); if (Conv_SyElement.ToOkiba(koma.Masu) == Okiba.Gote_Komadai) { // 後手持ち駒 sb.AppendLine($" {{ act:\"drawImg\", img:\"{Util_Converter_LogGraphicEx.PsideKs14_ToString(koma.Pside, koma.Komasyurui, "")}\", masu: {hMasu_gote} }},");//FIXME: \記号が入ってなければいいが☆ hMasu_gote++; } else if (Conv_SyElement.ToOkiba(koma.Masu) == Okiba.Sente_Komadai) { // 先手持ち駒 sb.AppendLine($" {{ act:\"drawImg\", img:\"{Util_Converter_LogGraphicEx.PsideKs14_ToString(koma.Pside, koma.Komasyurui, "")}\", masu: {hMasu_sente} }},");//FIXME: \記号が入ってなければいいが☆ hMasu_sente++; } else if (Conv_SyElement.ToOkiba(koma.Masu) == Okiba.ShogiBan) { // 盤上 sb.AppendLine($" {{ act:\"drawImg\", img:\"{Util_Converter_LogGraphicEx.PsideKs14_ToString(koma.Pside, koma.Komasyurui, "")}\", masu: {Conv_SyElement.ToMasuNumber(koma.Masu)} }},");//FIXME: \記号が入ってなければいいが☆ } hKoma++; }); sb.AppendLine("],"); // ...(^▽^)ドウダッタカナ~☆ return(sb.ToString()); }
///// <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> /// 駒の利きを調べます。 /// </summary> /// <param name="src_Sky"></param> /// <returns></returns> public static MasubetuKikisuImpl ToMasubetuKikisu( SkyConst src_Sky, Playerside tebanside ) { // ①現手番の駒の移動可能場所_被王手含む List_OneAndMulti <Finger, SySet <SyElement> > komaBETUSusumeruMasus; Util_KyokumenMoves.LA_Split_KomaBETUSusumeruMasus( 3, //node_forLog, out komaBETUSusumeruMasus, //進めるマス true, //本将棋か src_Sky, //現在の局面 tebanside, //手番 false //相手番か #if DEBUG , null #endif ); MasubetuKikisuImpl result = new MasubetuKikisuImpl(); // // 「升ごとの敵味方」を調べます。 // foreach (Finger figKoma in Finger_Honshogi.Items_KomaOnly)// 全駒 { RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now); result.HMasu_PlayersideList[Conv_SyElement.ToMasuNumber(koma.Masu)] = koma.Pside; } // // 駒のない升は無視します。 // // // 駒のあるマスに、その駒の味方のコマが効いていれば 味方+1 // foreach (Finger figKoma in Finger_Honshogi.Items_KomaOnly)// 全駒 { // // 駒 // RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now); // 将棋盤上の戦駒のみ判定 if (Okiba.ShogiBan != Conv_SyElement.ToOkiba(koma.Masu)) { goto gt_Next1; } // // 駒の利きカウント FIXME:貫通してないか? // komaBETUSusumeruMasus.Foreach_Entry((Finger figKoma2, SySet <SyElement> kikiZukei, ref bool toBreak) => { IEnumerable <SyElement> kikiMasuList = kikiZukei.Elements; foreach (SyElement masu in kikiMasuList) { // その枡に利いている駒のハンドルを追加 if (result.HMasu_PlayersideList[Conv_SyElement.ToMasuNumber(masu)] == Playerside.Empty) { // 駒のないマスは無視。 } else if (Playerside.P1 == koma.Pside) { // 利きのあるマスにある駒と、この駒のプレイヤーサイドが同じ。 result.Kikisu_AtMasu_1P[Conv_SyElement.ToMasuNumber(masu)] += 1; } else { // 反対の場合。 result.Kikisu_AtMasu_2P[Conv_SyElement.ToMasuNumber(masu)] += 1; } } }); gt_Next1: ; } return(result); }
public static void Assert_Honshogi(SkyConst src_Sky) { Debug.Assert(src_Sky.Count == 40, $"siteiSky.Starlights.Count=[{src_Sky.Count}]");//将棋の駒の数 ////デバッグ //{ // StringBuilder sb = new StringBuilder(); // for (int i = 0; i < 40; i++) // { // sb.Append("駒{i}.種類=[{((RO_Star_KomaKs)siteiSky.StarlightIndexOf(i).Now).Syurui}]\n"); // } // MessageBox.Show(sb.ToString()); //} // 王 Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(0).Now).Komasyurui == PieceType.K, $"駒0.種類=[{((RO_Star)src_Sky.StarlightIndexOf(0).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(1).Now).Komasyurui == PieceType.K, $"駒1.種類=[{((RO_Star)src_Sky.StarlightIndexOf(1).Now).Komasyurui}]"); // 飛車 Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(2).Now).Komasyurui == PieceType.R || ((RO_Star)src_Sky.StarlightIndexOf(2).Now).Komasyurui == PieceType.PR, $"駒2.種類=[{((RO_Star)src_Sky.StarlightIndexOf(2).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(3).Now).Komasyurui == PieceType.R || ((RO_Star)src_Sky.StarlightIndexOf(3).Now).Komasyurui == PieceType.PR, $"駒3.種類=[{((RO_Star)src_Sky.StarlightIndexOf(3).Now).Komasyurui}]"); // 角 Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(4).Now).Komasyurui == PieceType.B || ((RO_Star)src_Sky.StarlightIndexOf(4).Now).Komasyurui == PieceType.PB, $"駒4.種類=[{((RO_Star)src_Sky.StarlightIndexOf(4).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(5).Now).Komasyurui == PieceType.B || ((RO_Star)src_Sky.StarlightIndexOf(5).Now).Komasyurui == PieceType.PB, $"駒5.種類=[{((RO_Star)src_Sky.StarlightIndexOf(5).Now).Komasyurui}]"); // 金 Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(6).Now).Komasyurui == PieceType.G, $"駒6.種類=[{((RO_Star)src_Sky.StarlightIndexOf(6).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(7).Now).Komasyurui == PieceType.G, $"駒7.種類=[{((RO_Star)src_Sky.StarlightIndexOf(7).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(8).Now).Komasyurui == PieceType.G, $"駒8.種類=[{((RO_Star)src_Sky.StarlightIndexOf(8).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(9).Now).Komasyurui == PieceType.G, $"駒9.種類=[{((RO_Star)src_Sky.StarlightIndexOf(9).Now).Komasyurui}]"); // 銀 Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(10).Now).Komasyurui == PieceType.S || ((RO_Star)src_Sky.StarlightIndexOf(10).Now).Komasyurui == PieceType.PS, $"駒10.種類=[{((RO_Star)src_Sky.StarlightIndexOf(10).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(11).Now).Komasyurui == PieceType.S || ((RO_Star)src_Sky.StarlightIndexOf(11).Now).Komasyurui == PieceType.PS, $"駒11.種類=[{((RO_Star)src_Sky.StarlightIndexOf(11).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(12).Now).Komasyurui == PieceType.S || ((RO_Star)src_Sky.StarlightIndexOf(12).Now).Komasyurui == PieceType.PS, $"駒12.種類=[{((RO_Star)src_Sky.StarlightIndexOf(12).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(13).Now).Komasyurui == PieceType.S || ((RO_Star)src_Sky.StarlightIndexOf(13).Now).Komasyurui == PieceType.PS, $"駒13.種類=[{((RO_Star)src_Sky.StarlightIndexOf(13).Now).Komasyurui}]"); // 桂 Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(14).Now).Komasyurui == PieceType.N || ((RO_Star)src_Sky.StarlightIndexOf(14).Now).Komasyurui == PieceType.PN, $"駒14.種類=[{((RO_Star)src_Sky.StarlightIndexOf(14).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(15).Now).Komasyurui == PieceType.N || ((RO_Star)src_Sky.StarlightIndexOf(15).Now).Komasyurui == PieceType.PN, $"駒15.種類=[{((RO_Star)src_Sky.StarlightIndexOf(15).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(16).Now).Komasyurui == PieceType.N || ((RO_Star)src_Sky.StarlightIndexOf(16).Now).Komasyurui == PieceType.PN, $"駒16.種類=[{((RO_Star)src_Sky.StarlightIndexOf(16).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(17).Now).Komasyurui == PieceType.N || ((RO_Star)src_Sky.StarlightIndexOf(17).Now).Komasyurui == PieceType.PN, $"駒17.種類=[{((RO_Star)src_Sky.StarlightIndexOf(17).Now).Komasyurui}]"); // 香 Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(18).Now).Komasyurui == PieceType.L || ((RO_Star)src_Sky.StarlightIndexOf(18).Now).Komasyurui == PieceType.PL, $"駒18.種類=[{((RO_Star)src_Sky.StarlightIndexOf(18).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(19).Now).Komasyurui == PieceType.L || ((RO_Star)src_Sky.StarlightIndexOf(19).Now).Komasyurui == PieceType.PL, $"駒19.種類=[{((RO_Star)src_Sky.StarlightIndexOf(19).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(20).Now).Komasyurui == PieceType.L || ((RO_Star)src_Sky.StarlightIndexOf(20).Now).Komasyurui == PieceType.PL, $"駒20.種類=[{((RO_Star)src_Sky.StarlightIndexOf(20).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(21).Now).Komasyurui == PieceType.L || ((RO_Star)src_Sky.StarlightIndexOf(21).Now).Komasyurui == PieceType.PL, $"駒21.種類=[{((RO_Star)src_Sky.StarlightIndexOf(21).Now).Komasyurui}]"); // 歩 Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(22).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(22).Now).Komasyurui == PieceType.PP, "駒22.種類=[{((RO_Star)src_Sky.StarlightIndexOf(22).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(23).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(23).Now).Komasyurui == PieceType.PP, "駒23.種類=[{((RO_Star)src_Sky.StarlightIndexOf(23).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(24).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(24).Now).Komasyurui == PieceType.PP, "駒24.種類=[{((RO_Star)src_Sky.StarlightIndexOf(24).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(25).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(25).Now).Komasyurui == PieceType.PP, "駒25.種類=[{((RO_Star)src_Sky.StarlightIndexOf(25).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(26).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(26).Now).Komasyurui == PieceType.PP, "駒26.種類=[{((RO_Star)src_Sky.StarlightIndexOf(26).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(27).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(27).Now).Komasyurui == PieceType.PP, "駒27.種類=[{((RO_Star)src_Sky.StarlightIndexOf(27).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(28).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(28).Now).Komasyurui == PieceType.PP, "駒28.種類=[{((RO_Star)src_Sky.StarlightIndexOf(28).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(29).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(29).Now).Komasyurui == PieceType.PP, "駒29.種類=[{((RO_Star)src_Sky.StarlightIndexOf(29).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(30).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(30).Now).Komasyurui == PieceType.PP, "駒30.種類=[{((RO_Star)src_Sky.StarlightIndexOf(30).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(31).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(31).Now).Komasyurui == PieceType.PP, "駒31.種類=[{((RO_Star)src_Sky.StarlightIndexOf(31).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(32).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(32).Now).Komasyurui == PieceType.PP, "駒32.種類=[{((RO_Star)src_Sky.StarlightIndexOf(32).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(33).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(33).Now).Komasyurui == PieceType.PP, "駒33.種類=[{((RO_Star)src_Sky.StarlightIndexOf(33).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(34).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(34).Now).Komasyurui == PieceType.PP, "駒34.種類=[{((RO_Star)src_Sky.StarlightIndexOf(34).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(35).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(35).Now).Komasyurui == PieceType.PP, "駒35.種類=[{((RO_Star)src_Sky.StarlightIndexOf(35).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(36).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(36).Now).Komasyurui == PieceType.PP, "駒36.種類=[{((RO_Star)src_Sky.StarlightIndexOf(36).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(37).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(37).Now).Komasyurui == PieceType.PP, "駒37.種類=[{((RO_Star)src_Sky.StarlightIndexOf(37).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(38).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(38).Now).Komasyurui == PieceType.PP, "駒38.種類=[{((RO_Star)src_Sky.StarlightIndexOf(38).Now).Komasyurui}]"); Debug.Assert(((RO_Star)src_Sky.StarlightIndexOf(39).Now).Komasyurui == PieceType.P || ((RO_Star)src_Sky.StarlightIndexOf(39).Now).Komasyurui == PieceType.PP, "駒39.種類=[{((RO_Star)src_Sky.StarlightIndexOf(39).Now).Komasyurui}]"); for (int i = 0; i < 40; i++) { RO_Star koma = (RO_Star)src_Sky.StarlightIndexOf(0).Now; Komahaiyaku185 haiyaku = koma.Haiyaku; if (Okiba.ShogiBan == Conv_SyElement.ToOkiba(koma.Masu)) { Debug.Assert(!Util_KomahaiyakuEx184.IsKomabukuro(haiyaku), "将棋盤の上に、配役:駒袋 があるのはおかしい。"); } //if( // haiyaku==Kh185.n164_歩打 // ) //{ //} //koma.Syurui //Debug.Assert((.Syurui == Ks14.H06_Oh, $"駒0.種類=[{((RO_Star_Koma)siteiSky.StarlightIndexOf(0).Now).Syurui}]"); //sb.Append($"駒{i}.種類=[{((RO_Star_KomaKs)siteiSky.StarlightIndexOf(i).Now).Syurui}]\n"); } }