/// <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> /// <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> public static bool IsNari(IMoveHalf 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> /// 相手陣に入っていれば真。 /// /// 後手は 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="kifu"></param> /// <param name="finger"></param> /// <param name="light"></param> public void PutOverwriteOrAdd_Starlight(Finger finger, IMoveHalf light) { if (this.starlights.Count == (int)finger) { // オブジェクトを追加します。 this.Starlights.Add(light); } else if (this.starlights.Count + 1 <= (int)finger) { // エラー throw new Exception($"{this.GetType().Name}#SetStarPos: リストの要素より2多いインデックスを指定されましたので、追加しません。starIndex=[{finger}] / this.stars.Count=[{this.starlights.Count}]"); } else { this.Starlights[(int)finger] = light; } }
public static Json_Val ToJsonVal(IMoveHalf light) { Json_Obj obj = new Json_Obj(); RO_Star koma = Util_Starlightable.AsKoma(light.Now); // プレイヤーサイド obj.Add(new Json_Prop("pside", Conv_Playerside.ToSankaku(koma.Pside)));// ▲△ // マス obj.Add(new Json_Prop("masu", Conv_SyElement.ToMasuNumber(koma.Masu)));// ▲△ // 駒の種類。歩、香、桂…。 obj.Add(new Json_Prop("syurui", Conv_Komasyurui.ToStr_Ichimoji(Util_Komahaiyaku184.Syurui(koma.Haiyaku))));// ▲△ return(obj); }
public static void Komamove1a_49Gui( out PieceType toSyurui, out IMoveHalf dst, Shape_BtnKoma btnKoma_Selected, Shape_BtnMasu btnMasu, MainGui_Csharp mainGui ) { // 駒の種類 if (mainGui.Naru) { // 成ります toSyurui = Util_Komasyurui14.NariCaseHandle[(int)Util_Komahaiyaku184.Syurui(Util_Starlightable.AsKoma(mainGui.Shape_PnlTaikyoku.MouseStarlightOrNull2.Now).Haiyaku)]; mainGui.SetNaruFlag(false); } else { // そのまま toSyurui = Util_Komahaiyaku184.Syurui(Util_Starlightable.AsKoma(mainGui.Shape_PnlTaikyoku.MouseStarlightOrNull2.Now).Haiyaku); } // 置く駒 { dst = new RO_Starlight( //btnKoma_Selected.Finger, new RO_Star( Util_Starlightable.AsKoma(mainGui.Model_Manual.GuiSkyConst.StarlightIndexOf(btnKoma_Selected.Finger).Now).Pside, btnMasu.Zahyo, toSyurui ) ); } //------------------------------------------------------------ // 「取った駒種類_巻戻し用」をクリアーします。 //------------------------------------------------------------ mainGui.Shape_PnlTaikyoku.MousePos_FoodKoma = null; }
/// <summary> /// 含まれるか判定。 /// </summary> /// <param name="masus"></param> /// <returns></returns> public static bool ExistsIn(IMoveHalf sl, SySet <SyElement> masus, SkyConst srcSky) { bool matched = false; foreach (SyElement masu in masus.Elements) { RO_Star koma = Util_Starlightable.AsKoma(sl.Now); Finger finger = Util_Sky_FingerQuery.InShogibanMasuNow(srcSky, koma.Pside, masu); if ( finger != Fingers.Error_1 && //2014-07-21 先後も見るように追記。 koma.Masu == masu ) { matched = true; break; } } return(matched); }
/// <summary> /// /// </summary> /// <param name="src"></param> /// <param name="finger1">指した駒、指されていた駒</param> /// <param name="light1"></param> /// <param name="finger2">取った駒、取っていた駒</param> /// <param name="light2"></param> /// <returns></returns> public static SkyConst NewInstance_OverwriteOrAdd_Light(Sky src, int temezumi_orMinus1, Finger finger1, IMoveHalf light1, Finger finger2, IMoveHalf light2) { SkyConst result = new SkyConst(src, false, temezumi_orMinus1, new Finger[] { finger1, finger2 }, new IMoveHalf[] { light1, light2 }, // 手得計算 PieceType.None, 0, Masu_Honshogi.Query_Basho(Masu_Honshogi.nError) ); return(result); }
/// <summary> /// 駒を1個 更新します。 /// /// (1)指したとき。戻したとき。 /// (2)駒の向き変更にも使われる。 /// </summary> /// <param name="src"></param> /// <param name="finger1"></param> /// <param name="light1"></param> /// <returns></returns> public static SkyConst NewInstance_OverwriteOrAdd_Light(Sky src, int temezumi_orMinus1, Finger finger1, IMoveHalf light1, // 手得計算 PieceType tedokuKeisan_komasyurui, int tedokukeisan_index, SyElement tedokukeisan_sasitamasu ) { SkyConst result = new SkyConst(src, false, temezumi_orMinus1, new Finger[] { finger1 }, new IMoveHalf[] { light1 }, // 手得計算 tedokuKeisan_komasyurui, tedokukeisan_index, tedokukeisan_sasitamasu ); return(result); }
/// <summary> /// 駒を動かします(1)。マウスボタンが押下されたとき。 /// /// 成る、成らない関連。 /// /// </summary> public static void Komamove1a_50Srv( out bool torareruKomaAri, out RO_Star koma_Food_after, IMoveHalf dst, Finger fig_btnTumandeiruKoma, RO_Star foodee_koma,//取られる対象の駒 Model_Manual model_Manual ) { Finger btnKoma_Food_Koma; // 取られることになる駒のボタン btnKoma_Food_Koma = Util_Sky_FingersQuery.InMasuNow(model_Manual.GuiSkyConst, foodee_koma.Masu).ToFirst(); if (Fingers.Error_1 == btnKoma_Food_Koma) { koma_Food_after = null; torareruKomaAri = false; btnKoma_Food_Koma = Fingers.Error_1; goto gt_EndBlock1; } else { //>>>>> 取る駒があったとき torareruKomaAri = true; } PieceType koma_Food_pre_Syurui = Util_Starlightable.AsKoma(model_Manual.GuiSkyConst.StarlightIndexOf(btnKoma_Food_Koma).Now).Komasyurui; // その駒は、駒置き場に移動させます。 SyElement akiMasu; switch (foodee_koma.Pside) { case Playerside.P2: akiMasu = Util_IttesasuRoutine.GetKomadaiKomabukuroSpace(Okiba.Gote_Komadai, model_Manual.GuiSkyConst); if (!Masu_Honshogi.IsErrorBasho(akiMasu)) { // 駒台に空きスペースがありました。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> koma_Food_after = new RO_Star( Playerside.P2, akiMasu, //駒台へ Util_Komasyurui14.NarazuCaseHandle(koma_Food_pre_Syurui) ); } else { // エラー: 駒台に空きスペースがありませんでした。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> koma_Food_after = new RO_Star( Playerside.P2, Util_Masu10.OkibaSujiDanToMasu( Okiba.Gote_Komadai, Util_Koma.CTRL_NOTHING_PROPERTY_SUJI, Util_Koma.CTRL_NOTHING_PROPERTY_DAN ), Util_Komasyurui14.NarazuCaseHandle(koma_Food_pre_Syurui) ); } break; case Playerside.P1: //thru default: akiMasu = Util_IttesasuRoutine.GetKomadaiKomabukuroSpace(Okiba.Sente_Komadai, model_Manual.GuiSkyConst); if (!Masu_Honshogi.IsErrorBasho(akiMasu)) { // 駒台に空きスペースがありました。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> koma_Food_after = new RO_Star( Playerside.P1, akiMasu, //駒台へ Util_Komasyurui14.NarazuCaseHandle(koma_Food_pre_Syurui) ); } else { // エラー: 駒台に空きスペースがありませんでした。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> koma_Food_after = new RO_Star( Playerside.P1, Util_Masu10.OkibaSujiDanToMasu( Okiba.Sente_Komadai, Util_Koma.CTRL_NOTHING_PROPERTY_SUJI, Util_Koma.CTRL_NOTHING_PROPERTY_DAN ), Util_Komasyurui14.NarazuCaseHandle(koma_Food_pre_Syurui) ); } break; } gt_EndBlock1: SkyConst sky2; if (btnKoma_Food_Koma != Fingers.Error_1) { //------------------------------ // 取られる駒があった場合 //------------------------------ sky2 = SkyConst.NewInstance_OverwriteOrAdd_Light( model_Manual.GuiSkyConst, -1, //そのまま // // 指した駒 // fig_btnTumandeiruKoma, dst, // // 取られた駒 // btnKoma_Food_Koma, new RO_Starlight( koma_Food_after ) ); } else { //------------------------------ // 取られる駒がなかった場合 //------------------------------ RO_Star movedKoma = Util_Starlightable.AsKoma(model_Manual.GuiSkyConst.StarlightIndexOf(fig_btnTumandeiruKoma).Now); sky2 = SkyConst.NewInstance_OverwriteOrAdd_Light( model_Manual.GuiSkyConst, -1, //そのまま // // 指した駒 // fig_btnTumandeiruKoma, dst, // // 手得計算 // movedKoma.Komasyurui, 0, movedKoma.Masu ); } model_Manual.SetGuiSky(sky2); // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // 棋譜は変更された。 // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ }
/// <summary> /// 駒を取る動き。 /// </summary> private static void Do61_KomaToru( IMoveHalf dst, SkyConst susunda_Sky_orNull_before,//駒を取られたとき、局面を変更します。 out Finger out_figFoodKoma, out RO_Star out_food_koma, out Playerside pside, out SyElement akiMasu ) { RO_Star dstKoma = Util_Starlightable.AsKoma(dst.Now); //---------- // 将棋盤上のその場所に駒はあるか //---------- out_figFoodKoma = Util_Sky_FingersQuery.InMasuNow(susunda_Sky_orNull_before, dstKoma.Masu).ToFirst();//盤上 if (Fingers.Error_1 != out_figFoodKoma) { //>>>>> 指した先に駒があったなら // // 取られる駒 // out_food_koma = Util_Starlightable.AsKoma(susunda_Sky_orNull_before.StarlightIndexOf(out_figFoodKoma).Now); #if DEBUG Logger.Trace($"駒取った={out_food_koma.Komasyurui}{Environment.NewLine}"); #endif // // 取られる駒は、駒置き場の空きマスに移動させます。 // Okiba okiba; switch (dstKoma.Pside) { case Playerside.P1: { okiba = Okiba.Sente_Komadai; pside = Playerside.P1; } break; case Playerside.P2: { okiba = Okiba.Gote_Komadai; pside = Playerside.P2; } break; default: { //>>>>> エラー: 先後がおかしいです。 throw new Exception($@"エラー: 先後がおかしいです。 dst.Pside={dstKoma.Pside}"); } } // // 駒台に駒を置く動き // { // 駒台の空きスペース akiMasu = Util_IttesasuRoutine.GetKomadaiKomabukuroSpace(okiba, susunda_Sky_orNull_before); if (Masu_Honshogi.IsErrorBasho(akiMasu)) { //>>>>> エラー: 駒台に空きスペースがありませんでした。 throw new Exception($@"エラー: 駒台に空きスペースがありませんでした。 駒台={Okiba.Gote_Komadai}"); } //>>>>> 駒台に空きスペースがありました。 } } else { out_food_koma = null; pside = Playerside.Empty; akiMasu = Masu_Honshogi.Query_Basho(Masu_Honshogi.nError); } }
/// <summary> /// ************************************************************************************************************************ /// 軌道上の駒たち /// ************************************************************************************************************************ /// </summary> /// <param name="km"></param> /// <returns></returns> public static void Fingers_EachSrcNow(out Fingers out_fingers, SySet <SyElement> srcList, SkyConst src_Sky, Playerside pside, IMoveHalf itaru) { out_fingers = new Fingers(); foreach (SyElement masu in srcList.Elements) { Finger finger = Util_Sky_FingerQuery.InShogibanMasuNow(src_Sky, pside, masu); if (Util_Finger.ForHonshogi(finger)) { // 指定の升に駒がありました。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> out_fingers.Add(finger); } } }
public void SetMouseStarlightOrNull2(IMoveHalf mouseDd) { this.mouseStarlightOrNull2 = mouseDd; }