Example #1
0
        /// <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);
        }
Example #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);
        }
Example #3
0
        /// <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);
        }
Example #4
0
        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);
        }
Example #5
0
 public RO_Star(RO_Star src)
 {
     this.startype   = BoardItem.Koma;
     this.pside      = src.Pside;
     this.masu       = src.Masu;
     this.komasyurui = src.Komasyurui;
 }
Example #6
0
        //------------------------------------------------------------
        #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);
        }
Example #7
0
 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);
 }
Example #8
0
 public RO_Star(Playerside pside, SyElement masu, PieceType syurui)
 {
     this.startype   = BoardItem.Koma;
     this.pside      = pside;
     this.masu       = masu;
     this.komasyurui = syurui;
 }
Example #9
0
        /// <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);
        }
Example #10
0
        /// <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);
        }
Example #11
0
        /// <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でもう進めてあるので、そのまま。
                                        ));
        }
Example #12
0
        /// <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));
        }
Example #13
0
        /// <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);
        }
Example #14
0
        /// <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
                       ));
        }
Example #15
0
 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;
 }
Example #16
0
        /// <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());
        }
Example #17
0
        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);
        }
Example #18
0
        public static int AsMasuNumber(SyElement syElm)
        {
            int result;

            if (syElm is Basho)
            {
                result = ((Basho)syElm).MasuNumber;
            }
            else
            {
                result = Masu_Honshogi.Error.MasuNumber;
            }

            return(result);
        }
Example #19
0
        //------------------------------------------------------------
        #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());
        }
Example #20
0
        /// <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);
        }
Example #21
0
        public static bool IsErrorBasho(SyElement masu)
        {
            bool result;

            if (Masu_Honshogi.nError == ((New_Basho)masu).MasuNumber)
            {
                result = true;
            }
            else
            {
                result = false;
            }

            return(result);
        }
Example #22
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 #23
0
        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);
        }
Example #24
0
        /// <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);
        }
Example #25
0
        /// <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);
        }
Example #26
0
 /// <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);
     }
 }
Example #27
0
        /// <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);
        }
Example #28
0
        /// <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);
        }
Example #29
0
        /// <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));
        }
Example #30
0
        /// <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);
        }