Ejemplo n.º 1
0
        /// <summary>
        /// 指定した駒全てについて、基本的な駒の動きを返します。(金は「前、ななめ前、横、下に進める」のような)
        /// </summary>
        /// <param name="srcSky"></param>
        /// <param name="fingers"></param>
        /// <returns></returns>
        public static Maps_OneAndOne <Finger, SySet <SyElement> > GetPotentialMoves(
            SkyConst srcSky,
            Fingers fingers
            )
        {
            if (fingers is null)
            {
                throw new ArgumentNullException(nameof(fingers));
            }

            Maps_OneAndOne <Finger, SySet <SyElement> > kiki_fMs = new Maps_OneAndOne <Finger, SySet <SyElement> >();// 「どの駒を、どこに進める」の一覧

            foreach (Finger finger in fingers.Items)
            {
                // ポテンシャル・ムーブを調べます。
                SySet <SyElement> move = Util_Sky_SyugoQuery.KomaKidou_Potential(finger, srcSky);//←ポテンシャル・ムーブ取得関数を選択。歩とか。

                if (!move.IsEmptySet())
                {
                    // 移動可能升があるなら
                    Util_Sky258A.AddOverwrite(kiki_fMs, finger, move);
                }
            }

            return(kiki_fMs);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 指定した持ち駒全てについて、基本的な駒の動きを返します。(金は「前、ななめ前、横、下に進める」のような)
        /// (ポテンシャル・ムーブ=障害物がなかったときの動き)
        ///
        /// 1局面につき、1回実行される。
        /// </summary>
        /// <param name="src_Sky"></param>
        /// <param name="fingers_sirabetaiMOTIkoma"></param>
        /// <param name="motiOkenaiMasus">持ち駒を置けないマス(味方駒、敵駒が置いてあるマス)</param>
        /// <returns></returns>
        public static List_OneAndMulti <Finger, SySet <SyElement> > Translate_Motikoma_ToMove(
            SkyConst src_Sky,
            Fingers fingers_sirabetaiMOTIkoma,
            SySet <SyElement> masus_mikata_onBanjo, //打ち歩詰めチェック用
            SySet <SyElement> masus_aite_onBanjo,   //打ち歩詰めチェック用
            SySet <SyElement> motiOkenaiMasus
            )
        {
            // 駒種類別、置こうとする升
            SySet <SyElement>[] aMasus = new SySet <SyElement> [Array_Komasyurui.Items_AllElements.Length];
            // 駒種類別、置こうとする駒(持駒の代表)
            RO_Star[] aDaihyo = new RO_Star[Array_Komasyurui.Items_AllElements.Length];
            // 駒種類別、置こうとする駒番号
            Finger[] aFigKoma = new Finger[Array_Komasyurui.Items_AllElements.Length];


            Finger[] daihyoArray;// 持駒。駒の種類代表1個
            Util_Fingers_KomasyuruiQuery.Translate_Fingers_ToKomasyuruiBETUFirst(
                src_Sky,
                fingers_sirabetaiMOTIkoma,
                out daihyoArray
                );
            foreach (Finger figDaihyo in daihyoArray)
            {
                if (Fingers.Error_1 != figDaihyo)
                {
                    RO_Star daihyo = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figDaihyo).Now);
#if DEBUG
                    Debug.Assert(daihyo != null, "持ち駒の代表がヌル");
#endif
                    // 駒種類別、置こうとする駒
                    aDaihyo[(int)daihyo.Komasyurui] = daihyo;
                    // 駒種類別、置こうとする升
                    aMasus[(int)daihyo.Komasyurui] = Util_Sky_SyugoQuery.KomaKidou_Potential(figDaihyo, src_Sky);
                    // 駒種類別、置こうとする駒番号
                    aFigKoma[(int)daihyo.Komasyurui] = figDaihyo;
                }
            }


            if (aDaihyo[(int)PieceType.P] != null)// 攻め手が、歩を持っているなら
            {
                //----------------------------------------
                // 二歩チェック
                //----------------------------------------
                //
                // 打てない筋の升を除外します。
                //
#if DEBUG
                //if (null != errH_orNull)
                //{
                //    Logger.Trace("----------------------------------------");
                //    Logger.Trace($"歩を置きたかった升={Util_SySet.Dump_Elements(aMasus[(int)Komasyurui14.H01_Fu_____])}");
                //    Logger.Trace("----------------------------------------");
                //    Logger.Trace("歩の置けない筋チェック(二歩チェック)開始");
                //}
#endif
                // 将棋盤上の自歩一覧。
                Fingers banjoJiFus = Util_Sky_FingersQuery.InOkibaPsideKomasyuruiNow(
                    src_Sky,                         //指定局面
                    Okiba.ShogiBan,                  //将棋盤上の
                    aDaihyo[(int)PieceType.P].Pside, //持駒を持っているプレイヤー側の
                    PieceType.P                      //歩
                    );

#if DEBUG
                //if (null != errH_orNull)
                //{
                //    Logger.Trace($"banjoJiFus.Count=[{banjoJiFus.Count}]");
                //    foreach (Finger figKoma in banjoJiFus.Items)
                //    {
                //        Logger.Trace($"figKoma=[{(int)figKoma}]");
                //    }
                //    Logger.Trace("----------------------------------------");
                //}
#endif

                // 筋別、歩のあるなしチェック
                bool[] existsFu_sujibetu = new bool[10];
                foreach (Finger figBanjoJiFu in banjoJiFus.Items)
                {
                    RO_Star banjoJiFu = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figBanjoJiFu).Now);
                    int     suji;//1~9
                    Util_MasuNum.TryMasuToSuji(banjoJiFu.Masu, out suji);
                    existsFu_sujibetu[suji] = true;
                }

                // 9筋 確認します。
                for (int suji = 1; suji < 10; suji++)
                {
                    if (existsFu_sujibetu[suji])
                    {
                        // 二歩になる筋番号の発見☆
#if DEBUG
                        //Logger.Trace($"二歩チェック: {suji}筋は二歩。");
#endif

                        // 筋一列を、クリアーします。

                        // 駒種類別、置こうとする升
                        aMasus[(int)PieceType.P] = aMasus[(int)PieceType.P].Minus_Closed(
                            Masu_Honshogi.BAN_SUJIS[suji], Util_SyElement_BinaryOperator.Dlgt_Equals_MasuNumber);
                    }
                }
#if DEBUG
                //if (null != errH_orNull)
                //{
                //    Logger.Trace("歩の置けない筋チェック(二歩チェック)終了");
                //    Logger.Trace("----------------------------------------");
                //    Logger.Trace($"歩の置ける升={Util_SySet.Dump_Elements(aMasus[(int)Komasyurui14.H01_Fu_____])}");
                //    Logger.Trace("----------------------------------------");
                //}
#endif

                //----------------------------------------
                // 打ち歩詰めチェック
                //----------------------------------------
                if (false)
                {
                    Util_Utifudume.Utifudume(
                        src_Sky,
                        masus_mikata_onBanjo, //打ち歩詰めチェック用
                        masus_aite_onBanjo,   //打ち歩詰めチェック用
                        aMasus                //駒種類別、置こうとする升
                        );
                }
            }



            //----------------------------------------
            // 集計
            //----------------------------------------
            // 「どの持ち駒を」「どこに置ける」のコレクション。
            List_OneAndMulti <Finger, SySet <SyElement> > result = new List_OneAndMulti <Finger, SySet <SyElement> >();
            foreach (PieceType ks in Array_Komasyurui.MotiKoma7Syurui)
            {
                // 置こうとする駒があれば
                if (null != aDaihyo[(int)ks])
                {
                    // 置けない升を引きます。
                    aMasus[(int)ks] = aMasus[(int)ks].Minus_Closed(
                        motiOkenaiMasus, Util_SyElement_BinaryOperator.Dlgt_Equals_MasuNumber);

                    if (!aMasus[(int)ks].IsEmptySet())
                    {
                        // 置ける升があれば登録
                        result.AddNew(
                            aFigKoma[(int)ks], //置こうとする持駒番号
                            aMasus[(int)ks]    //置ける升
                            );
                    }
                }
            }
            return(result);
        }