/// <summary> /// 合法手レベル1 /// </summary> /// <returns></returns> public static SySet <SyElement> Create_01Fu(Playerside pside, SyElement masu_ji) { //---------------------------------------- // 歩 //---------------------------------------- SySet_Default <SyElement> dst = new SySet_Default <SyElement>("歩の移動先"); if (Okiba.ShogiBan == Conv_SyElement.ToOkiba(masu_ji)) { //---------------------------------------- // 将棋盤上の歩の移動先 //---------------------------------------- dst.AddSupersets(KomanoKidou.DstIppo_上(pside, masu_ji)); } else if ((Okiba.Sente_Komadai | Okiba.Gote_Komadai).HasFlag( Conv_SyElement.ToOkiba(masu_ji))) { //---------------------------------------- // 駒台上の歩の移動先 //---------------------------------------- dst.AddSupersets(KomanoKidou.Dst_歩打面(pside)); } return(dst); }
/// <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 int GetKyori(SyElement mokuhyo, SyElement genzai) { // // とりあえず おおざっぱに計算します。 // int mokuhyoDan; Util_MasuNum.MasuToDan(mokuhyo, out mokuhyoDan); int mokuhyoSuji; Util_MasuNum.MasuToSuji(mokuhyo, out mokuhyoSuji); int genzaiDan; Util_MasuNum.MasuToDan(genzai, out genzaiDan); int genzaiSuji; Util_MasuNum.MasuToSuji(genzai, out genzaiSuji); int kyori = Math.Abs(mokuhyoDan - genzaiDan) + Math.Abs(mokuhyoSuji - genzaiSuji); return(kyori); }
public static Okiba GetOkiba(SyElement masu) { Okiba okiba; int masuHandle = Util_Masu.AsMasuNumber(masu); if (0 <= masuHandle && masuHandle <= 80) { // 将棋盤 okiba = Okiba.ShogiBan; } else if (81 <= masuHandle && masuHandle <= 120) { // 先手駒台 okiba = Okiba.Sente_Komadai; } else if (121 <= masuHandle && masuHandle <= 160) { // 後手駒台 okiba = Okiba.Gote_Komadai; } else if (161 <= masuHandle && masuHandle <= 200) { // 駒袋 okiba = Okiba.KomaBukuro; } else { // エラー okiba = Okiba.Empty; } return(okiba); }
public RO_Star(RO_Star src) { this.startype = BoardItem.Koma; this.pside = src.Pside; this.masu = src.Masu; this.komasyurui = src.Komasyurui; }
//------------------------------------------------------------ #endregion public static Okiba Masu_ToOkiba(SyElement masu) { Okiba result; if ((int)Masu_Honshogi.ban11_1一.MasuNumber <= Util_Masu.AsMasuNumber(masu) && Util_Masu.AsMasuNumber(masu) <= (int)Masu_Honshogi.ban99_9九.MasuNumber) { // 将棋盤 result = Okiba.ShogiBan; } else if ((int)Masu_Honshogi.sen01.MasuNumber <= Util_Masu.AsMasuNumber(masu) && Util_Masu.AsMasuNumber(masu) <= (int)Masu_Honshogi.sen40.MasuNumber) { // 先手駒台 result = Okiba.Sente_Komadai; } else if ((int)Masu_Honshogi.go01.MasuNumber <= Util_Masu.AsMasuNumber(masu) && Util_Masu.AsMasuNumber(masu) <= (int)Masu_Honshogi.go40.MasuNumber) { // 後手駒台 result = Okiba.Gote_Komadai; } else if ((int)Masu_Honshogi.fukuro01.MasuNumber <= Util_Masu.AsMasuNumber(masu) && Util_Masu.AsMasuNumber(masu) <= (int)Masu_Honshogi.fukuro40.MasuNumber) { // 駒袋 result = Okiba.KomaBukuro; } else { // 該当なし result = Okiba.Empty; } return(result); }
public RO_Star(Playerside pside, SyElement masu, Komahaiyaku185 haiyaku) { this.startype = BoardItem.Koma; this.pside = pside; this.masu = masu; this.komasyurui = Util_Komahaiyaku184.Syurui(haiyaku); }
public RO_Star(Playerside pside, SyElement masu, PieceType syurui) { this.startype = BoardItem.Koma; this.pside = pside; this.masu = masu; this.komasyurui = syurui; }
/// <summary> /// 将棋盤、駒台に筋があります。 /// </summary> /// <param name="masu"></param> /// <returns>該当なければ-1</returns> public static bool MasuToDan(SyElement masu, out int result) { bool successful = true; Okiba okiba = Util_Masu.GetOkiba(masu); switch (okiba) { case Okiba.ShogiBan: result = (Util_Masu.AsMasuNumber(masu) - Util_Masu.AsMasuNumber(Util_Masu.GetFirstMasuFromOkiba(okiba))) % 9 + 1; break; case Okiba.Sente_Komadai: case Okiba.Gote_Komadai: result = (Util_Masu.AsMasuNumber(masu) - Util_Masu.AsMasuNumber(Util_Masu.GetFirstMasuFromOkiba(okiba))) % 10 + 1; break; case Okiba.KomaBukuro: result = (Util_Masu.AsMasuNumber(masu) - Util_Masu.AsMasuNumber(Util_Masu.GetFirstMasuFromOkiba(okiba))) % 10 + 1; break; default: // エラー result = -1; successful = false; goto gt_EndMethod; } gt_EndMethod: return(successful); }
/// <summary> /// 「0」→「1一」。 /// </summary> /// <param name="hMasu"></param> /// <returns></returns> public static string Handle_To_Label(int hMasu) { string result; if (0 <= hMasu && hMasu < ConstShogi.BAN_SIZE) { SyElement masu = Conv_MasuHandle.ToMasu(hMasu); int suji; Util_MasuNum.TryMasuToSuji(masu, out suji); int dan; Util_MasuNum.TryMasuToDan(masu, out dan); StringBuilder sb = new StringBuilder(); sb.Append(Conv_Int.ToArabiaSuji(suji)); sb.Append(Conv_Int.ToKanSuji(dan)); result = sb.ToString(); } else { StringBuilder sb = new StringBuilder(); sb.Append("エラー"); sb.Append("("); sb.Append(hMasu); sb.Append(")"); result = sb.ToString(); } return(result); }
/// <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でもう進めてあるので、そのまま。 )); }
/// <summary> /// ************************************************************************************************************************ /// 相手陣に入っていれば真。 /// ************************************************************************************************************************ /// /// 後手は 7,8,9 段。 /// 先手は 1,2,3 段。 /// </summary> /// <returns></returns> public static bool InAitejin(SyElement masu, Playerside pside) { int dan; Util_MasuNum.MasuToDan(masu, out dan); return((Playerside.P2 == pside && 7 <= dan) || (Playerside.P1 == pside && dan <= 3)); }
/// <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 == Util_Masu.Masu_ToOkiba(masu) && pside == Playerside.P2) { result = Masu_Honshogi.Items_All[80 - Util_Masu.AsMasuNumber(masu)]; } // 将棋盤で先手、または 駒台か 駒袋なら、指定されたマスにそのまま入れます。 return(result); }
/// <summary> /// ************************************************************************************************************************ /// 1マス上、のように指定して、マスを取得します。 /// ************************************************************************************************************************ /// </summary> /// <param name="offsetSuji"></param> /// <param name="offsetDan"></param> /// <returns></returns> public static SyElement Offset(Okiba okiba, SyElement masu, int offsetSuji, int offsetDan) { int suji; int dan; Util_MasuNum.MasuToSuji(masu, out suji); Util_MasuNum.MasuToDan(masu, out dan); return(Util_Masu.OkibaSujiDanToMasu( okiba, suji + offsetSuji, dan + offsetDan )); }
public SasuEntry( IMove newMove, //string moveStr, Finger finger, SyElement masu, bool naru ) { this.NewMove = newMove; //this.MoveStr = moveStr; this.Finger = finger; this.Masu = masu; this.Naru = naru; }
/// <summary> /// 「2八」といった表記にして返します。 /// </summary> /// <param name="masu"></param> /// <returns></returns> public static string Masu_ToKanji(SyElement masu) { StringBuilder sb = new StringBuilder(); int suji; int dan; Util_MasuNum.MasuToSuji(Masu_Honshogi.Items_All[Util_Masu.AsMasuNumber(masu)], out suji); Util_MasuNum.MasuToDan(Masu_Honshogi.Items_All[Util_Masu.AsMasuNumber(masu)], out dan); sb.Append(ConverterKnSh.Int_ToArabiaSuji(suji)); sb.Append(ConverterKnSh.Int_ToKanSuji(dan)); return(sb.ToString()); }
public static int ToMasuNumber(SyElement syElm) { int result; if (syElm is New_Basho) { result = ((New_Basho)syElm).MasuNumber; } else { result = Masu_Honshogi.nError; } return(result); }
public static int AsMasuNumber(SyElement syElm) { int result; if (syElm is Basho) { result = ((Basho)syElm).MasuNumber; } else { result = Masu_Honshogi.Error.MasuNumber; } return(result); }
//------------------------------------------------------------ #endregion /// <summary> /// 「2八」といった表記にして返します。 /// /// Conv_SyElement使用。 /// </summary> /// <param name="masu"></param> /// <returns></returns> public static string ToSujiKanji(SyElement masu) { StringBuilder sb = new StringBuilder(); int suji; int dan; Util_MasuNum.TryMasuToSuji(masu, out suji); Util_MasuNum.TryMasuToDan(masu, out dan); sb.Append(Conv_Int.ToArabiaSuji(suji)); sb.Append(Conv_Int.ToKanSuji(dan)); return(sb.ToString()); }
/// <summary> /// /// </summary> /// <param name="okiba"></param> /// <param name="suji"></param> /// <param name="dan"></param> /// <returns></returns> public static SyElement OkibaSujiDanToMasu(Okiba okiba, int suji, int dan) { int masuHandle = Util_Masu10.Handle_OkibaSujiDanToMasu(okiba, suji, dan); SyElement masu = Masu_Honshogi.Query_Basho(Masu_Honshogi.nError);//範囲外が指定されることもあります。 if (Conv_MasuHandle.Yuko(masuHandle)) { masu = Masu_Honshogi.Masus_All[masuHandle]; } return(masu); }
public static bool IsErrorBasho(SyElement masu) { bool result; if (Masu_Honshogi.nError == ((New_Basho)masu).MasuNumber) { result = true; } else { result = false; } 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); }
public static SySet <SyElement> CreateKin_static(Playerside pside, SyElement masu_ji) { SySet_Default <SyElement> dst = new SySet_Default <SyElement>("カナゴマの移動先"); if (Okiba.ShogiBan == Util_Masu.Masu_ToOkiba(masu_ji)) { dst.AddSupersets(KomanoKidou.DstIppo_上(pside, masu_ji)); dst.AddSupersets(KomanoKidou.DstIppo_昇(pside, masu_ji)); dst.AddSupersets(KomanoKidou.DstIppo_射(pside, masu_ji)); dst.AddSupersets(KomanoKidou.DstIppo_引(pside, masu_ji)); dst.AddSupersets(KomanoKidou.DstIppo_滑(pside, masu_ji)); dst.AddSupersets(KomanoKidou.DstIppo_浮(pside, masu_ji)); } return(dst); }
/// <summary> /// 合法手レベル1 /// </summary> /// <returns></returns> public static SySet <SyElement> Create_05Kin(Playerside pside, SyElement masu_ji) { SySet <SyElement> dst = new SySet_Default <SyElement>("金の移動先"); if (Okiba.ShogiBan == Util_Masu.Masu_ToOkiba(masu_ji)) { dst = Rule01_PotentialMove_15Array.CreateKin_static(pside, masu_ji); } else if ((Okiba.Sente_Komadai | Okiba.Gote_Komadai).HasFlag( Util_Masu.Masu_ToOkiba(masu_ji))) { dst.AddSupersets(KomanoKidou.Dst_全打面(pside)); } return(dst); }
/// <summary> /// 合法手レベル1 /// </summary> /// <returns></returns> public static SySet <SyElement> Create_02Kyo(Playerside pside, SyElement masu_ji) { SySet_Default <SyElement> dst = new SySet_Default <SyElement>("香の移動先"); if (Okiba.ShogiBan == Util_Masu.Masu_ToOkiba(masu_ji)) { dst.AddSupersets(KomanoKidou.DstKantu_上(pside, masu_ji)); } else if ((Okiba.Sente_Komadai | Okiba.Gote_Komadai).HasFlag( Util_Masu.Masu_ToOkiba(masu_ji))) { dst.AddSupersets(KomanoKidou.Dst_歩打面(pside));//香も同じ } return(dst); }
/// <summary> /// 無ければ追加、あれば上書き。 /// </summary> /// <param name="hKoma"></param> /// <param name="masus"></param> public static void AddOverwrite( Maps_OneAndMulti <Finger, SyElement> komabetuMasu, Finger finger, SyElement masu) { if (komabetuMasu.Items.ContainsKey(finger)) { komabetuMasu.Items[finger].Add(masu);//追加します。 } else { // 無かったので、新しく追加します。 List <SyElement> list = new List <SyElement>(); list.Add(masu); komabetuMasu.Items.Add(finger, list); } }
/// <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> /// 合法手レベル1 /// </summary> /// <returns></returns> public static SySet <SyElement> Create_03Kei(Playerside pside, SyElement masu_ji) { SySet_Default <SyElement> dst = new SySet_Default <SyElement>("桂の移動先"); if (Okiba.ShogiBan == Util_Masu.Masu_ToOkiba(masu_ji)) { dst.AddSupersets(KomanoKidou.DstKeimatobi_駆(pside, masu_ji)); dst.AddSupersets(KomanoKidou.DstKeimatobi_跳(pside, masu_ji)); } else if ((Okiba.Sente_Komadai | Okiba.Gote_Komadai).HasFlag( Util_Masu.Masu_ToOkiba(masu_ji))) { dst.AddSupersets(KomanoKidou.Dst_桂打面(pside)); } return(dst); }
/// <summary> /// ************************************************************************************************************************ /// 1マス上、のように指定して、マスを取得します。 /// ************************************************************************************************************************ /// </summary> /// <param name="offsetSuji"></param> /// <param name="offsetDan"></param> /// <returns></returns> public static SyElement Offset(Okiba okiba, SyElement masu, Playerside pside, Hogaku muki) { int offsetSuji; int offsetDan; Util_Muki.MukiToOffsetSujiDan(muki, pside, out offsetSuji, out offsetDan); int suji; int dan; Util_MasuNum.MasuToSuji(masu, out suji); Util_MasuNum.MasuToDan(masu, out dan); return(Util_Masu.OkibaSujiDanToMasu( okiba, suji + offsetSuji, dan + offsetDan)); }
/// <summary> /// 合法手レベル1 /// </summary> /// <returns></returns> public static SySet <SyElement> Create_08Kaku(Playerside pside, SyElement masu_ji) { SySet_Default <SyElement> dst = new SySet_Default <SyElement>("角の移動先"); if (Okiba.ShogiBan == Conv_SyElement.ToOkiba(masu_ji)) { dst.AddSupersets(KomanoKidou.DstKantu_昇(pside, masu_ji)); dst.AddSupersets(KomanoKidou.DstKantu_沈(pside, masu_ji)); dst.AddSupersets(KomanoKidou.DstKantu_降(pside, masu_ji)); dst.AddSupersets(KomanoKidou.DstKantu_浮(pside, masu_ji)); } else if ((Okiba.Sente_Komadai | Okiba.Gote_Komadai).HasFlag( Conv_SyElement.ToOkiba(masu_ji))) { dst.AddSupersets(KomanoKidou.Dst_全打面(pside)); } return(dst); }