Example #1
0
        /// <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;
        }
Example #2
0
        /// <summary>
        /// ************************************************************************************************************************
        /// 天上のすべての星の光
        /// ************************************************************************************************************************
        /// </summary>
        /// <param name="kifu"></param>
        /// <param name="okiba"></param>
        /// <returns></returns>
        public Fingers Fingers_All()
        {
            Fingers fingers = new Fingers();

            this.Foreach_Starlights((Finger finger, IMoveHalf light, ref bool toBreak) =>
            {
                fingers.Add(finger);
            });

            return(fingers);
        }
Example #3
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);
                }
            }
        }
Example #4
0
        /// <summary>
        /// 駒のハンドルを返します。
        /// </summary>
        /// <param name="pside"></param>
        /// <param name="hKomas"></param>
        /// <returns></returns>
        public static Fingers InPsideNow(SkyConst srcSky, Playerside pside)
        {
            Fingers fingers = new Fingers();

            srcSky.Foreach_Starlights((Finger finger, IMoveHalf ds, ref bool toBreak) =>
            {
                RO_Star koma = Util_Starlightable.AsKoma(ds.Now);

                if (pside == koma.Pside)
                {
                    fingers.Add(finger);
                }
            });

            return(fingers);
        }
Example #5
0
        /// <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);
        }
Example #6
0
        /// <summary>
        /// 駒のハンドル(*1)を返します。
        ///
        ///         *1…将棋の駒1つ1つに付けられた番号です。
        ///
        /// </summary>
        /// <param name="syurui"></param>
        /// <param name="hKomas"></param>
        /// <returns></returns>
        public static Fingers InKomasyuruiNow(SkyConst src_Sky, PieceType syurui)
        {
            Fingers figKomas = new Fingers();

            foreach (Finger figKoma in Finger_Honshogi.Items_KomaOnly)
            {
                RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now);


                if (Util_Komasyurui14.Matches(syurui, Util_Komahaiyaku184.Syurui(koma.Haiyaku)))
                {
                    figKomas.Add(figKoma);
                }
            }

            return(figKomas);
        }
Example #7
0
        /// <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);
        }
Example #8
0
        /// <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);
        }
Example #9
0
        /// <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);
        }
Example #10
0
        /// <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);
        }
Example #11
0
        /// <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);
        }
Example #12
0
        /// <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)持ち駒_食らう側
        }
Example #13
0
        /// <summary>
        /// 打ち歩詰め処理。
        ///
        /// TODO:打ち歩詰めチェック
        /// </summary>
        public static void Utifudume(
            SkyConst src_Sky,
            SySet <SyElement> masus_mikata_onBanjo, //打ち歩詰めチェック用
            SySet <SyElement> masus_aite_onBanjo,   //打ち歩詰めチェック用
            SySet <SyElement>[] aMasus              //駒種類別、置こうとする升
            )
        {
            // 攻め側
            Playerside pside_seme = src_Sky.KaisiPside;

            // 相手の王の位置
            RO_Star    king_aite;
            Finger     figKing_aite;
            Playerside pside_aite;

            switch (src_Sky.KaisiPside)
            {
            case Playerside.P1:
                pside_aite   = Playerside.P2;
                figKing_aite = Finger_Honshogi.GoteOh;
                king_aite    = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figKing_aite).Now);
                break;

            case Playerside.P2:
                pside_aite   = Playerside.P1;
                figKing_aite = Finger_Honshogi.SenteOh;
                king_aite    = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figKing_aite).Now);
                break;

            default: throw new Exception("エラー:打ち歩詰めチェック中。プレイヤー不明。");
            }

            // 相手の玉頭の升。
            SyElement masu_gyokutou = null;
            {
                SySet <SyElement> sySet = KomanoKidou.DstIppo_上(pside_aite, king_aite.Masu);
                foreach (SyElement element2 in sySet.Elements)//最初の1件を取る。
                {
                    masu_gyokutou = element2;
                    break;
                }

                if (null == masu_gyokutou)
                {
                    goto gt_EndUtifudume;
                }
            }

            // 相手の玉。
            Fingers fingers_aiteKing = new Fingers();

            fingers_aiteKing.Add(figKing_aite);

            // 相手の玉頭に、自分側の利きがあるかどうか。
            bool isKiki_mikata = false;

            {
                // 利き一覧
                Maps_OneAndOne <Finger, SySet <SyElement> > kikiMap = Query_FingersMasusSky.To_KomabetuKiki_OnBanjo(
                    fingers_aiteKing,
                    masus_mikata_onBanjo,
                    masus_aite_onBanjo,
                    src_Sky
                    );

                int gyokutouMasuNumber = Conv_SyElement.ToMasuNumber(masu_gyokutou);
                kikiMap.Foreach_Values((SySet <SyElement> values, ref bool toBreak) =>
                {
                    foreach (SyElement element in values.Elements)
                    {
                        int masuNumber = Conv_SyElement.ToMasuNumber(element);
                        if (masuNumber == gyokutouMasuNumber)
                        {
                            isKiki_mikata = true;
                            toBreak       = true;
                            break;
                        }
                    }
                });
            }

            if (!isKiki_mikata)
            {
                goto gt_EndUtifudume;
            }

            // 相手の玉頭に、利きのある相手側の駒の種類の一覧。
            List <PieceType>  ksList = new List <PieceType>();
            SySet <SyElement> aitegyokuKiki;

            {
                // 相手側の盤上の駒一覧。
                Fingers fingers_aiteKoma_Banjo = Util_Sky_FingersQuery.InOkibaPsideNow(src_Sky, Okiba.ShogiBan, pside_aite);

                // 利き一覧
                Maps_OneAndOne <Finger, SySet <SyElement> > kikiMap = Query_FingersMasusSky.To_KomabetuKiki_OnBanjo(
                    fingers_aiteKoma_Banjo,
                    masus_aite_onBanjo,   //相手の駒は、味方
                    masus_mikata_onBanjo, //味方の駒は、障害物。
                    src_Sky
                    );
                aitegyokuKiki = kikiMap.ElementAt(figKing_aite);

                int gyokutouMasuNumber = Conv_SyElement.ToMasuNumber(masu_gyokutou);
                kikiMap.Foreach_Entry((Finger figKoma, SySet <SyElement> values, ref bool toBreak) =>
                {
                    foreach (SyElement element in values.Elements)
                    {
                        int masuNumber = Conv_SyElement.ToMasuNumber(element);
                        if (masuNumber == gyokutouMasuNumber)
                        {
                            ksList.Add(Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now).Komasyurui);
                            break;
                        }
                    }
                });
            }

            // 「王様でしか取れない状態」ではなければ、スルー。
            if (ksList.Count != 1)
            {
                goto gt_EndUtifudume;
            }
            else if (ksList[0] != PieceType.K)
            {
                goto gt_EndUtifudume;
            }

            // 「王様に逃げ道がある」なら、スルー。
            MasubetuKikisu        masubetuKikisu_semeKoma = Util_SkyPside.ToMasubetuKikisu(src_Sky, pside_seme);
            Dictionary <int, int> nigerarenaiMap          = new Dictionary <int, int>();

            switch (src_Sky.KaisiPside)
            {
            case Playerside.P1: nigerarenaiMap = masubetuKikisu_semeKoma.Kikisu_AtMasu_2P; break;

            case Playerside.P2: nigerarenaiMap = masubetuKikisu_semeKoma.Kikisu_AtMasu_1P; break;

            default: throw new Exception("エラー:打ち歩詰めチェック中。プレイヤー不明。");
            }
            foreach (SyElement element in aitegyokuKiki.Elements)
            {
                // 攻撃側の利きが利いていない、空きマスがあるかどうか。
                int movableMasuNumber_king = Conv_SyElement.ToMasuNumber(element);

                if (nigerarenaiMap[movableMasuNumber_king] == 0)
                {
                    // 逃げ切った☆!
                    goto gt_EndUtifudume;
                }
            }

            //----------------------------------------
            // 打ち歩詰め確定
            //----------------------------------------

            // 1升(玉頭升)を、クリアーします。

            aMasus[(int)PieceType.P].Minus_Closed(
                masu_gyokutou, Util_SyElement_BinaryOperator.Dlgt_Equals_MasuNumber);


gt_EndUtifudume:
            ;
        }