示例#1
0
        /// <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);
        }
示例#2
0
        /// <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);
        }
示例#3
0
        /// <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);
        }
示例#4
0
        /// <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);
        }
示例#5
0
        /// <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);
        }
示例#6
0
 /// <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;
     }
 }
示例#7
0
        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);
        }
示例#8
0
        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;
        }
示例#9
0
        /// <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);
        }
示例#10
0
        /// <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);
        }
示例#11
0
        /// <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);
        }
示例#12
0
        /// <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);
            // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
            // 棋譜は変更された。
            // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
        }
示例#13
0
        /// <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);
            }
        }
示例#14
0
        /// <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);
                }
            }
        }
示例#15
0
 public void SetMouseStarlightOrNull2(IMoveHalf mouseDd)
 {
     this.mouseStarlightOrNull2 = mouseDd;
 }