Ejemplo n.º 1
0
        ///// <summary>
        ///// ************************************************************************************************************************
        ///// 先後の交代
        ///// ************************************************************************************************************************
        ///// </summary>
        ///// <param name="pside">先後</param>
        ///// <returns>ひっくりかえった先後</returns>
        //public static Playerside AlternatePside(Playerside pside)
        //{
        //    Playerside result;

        //    switch (pside)
        //    {
        //        case Playerside.P1:
        //            result = Playerside.P2;
        //            break;

        //        case Playerside.P2:
        //            result = Playerside.P1;
        //            break;

        //        default:
        //            result = pside;
        //            break;
        //    }

        //    return result;
        //}



        ///// <summary>
        ///// 変換『「指し手→局面」のコレクション』→『「駒、指し手」のペアのリスト』
        ///// </summary>
        //public static List<Couple<Finger,Masu>> MovebetuSky_ToKamList(
        //    SkyConst src_Sky_genzai,
        //    Dictionary<ShootingStarlightable, SkyBuffer> ss
        //    )
        //{
        //    List<Couple<Finger, Masu>> kmList = new List<Couple<Finger, Masu>>();

        //    // TODO:
        //    foreach(KeyValuePair<ShootingStarlightable,SkyBuffer> entry in ss)
        //    {
        //        RO_Star_Koma srcKoma = Util_Starlightable.AsKoma(entry.Key.LongTimeAgo);
        //        RO_Star_Koma dstKoma = Util_Starlightable.AsKoma(entry.Key.Now);


        //            Masu srcMasu = srcKoma.Masu;
        //            Masu dstMasu = dstKoma.Masu;

        //            Finger figKoma = Util_Sky.Fingers_AtMasuNow(src_Sky_genzai,srcMasu).ToFirst();

        //            kmList.Add(new Couple<Finger, Masu>(figKoma, dstMasu));
        //    }

        //    return kmList;
        //}



        /// <summary>
        /// 「成り」ができる動きなら真。
        /// </summary>
        /// <returns></returns>
        public static bool IsPromotionable(
            out bool isPromotionable,
            RO_Star srcKoma,
            RO_Star dstKoma
            )
        {
            bool successful = true;

            isPromotionable = false;

            if (Okiba.ShogiBan != Conv_SyElement.ToOkiba(srcKoma.Masu))
            {
                successful = false;
                goto gt_EndMethod;
            }

            if (Util_Komasyurui14.IsNari(srcKoma.Komasyurui))
            {
                // 既に成っている駒は、「成り」の指し手を追加すると重複エラーになります。
                // 成りになれない、で正常終了します。
                goto gt_EndMethod;
            }

            int srcDan;

            if (!Util_MasuNum.TryMasuToDan(srcKoma.Masu, out srcDan))
            {
                throw new Exception("段に変換失敗");
            }

            int dstDan;

            if (!Util_MasuNum.TryMasuToDan(dstKoma.Masu, out dstDan))
            {
                throw new Exception("段に変換失敗");
            }

            // 先手か、後手かで大きく処理を分けます。
            switch (dstKoma.Pside)
            {
            case Playerside.P1:
            {
                if (srcDan <= 3)
                {
                    // 3段目から上にあった駒が移動したのなら、成りの資格ありです。
                    isPromotionable = true;
                    goto gt_EndMethod;
                }

                if (dstDan <= 3)
                {
                    // 3段目から上に駒が移動したのなら、成りの資格ありです。
                    isPromotionable = true;
                    goto gt_EndMethod;
                }
            }
            break;

            case Playerside.P2:
            {
                if (7 <= srcDan)
                {
                    // 7段目から下にあった駒が移動したのなら、成りの資格ありです。
                    isPromotionable = true;
                    goto gt_EndMethod;
                }

                if (7 <= dstDan)
                {
                    // 7段目から下に駒が移動したのなら、成りの資格ありです。
                    isPromotionable = true;
                    goto gt_EndMethod;
                }
            }
            break;

            default: throw new Exception("未定義のプレイヤーサイドです。");
            }
gt_EndMethod:
            ;
            return(successful);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// CSAの指し手を、SFENの指し手に変換します。
        /// </summary>
        /// <param name="csa"></param>
        /// <param name="ittemae_Sky">1手前の局面。ルート局面などの理由で1手前の局面がない場合はヌル。</param>
        /// <returns></returns>
        public static string ToSfen(CsaKifuMove csa, SkyConst ittemae_Sky_orNull)
        {
            StringBuilder sb = new StringBuilder();

            int dstSuji;

            int.TryParse(csa.DestinationMasu[0].ToString(), out dstSuji);

            string dstDan = Conv_Suji.ToAlphabet(csa.DestinationMasu[1]);

            // 元位置の筋と段は、あとで必ず使う。(成りの判定)
            int srcSuji;

            int.TryParse(csa.SourceMasu[0].ToString(), out srcSuji);
            int srcDan;

            int.TryParse(csa.SourceMasu[1].ToString(), out srcDan);

            if ("00" == csa.SourceMasu)
            {
                // 打

                string syurui;
                switch (csa.Syurui)
                {
                case Word_Csa.FU_FU_____: syurui = SfenWord.P_PAWN__; break;

                case Word_Csa.KY_KYO____: syurui = SfenWord.L_LANCE_; break;

                case Word_Csa.KE_KEI____: syurui = SfenWord.N_KNIGHT; break;

                case Word_Csa.GI_GIN____: syurui = SfenWord.S_SILVER; break;

                case Word_Csa.KI_KIN____: syurui = SfenWord.G_GOLD__; break;

                case Word_Csa.KA_KAKU___: syurui = SfenWord.B_BISHOP; break;

                case Word_Csa.HI_HISYA__: syurui = SfenWord.R_ROOK__; break;

                case Word_Csa.OU_OU_____: syurui = SfenWord.K_KING__; break; //おまけ

                default: syurui = SfenWord.ERROR___; break;                  //エラー
                }

                sb.Append(syurui);
                sb.Append("*");
            }
            else
            {
                string srcDan_alphabet = Conv_Suji.ToAlphabet(csa.SourceMasu[1]);
                sb.Append(srcSuji);
                sb.Append(srcDan_alphabet);
            }



            sb.Append(dstSuji);
            sb.Append(dstDan);

            bool nari = false;

            switch (csa.Syurui)
            {
            case Word_Csa.TO_TOKIN__: nari = true; break;

            case Word_Csa.NY_NARIKYO: nari = true; break;

            case Word_Csa.NK_NARIKEI: nari = true; break;

            case Word_Csa.NG_NARIGIN: nari = true; break;

            case Word_Csa.UM_UMA____: nari = true; break;

            case Word_Csa.RY_RYU____: nari = true; break;
            }

            //
            // 「成り」をしたのかどうかを、調べます。
            //
            {
                if (null != ittemae_Sky_orNull && "00" != csa.SourceMasu)
                {
                    // ルート局面ではなく、かつ、打ではないとき。

                    //ittemae_Sky_orNull.Foreach_Starlights((Finger finger, Starlight light, ref bool toBreak) =>
                    //{
                    //    RO_Star_Koma koma = Util_Starlightable.AsKoma(light.Now);
                    //    Logger.Trace($"[{finger}] {koma.Masu.Word}" "{koma.Pside}" "{KomaSyurui14Array.Ichimoji[(int)koma.Syurui]}");
                    //});

                    SyElement srcMasu = Util_Masu10.OkibaSujiDanToMasu(Okiba.ShogiBan, srcSuji, srcDan);
                    RO_Star   srcKoma = Util_Sky_KomaQuery.InMasuNow(ittemae_Sky_orNull, srcMasu);
                    Debug.Assert(null != srcKoma, "元位置の駒を取得できなかった。1");

                    if (!Util_Komasyurui14.IsNari(srcKoma.Komasyurui) && nari)//移動元で「成り」でなかった駒が、移動後に「成駒」になっていた場合。
                    {
                        sb.Append("+");
                    }
                }
            }

            return(sb.ToString());
        }