예제 #1
0
        /// <summary>
        /// 動かす駒を移動先へ。
        /// </summary>
        /// <param name="figMovedKoma"></param>
        /// <param name="move">棋譜に記録するために「指す前/指した後」を含めた手。</param>
        /// <param name="obsoluted_kifu_mutable"></param>
        /// <param name="isMakimodosi"></param>
        private static void Do25_UgokasuKoma_IdoSakiHe(
            out Finger figMovedKoma,
            IMove move,
            Playerside kaisi_tebanside,
            SkyConst kaisi_Sky
            ,
            [CallerMemberName] string memberName    = "",
            [CallerFilePath] string sourceFilePath  = "",
            [CallerLineNumber] int sourceLineNumber = 0
            )
        {
            figMovedKoma = Fingers.Error_1;

            //------------------------------------------------------------
            // 選択  :  動かす駒
            //------------------------------------------------------------
            // [巻戻し]のとき
            //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

            // 打った駒も、指した駒も、結局は将棋盤の上にあるはず。

            RO_Star koma = Util_Starlightable.AsKoma(move.Now);

            // 動かす駒
            figMovedKoma = Util_Sky_FingerQuery.InShogibanMasuNow(
                kaisi_Sky,
                koma.Pside,
                koma.Masu//[巻戻し]のときは、先位置が 駒の居場所。
                );
            Debug.Assert(figMovedKoma != Fingers.Error_1, "駒を動かせなかった?5");
        }
예제 #2
0
        /// <summary>
        /// 動かす駒を移動先へ。
        /// </summary>
        /// <param name="figMovedKoma"></param>
        /// <param name="move">棋譜に記録するために「指す前/指した後」を含めた手。</param>
        /// <param name="obsoluted_kifu_mutable"></param>
        /// <param name="isMakimodosi"></param>
        private static void Do24_UgokasuKoma_IdoSakiHe(
            out Finger figMovedKoma,
            IMove move,
            Playerside kaisi_tebanside,
            SkyConst kaisi_Sky,
            string hint
            ,
            [CallerMemberName] string memberName    = "",
            [CallerFilePath] string sourceFilePath  = "",
            [CallerLineNumber] int sourceLineNumber = 0
            )
        {
            figMovedKoma = Fingers.Error_1;

            //------------------------------------------------------------
            // 選択  :  動かす駒
            //------------------------------------------------------------
            // 進むとき
            //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

            //Debug.Assert(null != move, "Sasu24_UgokasuKoma_IdoSakiHe: 指し手がヌルでした。");
            if (Util_Sky_BoolQuery.IsDaAction(move))// 多分、ここで move がヌルになるエラーがある☆
            {
                //----------
                // 駒台から “打”
                //----------
                RO_Star srcKoma = Util_Starlightable.AsKoma(move.LongTimeAgo);
                RO_Star dstKoma = Util_Starlightable.AsKoma(move.Now);

                // FIXME: 駒台の、どの駒を拾うか?
                figMovedKoma = Util_Sky_FingerQuery.InOkibaSyuruiNowIgnoreCase(
                    kaisi_Sky,
                    Conv_SyElement.ToOkiba(srcKoma.Masu),
                    Util_Komahaiyaku184.Syurui(dstKoma.Haiyaku)
                    );
                Debug.Assert(figMovedKoma != Fingers.Error_1, "駒を動かせなかった?14");
            }
            else
            {
                //----------
                // 将棋盤から
                //----------

                RO_Star srcKoma = Util_Starlightable.AsKoma(move.LongTimeAgo);
                Debug.Assert(!Masu_Honshogi.IsErrorBasho(srcKoma.Masu), "srcKoma.Masuエラー。15");
                RO_Star dstKoma = Util_Starlightable.AsKoma(move.Now);

                figMovedKoma = Util_Sky_FingerQuery.InShogibanMasuNow(
                    kaisi_Sky,
                    dstKoma.Pside,
                    Util_Masu10.OkibaSujiDanToMasu(
                        Conv_SyElement.ToOkiba(Masu_Honshogi.Masus_All[Conv_SyElement.ToMasuNumber(dstKoma.Masu)]),
                        Conv_SyElement.ToMasuNumber(srcKoma.Masu)
                        )
                    );
                Debug.Assert(figMovedKoma != Fingers.Error_1, "駒を動かせなかった?13");
            }
        }
예제 #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);
                }
            }
        }
예제 #4
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);
        }
예제 #5
0
        /// <summary>
        /// あれば、取られていた駒を取得
        /// </summary>
        /// <param name="move"></param>
        /// <param name="kaisi_Sky"></param>
        /// <param name="susunda_Sky_orNull"></param>
        /// <param name="out_figFoodKoma"></param>
        /// <param name="logTag"></param>
        private static void Do62_TorareteitaKoma_ifExists(
            IMove move,
            SkyConst kaisi_Sky,//巻き戻しのとき
            SkyConst susunda_Sky_orNull,
            out Finger out_figFoodKoma
            )
        {
            if (PieceType.None != (PieceType)move.FoodKomaSyurui)
            {
                //----------------------------------------
                // 取られていた駒があった場合
                //----------------------------------------
                RO_Star koma = Util_Starlightable.AsKoma(move.Now);

                // 駒台から、駒を検索します。
                Okiba okiba;
                if (Playerside.P2 == koma.Pside)
                {
                    okiba = Okiba.Gote_Komadai;
                }
                else
                {
                    okiba = Okiba.Sente_Komadai;
                }


                // 取った駒は、種類が同じなら、駒台のどの駒でも同じです。
                out_figFoodKoma = Util_Sky_FingerQuery.InOkibaSyuruiNowIgnoreCase(kaisi_Sky, okiba, (PieceType)move.FoodKomaSyurui);
            }
            else
            {
                //----------------------------------------
                // 駒は取られていなかった場合
                //----------------------------------------
                out_figFoodKoma = Fingers.Error_1;
            }
        }
예제 #6
0
        /// <summary>
        /// 符号1「7g7f」を元に、move を作ります。
        ///
        /// <[再生]、[コマ送り]で呼び出されます>
        /// </summary>
        /// <returns></returns>
        public static void ToMove(
            bool isHonshogi,
            string str1,    //123456789 か、 PLNSGKRB
            string str2,    //abcdefghi か、 *
            string str3,    //123456789
            string str4,    //abcdefghi
            string strNari, //+
            out IMove move,
            KifuTree kifu,
            string hint
            )
        {
            move = Util_Sky258A.NullObjectMove;

            Node <IMove, KyokumenWrapper> siteiNode = kifu.CurNode;
            SkyConst src_Sky = siteiNode.Value.KyokumenConst;
            //kifu.AssertPside(kifu.CurNode, $"str1={str1}");
            Playerside pside1 = src_Sky.KaisiPside;

#if DEBUG
            Debug.Assert(!Conv_MasuHandle.OnKomabukuro(Conv_SyElement.ToMasuNumber(((RO_Star)src_Sky.StarlightIndexOf((Finger)0).Now).Masu)), $"[{src_Sky.Temezumi}]手目、駒が駒袋にあった。");
#endif

            PieceType uttaSyurui; // 打った駒の種類

            int srcSuji = Util_Koma.CTRL_NOTHING_PROPERTY_SUJI;
            int srcDan  = Util_Koma.CTRL_NOTHING_PROPERTY_DAN;

            if ("*" == str2)
            {
                //>>>>>>>>>> 「打」でした。

                Conv_String268.SfenUttaSyurui(str1, out uttaSyurui);
            }
            else
            {
                //>>>>>>>>>> 指しました。
                uttaSyurui = PieceType.None;//打った駒はない☆

                //------------------------------
                // 1
                //------------------------------
                if (!int.TryParse(str1, out srcSuji))
                {
                }

                //------------------------------
                // 2
                //------------------------------
                srcDan = Conv_Alphabet.ToInt(str2);
            }

            //------------------------------
            // 3
            //------------------------------
            int suji;
            if (!int.TryParse(str3, out suji))
            {
            }

            //------------------------------
            // 4
            //------------------------------
            int dan;
            dan = Conv_Alphabet.ToInt(str4);



            Finger koma;

            if ("*" == str2)
            {
                //>>>>> 「打」でした。

                // 駒台から、打った種類の駒を取得
                koma = Util_Sky_FingerQuery.InOkibaSyuruiNowIgnoreCase(
                    siteiNode.Value.KyokumenConst,
                    Conv_Playerside.ToKomadai(pside1),//FIXME:
                    uttaSyurui);
                if (Fingers.Error_1 == koma)
                {
                    throw new Exception($"TuginoItte_Sfen#GetData_FromTextSub:駒台から種類[{uttaSyurui}]の駒を掴もうとしましたが、エラーでした。");
                }


                //// FIXME: 打のとき、srcSuji、srcDan が Int.Min
            }
            else
            {
                //>>>>> 打ではないとき
                SyElement masu1  = Util_Masu10.OkibaSujiDanToMasu(Okiba.ShogiBan, srcSuji, srcDan);
                Fingers   komas1 = Util_Sky_FingersQuery.InMasuNow(//これが空っぽになるときがある。
                    src_Sky, masu1
                    );
                koma = komas1.ToFirst();

                if (Fingers.Error_1 == koma)
                {
                    //
                    // エラーの理由:
                    // 0手目、平手局面を想定していたが、駒がすべて駒袋に入っているときなど
                    //

                    var sky2 = Util_Sky307.Json_1Sky(src_Sky, "エラー駒になったとき",
                                                     $"{hint}_SF解3",
                                                     src_Sky.Temezumi);

                    string text2;
                    if (masu1 is New_Basho)
                    {
                        text2 = $@"masu1.masuNumber=[{((New_Basho)masu1).MasuNumber}]
komas1.Count=[{komas1.Count}]";
                    }
                    else
                    {
                        text2 = "masu1.masuNumber=New_Basho型じゃない。";
                    }

                    StringBuilder sb = new StringBuilder();
                    throw new Exception($@"TuginoItte_Sfen#GetData_FromTextSub:SFEN解析中の失敗:SFENでは [{srcSuji}]筋、[{srcDan}]段 にある駒を掴めと指示がありましたが、
将棋盤データの[{Conv_Sy.Query_Word(masu1.Bitfield)}]マスには、(駒が全て駒袋に入っているのか)駒がありませんでした。
hint=[{hint}]
{text2}
isHonshogi=[{isHonshogi}]
str1=[{str1}]
str2=[{str2}]
str3=[{str3}]
str4=[{str4}]
strNari=[{strNari}]
src_Sky.Temezumi=[{src_Sky.Temezumi}]
局面 = sfen {Util_StartposExporter.ToSfenstring(new StartposExporterImpl(src_Sky), true)}
{sky2}
");
                }
            }


            PieceType dstSyurui;
            PieceType srcSyurui;
            Okiba     srcOkiba;
            SyElement srcMasu;


            if ("*" == str2)
            {
                //>>>>> 打った駒の場合

                dstSyurui = uttaSyurui;
                srcSyurui = uttaSyurui;
                switch (pside1)
                {
                case Playerside.P2:
                    srcOkiba = Okiba.Gote_Komadai;
                    break;

                case Playerside.P1:
                    srcOkiba = Okiba.Sente_Komadai;
                    break;

                default:
                    srcOkiba = Okiba.Empty;
                    break;
                }


                Finger srcKoma = Util_Sky_FingerQuery.InOkibaSyuruiNowIgnoreCase(siteiNode.Value.KyokumenConst, srcOkiba, srcSyurui);

                RO_Star dstKoma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(srcKoma).Now);

                srcMasu = dstKoma.Masu;
            }
            else
            {
                //>>>>> 盤上の駒を指した場合

                RO_Star dstKoma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(koma).Now);


                dstSyurui = Util_Komahaiyaku184.Syurui(dstKoma.Haiyaku);
                srcSyurui = dstSyurui; //駒は「元・種類」を記憶していませんので、「現・種類」を指定します。
                srcOkiba  = Okiba.ShogiBan;
                srcMasu   = Util_Masu10.OkibaSujiDanToMasu(srcOkiba, srcSuji, srcDan);
            }


            //------------------------------
            // 5
            //------------------------------
            if ("+" == strNari)
            {
                // 成りました
                dstSyurui = Util_Komasyurui14.NariCaseHandle[(int)dstSyurui];
            }


            //------------------------------
            // 結果
            //------------------------------
            // 棋譜
            move = new RO_Starbeam(
                //koma,//TODO:

                new RO_Star(
                    pside1,
                    srcMasu,//FIXME:升ハンドルにしたい
                    srcSyurui
                    ),

                new RO_Star(
                    pside1,
                    Util_Masu10.OkibaSujiDanToMasu(Okiba.ShogiBan, suji, dan),//符号は将棋盤の升目です。 FIXME:升ハンドルにしたい
                    dstSyurui
                    ),

                PieceType.None//符号からは、取った駒は分からない
                );
        }