예제 #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 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");
            }
        }
예제 #2
0
        /// <summary>
        /// CSA符号→先位置
        /// </summary>
        /// <param name="csa"></param>
        /// <returns></returns>
        public static SyElement ToDstMasu(CsaKifuMove csa)
        {
            int suji;
            int dan;

            int.TryParse(csa.DestinationMasu[0].ToString(), out suji);
            int.TryParse(csa.DestinationMasu[1].ToString(), out dan);

            return(Util_Masu10.OkibaSujiDanToMasu(Okiba.ShogiBan, suji, dan));
        }
예제 #3
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.TryMasuToSuji(masu, out suji);
            Util_MasuNum.TryMasuToDan(masu, out dan);

            return(Util_Masu10.OkibaSujiDanToMasu(
                       okiba,
                       suji + offsetSuji,
                       dan + offsetDan
                       ));
        }
예제 #4
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);
        }
예제 #5
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.TryMasuToSuji(masu, out suji);
            Util_MasuNum.TryMasuToDan(masu, out dan);

            return(Util_Masu10.OkibaSujiDanToMasu(
                       okiba,
                       suji + offsetSuji,
                       dan + offsetDan));
        }
예제 #6
0
        /// <summary>
        /// ロードした内容を確認するときに使います。
        /// </summary>
        /// <returns></returns>
        public static string LogString()
        {
            StringBuilder sb = new StringBuilder();

            foreach (KeyValuePair <Komahaiyaku185, Dictionary <int, Komahaiyaku185> > entry1 in Array_ForcePromotion.HaiyakuMap)
            {
                sb.Append(entry1.Key);
                sb.Append(": ");

                foreach (KeyValuePair <int, Komahaiyaku185> entry2 in entry1.Value)
                {
                    sb.Append(
                        Util_Masu10.ToSujiKanji(Masu_Honshogi.Query_Basho(entry2.Key))
                        );
                    sb.Append(".");
                    sb.Append(entry2.Value);
                    sb.Append(" ");
                }

                sb.AppendLine();
            }

            return(sb.ToString());
        }
예제 #7
0
        /// <summary>
        /// ロードした内容を確認するときに使います。
        /// </summary>
        /// <returns></returns>
        public static string LogHtml()
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine("<html>");
            sb.AppendLine("<head>");
            sb.AppendLine("    <title>強制転成表</title>");
            sb.AppendLine("    <style type=\"text/css\">");
            sb.AppendLine("            /* 将棋盤 */");
            sb.AppendLine("            table{");
            sb.AppendLine("                border-collapse:collapse;");
            sb.AppendLine("                border:2px #2b2b2b solid;");
            sb.AppendLine("            }");
            sb.AppendLine("            td{");
            sb.AppendLine("                border:1px #2b2b2b solid;");
            sb.AppendLine("                background-color:#ffcc55;");
            sb.AppendLine("                width:48px; height:48px;");
            sb.AppendLine("            }");
            sb.AppendLine("    </style>");
            sb.AppendLine("</head>");
            sb.AppendLine("<body>");

            foreach (KeyValuePair <Komahaiyaku185, Dictionary <int, Komahaiyaku185> > entry1 in Array_ForcePromotion.HaiyakuMap)
            {
                sb.Append("<h1>");
                sb.Append(entry1.Key);
                sb.AppendLine("</h1>");


                sb.Append("<table>");
                // 9一~1一、9二~1二、…9九~1九の順だぜ☆
                for (int dan = 1; dan <= 9; dan++)
                {
                    sb.AppendLine("<tr>");

                    sb.Append("    ");
                    for (int suji = 9; suji >= 1; suji--)
                    {
                        SyElement masu = Util_Masu10.OkibaSujiDanToMasu(Okiba.ShogiBan, suji, dan);

                        sb.Append("<td>");

                        if (entry1.Value.ContainsKey(Conv_SyElement.ToMasuNumber(masu)))
                        {
                            // 強制転成が起こるマスなら、画像を出します。


                            Komahaiyaku185 kh184         = entry1.Value[Conv_SyElement.ToMasuNumber(masu)];
                            int            haiyakuHandle = (int)kh184;


                            sb.Append("<img src=\"../Data/img/train");


                            if (haiyakuHandle < 10)
                            {
                                sb.Append("00");
                            }
                            else if (haiyakuHandle < 100)
                            {
                                sb.Append("0");
                            }
                            sb.Append(haiyakuHandle);
                            sb.Append(".png\" />");
                        }

                        sb.Append("</td>");
                    }
                    sb.AppendLine();
                    sb.AppendLine("</tr>");
                }
                sb.AppendLine("</table>");
            }


            sb.AppendLine("</body>");
            sb.AppendLine("</html>");
            return(sb.ToString());
        }
예제 #8
0
        /// <summary>
        /// 表形式の局面データを出力します。SFENとの親和性高め。
        /// </summary>
        /// <returns></returns>
        public static ISfenPosition1 ToRO_Kyokumen1(KifuNode kifuNode)
        {
            ISfenPosition1 ro_Kyokumen1 = new SfenPosition1Impl();

            SkyConst src_Sky = kifuNode.Value.KyokumenConst;

            // 将棋盤
            for (int suji = 1; suji < 10; suji++)
            {
                for (int dan = 1; dan < 10; dan++)
                {
                    Finger koma0 = Util_Sky_FingersQuery.InMasuNow(
                        src_Sky, Util_Masu10.OkibaSujiDanToMasu(Okiba.ShogiBan, suji, dan)
                        ).ToFirst();

                    if (Fingers.Error_1 != koma0)
                    {
                        RO_Star koma1 = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(koma0).Now);

                        ro_Kyokumen1.Ban[suji, dan] = Util_Komasyurui14.SfenText(
                            Util_Komahaiyaku184.Syurui(koma1.Haiyaku),
                            koma1.Pside
                            );
                    }
                }
            }

            // 持ち駒
            int mK = 0;
            int mR = 0;
            int mB = 0;
            int mG = 0;
            int mS = 0;
            int mN = 0;
            int mL = 0;
            int mP = 0;

            int mk = 0;
            int mr = 0;
            int mb = 0;
            int mg = 0;
            int ms = 0;
            int mn = 0;
            int ml = 0;
            int mp = 0;

            Util_Sky_CountQuery.CountMoti(
                src_Sky,
                out mK,
                out mR,
                out mB,
                out mG,
                out mS,
                out mN,
                out mL,
                out mP,

                out mk,
                out mr,
                out mb,
                out mg,
                out ms,
                out mn,
                out ml,
                out mp
                );

            int player;

            player = 1;
            ro_Kyokumen1.Moti[player, 0] = mR;
            ro_Kyokumen1.Moti[player, 1] = mB;
            ro_Kyokumen1.Moti[player, 2] = mG;
            ro_Kyokumen1.Moti[player, 3] = mS;
            ro_Kyokumen1.Moti[player, 4] = mN;
            ro_Kyokumen1.Moti[player, 5] = mL;
            ro_Kyokumen1.Moti[player, 6] = mP;

            player = 2;
            ro_Kyokumen1.Moti[player, 0] = mr;
            ro_Kyokumen1.Moti[player, 1] = mb;
            ro_Kyokumen1.Moti[player, 2] = mg;
            ro_Kyokumen1.Moti[player, 3] = ms;
            ro_Kyokumen1.Moti[player, 4] = mn;
            ro_Kyokumen1.Moti[player, 5] = ml;
            ro_Kyokumen1.Moti[player, 6] = mp;

            // 手目済み
            ro_Kyokumen1.Temezumi = src_Sky.Temezumi;

            return(ro_Kyokumen1);
        }
예제 #9
0
        /// <summary>
        /// 局面データから、SFEN文字列を作ります。
        /// </summary>
        /// <param name="pside"></param>
        /// <returns></returns>
        public static string ToSfenstring(KifuNode kifuNode, Playerside pside)
        {
            SkyConst src_Sky = kifuNode.Value.KyokumenConst;

            StringBuilder sb = new StringBuilder();

            sb.Append("sfen ");

            for (int dan = 1; dan <= 9; dan++)
            {
                int spaceCount = 0;

                for (int suji = 9; suji >= 1; suji--)
                {
                    // 将棋盤上のどこかにある駒?
                    Finger koma0 = Util_Sky_FingersQuery.InMasuNow(
                        src_Sky, Util_Masu10.OkibaSujiDanToMasu(Okiba.ShogiBan, suji, dan)
                        ).ToFirst();

                    if (Fingers.Error_1 != koma0)
                    {
                        if (0 < spaceCount)
                        {
                            sb.Append(spaceCount);
                            spaceCount = 0;
                        }


                        RO_Star koma1 = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(koma0).Now);



                        sb.Append(Util_Komasyurui14.SfenText(
                                      Util_Komahaiyaku184.Syurui(koma1.Haiyaku),
                                      koma1.Pside
                                      ));
                    }
                    else
                    {
                        spaceCount++;
                    }
                }

                if (0 < spaceCount)
                {
                    sb.Append(spaceCount);
                    spaceCount = 0;
                }

                if (dan != 9)
                {
                    sb.Append("/");
                }
            }

            sb.Append(" ");

            //------------------------------------------------------------
            // 先後
            //------------------------------------------------------------
            switch (pside)
            {
            case Playerside.P2:
                sb.Append("w");
                break;

            default:
                sb.Append("b");
                break;
            }

            sb.Append(" ");

            //------------------------------------------------------------
            // 持ち駒
            //------------------------------------------------------------
            {
                int mK = 0;
                int mR = 0;
                int mB = 0;
                int mG = 0;
                int mS = 0;
                int mN = 0;
                int mL = 0;
                int mP = 0;

                int mk = 0;
                int mr = 0;
                int mb = 0;
                int mg = 0;
                int ms = 0;
                int mn = 0;
                int ml = 0;
                int mp = 0;
                Util_Sky_CountQuery.CountMoti(
                    src_Sky,
                    out mK,
                    out mR,
                    out mB,
                    out mG,
                    out mS,
                    out mN,
                    out mL,
                    out mP,

                    out mk,
                    out mr,
                    out mb,
                    out mg,
                    out ms,
                    out mn,
                    out ml,
                    out mp
                    );



                if (0 == mK + mR + mB + mG + mS + mN + mL + mP + mk + mr + mb + mg + ms + mn + ml + mp)
                {
                    sb.Append("-");
                }
                else
                {
                    if (0 < mK)
                    {
                        if (1 < mK)
                        {
                            sb.Append(mK);
                        }
                        sb.Append("K");
                    }

                    if (0 < mR)
                    {
                        if (1 < mR)
                        {
                            sb.Append(mR);
                        }
                        sb.Append("R");
                    }

                    if (0 < mB)
                    {
                        if (1 < mB)
                        {
                            sb.Append(mB);
                        }
                        sb.Append("B");
                    }

                    if (0 < mG)
                    {
                        if (1 < mG)
                        {
                            sb.Append(mG);
                        }
                        sb.Append("G");
                    }

                    if (0 < mS)
                    {
                        if (1 < mS)
                        {
                            sb.Append(mS);
                        }
                        sb.Append("S");
                    }

                    if (0 < mN)
                    {
                        if (1 < mN)
                        {
                            sb.Append(mN);
                        }
                        sb.Append("N");
                    }

                    if (0 < mL)
                    {
                        if (1 < mL)
                        {
                            sb.Append(mL);
                        }
                        sb.Append("L");
                    }

                    if (0 < mP)
                    {
                        if (1 < mP)
                        {
                            sb.Append(mP);
                        }
                        sb.Append("P");
                    }

                    if (0 < mk)
                    {
                        if (1 < mk)
                        {
                            sb.Append(mk);
                        }
                        sb.Append("k");
                    }

                    if (0 < mr)
                    {
                        if (1 < mr)
                        {
                            sb.Append(mr);
                        }
                        sb.Append("r");
                    }

                    if (0 < mb)
                    {
                        if (1 < mb)
                        {
                            sb.Append(mb);
                        }
                        sb.Append("b");
                    }

                    if (0 < mg)
                    {
                        if (1 < mg)
                        {
                            sb.Append(mg);
                        }
                        sb.Append("g");
                    }

                    if (0 < ms)
                    {
                        if (1 < ms)
                        {
                            sb.Append(ms);
                        }
                        sb.Append("s");
                    }

                    if (0 < mn)
                    {
                        if (1 < mn)
                        {
                            sb.Append(mn);
                        }
                        sb.Append("n");
                    }

                    if (0 < ml)
                    {
                        if (1 < ml)
                        {
                            sb.Append(ml);
                        }
                        sb.Append("l");
                    }

                    if (0 < mp)
                    {
                        if (1 < mp)
                        {
                            sb.Append(mp);
                        }
                        sb.Append("p");
                    }
                }
            }

            // 手目
            sb.Append(" 1");

            return(sb.ToString());
        }
예제 #10
0
        /// <summary>
        /// 特殊な用途。
        /// </summary>
        /// <param name="collection"></param>
        /// <returns></returns>
        public static string Dump(List_OneAndMulti <T1, T2> collection, SkyConst skyConst)
        {
            int count = 0;

            StringBuilder sb = new StringBuilder();

            {
                foreach (Couple <T1, T2> item in collection.Items)
                {
                    if (item.A is Finger && item.B is SySet <SyElement> )
                    {
                        foreach (SyElement syElement in ((SySet <SyElement>)item.B).Elements)
                        {
                            sb.AppendLine($"({count}) a=[{Util_Komasyurui14.Ichimoji[(int)Util_Starlightable.AsKoma(skyConst.StarlightIndexOf(item.A as Finger).Now).Komasyurui]}] b=[{Util_Masu10.ToSujiKanji(syElement)}]");
                            count++;
                        }
                    }
                    else
                    {
                        sb.AppendLine($"({count}) a=[{item.A.ToString()}] b=[{item.B.ToString()}]");
                        count++;
                    }
                }
            }

            return(sb.ToString());
        }
예제 #11
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="syurui"></param>
        /// <param name="masu_shogiban">0~80</param>
        /// <returns></returns>
        public static Komahaiyaku185 ToHaiyaku(PieceType syurui, SyElement masu_shogiban, Playerside pside)
        {
            Komahaiyaku185 result;

            int masuHandle = Conv_SyElement.ToMasuNumber(Util_Masu10.BothSenteView(masu_shogiban, pside));

            if (Conv_MasuHandle.OnShogiban(masuHandle))
            {
                result = Data_KomahaiyakuTransition.Map[syurui][(int)masuHandle];
            }
            else if (Conv_MasuHandle.OnKomadai(masuHandle))
            {
                switch (syurui)
                {
                case PieceType.P: result = Komahaiyaku185.n164_歩打; break;

                case PieceType.L: result = Komahaiyaku185.n165_香打; break;

                case PieceType.N: result = Komahaiyaku185.n166_桂打; break;

                case PieceType.S: result = Komahaiyaku185.n167_銀打; break;

                case PieceType.G: result = Komahaiyaku185.n168_金打; break;

                case PieceType.K: result = Komahaiyaku185.n169_王打; break;

                case PieceType.R: result = Komahaiyaku185.n170_飛打; break;

                case PieceType.B: result = Komahaiyaku185.n171_角打; break;

                case PieceType.PR: result = Komahaiyaku185.n170_飛打; break;

                case PieceType.PB: result = Komahaiyaku185.n171_角打; break;

                case PieceType.PP: result = Komahaiyaku185.n164_歩打; break;

                case PieceType.PL: result = Komahaiyaku185.n165_香打; break;

                case PieceType.PN: result = Komahaiyaku185.n166_桂打; break;

                case PieceType.PS: result = Komahaiyaku185.n167_銀打; break;

                default: result = Komahaiyaku185.n000_未設定; break;
                }
            }
            else if (Conv_MasuHandle.OnKomabukuro(masuHandle))
            {
                switch (syurui)
                {
                case PieceType.P: result = Komahaiyaku185.n172_駒袋歩; break;

                case PieceType.L: result = Komahaiyaku185.n173_駒袋香; break;

                case PieceType.N: result = Komahaiyaku185.n174_駒袋桂; break;

                case PieceType.S: result = Komahaiyaku185.n175_駒袋銀; break;

                case PieceType.G: result = Komahaiyaku185.n176_駒袋金; break;

                case PieceType.K: result = Komahaiyaku185.n177_駒袋王; break;

                case PieceType.R: result = Komahaiyaku185.n178_駒袋飛; break;

                case PieceType.B: result = Komahaiyaku185.n179_駒袋角; break;

                case PieceType.PR: result = Komahaiyaku185.n180_駒袋竜; break;

                case PieceType.PB: result = Komahaiyaku185.n181_駒袋馬; break;

                case PieceType.PP: result = Komahaiyaku185.n182_駒袋と金; break;

                case PieceType.PL: result = Komahaiyaku185.n183_駒袋杏; break;

                case PieceType.PN: result = Komahaiyaku185.n184_駒袋圭; break;

                case PieceType.PS: result = Komahaiyaku185.n185_駒袋全; break;

                default: result = Komahaiyaku185.n000_未設定; break;
                }
            }
            else
            {
                result = Komahaiyaku185.n000_未設定;
            }

            return(result);
        }
예제 #12
0
        /// <summary>
        /// ロードした内容を確認するときに使います。
        /// </summary>
        /// <returns></returns>
        public static string LogHtml()
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine("<html>");
            sb.AppendLine("<head>");
            sb.AppendLine("    <title>道表</title>");
            sb.AppendLine("    <style type=\"text/css\">");
            sb.AppendLine("            /* 将棋盤 */");
            sb.AppendLine("            table{");
            sb.AppendLine("                border-collapse:collapse;");
            sb.AppendLine("                border:2px #2b2b2b solid;");
            sb.AppendLine("            }");
            sb.AppendLine("            td{");
            sb.AppendLine("                border:1px #2b2b2b solid;");
            sb.AppendLine("                background-color:#ffcc55;");
            sb.AppendLine("                width:48px; height:48px;");
            sb.AppendLine("            }");
            sb.AppendLine("    </style>");
            sb.AppendLine("</head>");
            sb.AppendLine("<body>");


            foreach (SySet <SyElement> michi in Michi187Array.Items)
            {
                sb.Append("<h1>「");
                sb.Append(michi.Word);
                sb.AppendLine("」</h1>");

                // そのマスに振る、順番の番号。「M 味方陣」「H 平野部」「T 敵陣」で分けてあります。
                Dictionary <SyElement, int> orderOnBanM = new Dictionary <SyElement, int>();
                Dictionary <SyElement, int> orderOnBanH = new Dictionary <SyElement, int>();
                Dictionary <SyElement, int> orderOnBanT = new Dictionary <SyElement, int>();

                int order = 1;
                foreach (SySet <SyElement> superset in michi.Supersets)
                {
                    switch (superset.Word)
                    {
                    case "味方陣":
                    {
                        foreach (SyElement masu in superset.Elements)
                        {
                            orderOnBanM.Add(masu, order);
                            order++;
                        }
                    }
                    break;

                    case "平野部":
                    {
                        foreach (SyElement masu in superset.Elements)
                        {
                            orderOnBanH.Add(masu, order);
                            order++;
                        }
                    }
                    break;

                    case "敵陣":
                    {
                        foreach (SyElement masu in superset.Elements)
                        {
                            orderOnBanT.Add(masu, order);
                            order++;
                        }
                    }
                    break;

                    default:
                        throw new Exception($"未定義の集合名です。[{superset.Word}]");
                    }
                }



                sb.Append("<table>");
                // 9一~1一、9二~1二、…9九~1九の順だぜ☆
                for (int dan = 1; dan <= 9; dan++)
                {
                    sb.AppendLine("<tr>");

                    sb.Append("    ");
                    for (int suji = 9; suji >= 1; suji--)
                    {
                        SyElement masu = Util_Masu10.OkibaSujiDanToMasu(Okiba.ShogiBan, suji, dan);

                        if (orderOnBanM.ContainsKey(masu))
                        {
                            // 順番が記されている味方陣マス
                            sb.Append("<td style=\"text-align:center; background-color:blue;\">");
                            sb.Append(orderOnBanM[masu]);
                            sb.Append("</td>");
                        }
                        else if (orderOnBanH.ContainsKey(masu))
                        {
                            // 順番が記されている平野部マス
                            sb.Append("<td style=\"text-align:center; background-color:green;\">");
                            sb.Append(orderOnBanH[masu]);
                            sb.Append("</td>");
                        }
                        else if (orderOnBanT.ContainsKey(masu))
                        {
                            // 順番が記されている敵陣マス
                            sb.Append("<td style=\"text-align:center; background-color:red;\">");
                            sb.Append(orderOnBanT[masu]);
                            sb.Append("</td>");
                        }
                        else
                        {
                            // 特に指定のないマス。
                            sb.Append("<td></td>");
                        }
                    }
                    sb.AppendLine();
                    sb.AppendLine("</tr>");
                }
                sb.AppendLine("</table>");
            }


            sb.AppendLine("</body>");
            sb.AppendLine("</html>");
            return(sb.ToString());
        }
예제 #13
0
        /// <summary>
        /// 次の1手データを作ります(*1)
        ///
        ///         *1…符号1「▲68銀上」を元に、「7968」を作ります。
        ///
        /// <[再生]、[コマ送り]で呼び出されます>
        /// </summary>
        /// <returns></returns>
        public static void ToMove(
            string strPside,      //▲△
            string strSuji,       //123…9、123…9、一二三…九
            string strDan,        //123…9、123…9、一二三…九
            string strDou,        // “同”
            string strSrcSyurui,  //(歩|香|桂|…
            string strMigiHidari, // 右|左…
            string strAgaruHiku,  // 上|引
            string strNariNarazu, //成|不成
            string strDaHyoji,    //打
            out IMove move,
            KifuTree kifu
            )
        {
            Node <IMove, KyokumenWrapper> siteiNode = kifu.CurNode;
            SkyConst src_Sky = siteiNode.Value.KyokumenConst;

            //------------------------------
            // 符号確定
            //------------------------------
            MigiHidari migiHidari = Conv_String268.Str_ToMigiHidari(strMigiHidari);
            AgaruHiku  agaruHiku  = Conv_String268.Str_ToAgaruHiku(strAgaruHiku); // 上|引
            NariNarazu nariNarazu = Conv_String268.Nari_ToBool(strNariNarazu);    //成
            DaHyoji    daHyoji    = Conv_String268.Str_ToDaHyoji(strDaHyoji);     //打

            PieceType srcSyurui = Conv_String268.Str_ToSyurui(strSrcSyurui);


            //------------------------------
            //
            //------------------------------
            Playerside pside = Conv_String268.Pside_ToEnum(strPside);


            SyElement dstMasu;

            if ("同" == strDou)
            {
                // 1手前の筋、段を求めるのに使います。

                RO_Star koma = Util_Starlightable.AsKoma(siteiNode.Key.Now);

                dstMasu = koma.Masu;
            }
            else
            {
                dstMasu = Util_Masu10.OkibaSujiDanToMasu(
                    Okiba.ShogiBan,
                    Conv_Suji.ToInt(strSuji),
                    Conv_Suji.ToInt(strDan)
                    );
            }

            // TODO: 駒台にあるかもしれない。
            Okiba srcOkiba1 = Okiba.ShogiBan; //Okiba.FUMEI_FUGO_YOMI_CHOKUGO;// Okiba.SHOGIBAN;

            if (DaHyoji.Visible == daHyoji)
            {
                if (Playerside.P2 == pside)
                {
                    srcOkiba1 = Okiba.Gote_Komadai;
                }
                else
                {
                    srcOkiba1 = Okiba.Sente_Komadai;
                }
            }

            //
            SyElement dst1 = dstMasu;

            Finger foundKoma = Fingers.Error_1;

            //----------
            // 駒台の駒を(明示的に)打つなら
            //----------
            bool utsu = false;//駒台の駒を打つなら真

            if (DaHyoji.Visible == daHyoji)
            {
                utsu = true;
                goto gt_EndShogiban;
            }

            if (PieceType.P == srcSyurui)
            {
                #region 歩
                //************************************************************
                // 歩
                //************************************************************

                //----------
                // 候補マス
                //----------
                //┌─┬─┬─┐
                //│  │  │  │
                //├─┼─┼─┤
                //│  │至│  │
                //├─┼─┼─┤
                //│  │E│  │
                //└─┴─┴─┘
                bool isE = true;

                SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号");
                if (isE)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻引(pside, dst1));
                }

                if (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, out foundKoma))
                {
                    srcOkiba1 = Okiba.ShogiBan;
                    goto gt_EndSyurui;
                }
                #endregion
            }
            else if (PieceType.R == srcSyurui)
            {
                #region 飛
                //************************************************************
                // 飛
                //************************************************************
                //----------
                // 候補マス
                //----------
                //  ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
                //  │  │  │  │  │  │  │  │  │A7│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │A6│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │A5│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │A4│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                // │  │  │  │  │  │  │  │  │A3│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │A2│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │A1│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │A0│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │G7│G6│G5│G4│G3│G2│G1│G0│至│C0│C1│C2│C3│C4│C5│C6│C7│
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │E0│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │E1│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │E2│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │E3│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                // │  │  │  │  │  │  │  │  │E4│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │E5│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │E6│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │E7│  │  │  │  │  │  │  │  │
                //  └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
                bool isA = true;
                bool isC = true;
                bool isE = true;
                bool isG = true;

                switch (agaruHiku)
                {
                case AgaruHiku.Yoru:
                    isA = false;
                    isE = false;
                    break;

                case AgaruHiku.Agaru:
                    isA = false;
                    isC = false;
                    isG = false;
                    break;

                case AgaruHiku.Hiku:
                    isC = false;
                    isE = false;
                    isG = false;
                    break;
                }

                switch (migiHidari)
                {
                case MigiHidari.Migi:
                    isA = false;
                    isE = false;
                    isG = false;
                    break;

                case MigiHidari.Hidari:
                    isA = false;
                    isC = false;
                    isE = false;
                    break;

                case MigiHidari.Sugu:
                    isA = false;
                    isC = false;
                    isG = false;
                    break;
                }

                SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号");
                if (isA)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻上(pside, dst1));
                }
                if (isC)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻射(pside, dst1));
                }
                if (isE)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻引(pside, dst1));
                }
                if (isG)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻滑(pside, dst1));
                }

                if (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, out foundKoma))
                {
                    srcOkiba1 = Okiba.ShogiBan;
                    goto gt_EndSyurui;
                }
                #endregion
            }
            else if (PieceType.B == srcSyurui)
            {
                #region 角
                //************************************************************
                // 角
                //************************************************************
                //----------
                // 候補マス
                //----------
                //  ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
                //  │H7│  │  │  │  │  │  │  │  │  │  │  │  │  │  │  │B7│
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │H6│  │  │  │  │  │  │  │  │  │  │  │  │  │B6│  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │H5│  │  │  │  │  │  │  │  │  │  │  │B5│  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │H4│  │  │  │  │  │  │  │  │  │B4│  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                // │  │  │  │  │H3│  │  │  │  │  │  │  │B3│  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │H2│  │  │  │  │  │B2│  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │H1│  │  │  │B1│  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │H0│  │B0│  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │至│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │F0│  │D0│  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │F1│  │  │  │D1│  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │F2│  │  │  │  │  │D2│  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │F3│  │  │  │  │  │  │  │D3│  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                // │  │  │  │F4│  │  │  │  │  │  │  │  │  │D4│  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │F5│  │  │  │  │  │  │  │  │  │  │  │D5│  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │F6│  │  │  │  │  │  │  │  │  │  │  │  │  │D6│  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │F7│  │  │  │  │  │  │  │  │  │  │  │  │  │  │  │D7│
                //  └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
                bool isB = true;
                bool isD = true;
                bool isF = true;
                bool isH = true;

                switch (agaruHiku)
                {
                case AgaruHiku.Yoru:
                    isB = false;
                    isD = false;
                    isF = false;
                    isH = false;
                    break;

                case AgaruHiku.Agaru:
                    isB = false;
                    isH = false;
                    break;

                case AgaruHiku.Hiku:
                    isB = false;
                    isH = false;
                    break;
                }

                switch (migiHidari)
                {
                case MigiHidari.Migi:
                    isF = false;
                    isH = false;
                    break;

                case MigiHidari.Hidari:
                    isB = false;
                    isD = false;
                    break;

                case MigiHidari.Sugu:
                    isD = false;
                    isF = false;
                    break;
                }

                SySet_Default <SyElement> srcAll = new SySet_Default <SyElement>("J符号");
                if (isB)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻昇(pside, dst1));
                }
                if (isD)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻沈(pside, dst1));
                }
                if (isF)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻降(pside, dst1));
                }
                if (isH)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻浮(pside, dst1));
                }

                //----------
                // 候補マスB
                //----------
                if (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, out foundKoma))
                {
                    srcOkiba1 = Okiba.ShogiBan;
                    goto gt_EndSyurui;
                }
                #endregion
            }
            else if (PieceType.L == srcSyurui)
            {
                #region 香
                //************************************************************
                // 香
                //************************************************************
                //----------
                // 候補マス
                //----------
                //  ┌─┬─┬─┐
                //  │  │至│  │
                //  ├─┼─┼─┤
                //  │  │E0│  │
                //  ├─┼─┼─┤
                //  │  │E1│  │
                //  ├─┼─┼─┤
                //  │  │E2│  │
                //  ├─┼─┼─┤
                //  │  │E3│  │
                //  ├─┼─┼─┤
                //  │  │E4│  │
                //  ├─┼─┼─┤
                //  │  │E5│  │
                //  ├─┼─┼─┤
                //  │  │E6│  │
                //  ├─┼─┼─┤
                //  │  │E7│  │
                //  └─┴─┴─┘
                bool isE = true;

                SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号");
                if (isE)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻引(pside, dst1));
                }

                if (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, out foundKoma))
                {
                    srcOkiba1 = Okiba.ShogiBan;
                    goto gt_EndSyurui;
                }
                #endregion
            }
            else if (PieceType.N == srcSyurui)
            {
                #region 桂
                //************************************************************
                // 桂
                //************************************************************
                //----------
                // 候補マス
                //----------
                //┌─┐ ┌─┐
                //│  │ │  │
                //├─┼─┼─┤
                //│ │  │  │
                //├─┼─┼─┤
                //│ │至│  │先手から見た図
                //├─┼─┼─┤
                //│ │  │  │
                //├─┼─┼─┤
                //│J│ │I│
                //└─┘ └─┘
                bool isI = true;
                bool isJ = true;

                switch (agaruHiku)
                {
                case AgaruHiku.Yoru:
                    isI = false;
                    isJ = false;
                    break;

                case AgaruHiku.Agaru:
                    break;

                case AgaruHiku.Hiku:
                    isI = false;
                    isJ = false;
                    break;
                }

                switch (migiHidari)
                {
                case MigiHidari.Migi:
                    isJ = false;
                    break;

                case MigiHidari.Hidari:
                    isI = false;
                    break;

                case MigiHidari.Sugu:
                    isI = false;
                    isJ = false;
                    break;
                }

                SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号");
                if (isI)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKeimatobi_戻跳(pside, dst1));
                }
                if (isJ)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKeimatobi_戻駆(pside, dst1));
                }

                if (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, out foundKoma))
                {
                    srcOkiba1 = Okiba.ShogiBan;
                    goto gt_EndSyurui;
                }
                #endregion
            }
            else if (PieceType.S == srcSyurui)
            {
                #region 銀
                //************************************************************
                // 銀
                //************************************************************
                //----------
                // 候補マス
                //----------
                //┌─┬─┬─┐
                //│H│  │B│
                //├─┼─┼─┤
                //│ │至│  │先手から見た図
                //├─┼─┼─┤
                //│F│E│D│
                //└─┴─┴─┘
                bool isB = true;
                bool isD = true;
                bool isE = true;
                bool isF = true;
                bool isH = true;

                switch (agaruHiku)
                {
                case AgaruHiku.Yoru:
                    isB = false;
                    isD = false;
                    isE = false;
                    isF = false;
                    isH = false;
                    break;

                case AgaruHiku.Agaru:
                    isB = false;
                    isH = false;
                    break;

                case AgaruHiku.Hiku:
                    isD = false;
                    isE = false;
                    isF = false;
                    break;
                }

                switch (migiHidari)
                {
                case MigiHidari.Migi:
                    isE = false;
                    isF = false;
                    isH = false;
                    break;

                case MigiHidari.Hidari:
                    isB = false;
                    isD = false;
                    isE = false;
                    break;

                case MigiHidari.Sugu:
                    isB = false;
                    isD = false;
                    isF = false;
                    isH = false;
                    break;
                }

                SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号");
                if (isB)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻昇(pside, dst1));
                }
                if (isD)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻沈(pside, dst1));
                }
                if (isE)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻引(pside, dst1));
                }
                if (isF)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻降(pside, dst1));
                }
                if (isH)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻浮(pside, dst1));
                }

                if (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, out foundKoma))
                {
                    srcOkiba1 = Okiba.ShogiBan;
                    goto gt_EndSyurui;
                }
                #endregion
            }
            else if (
                PieceType.G == srcSyurui ||
                PieceType.PP == srcSyurui ||
                PieceType.PL == srcSyurui ||
                PieceType.PN == srcSyurui ||
                PieceType.PS == srcSyurui
                )
            {
                #region △金、△と金、△成香、△成桂、△成銀
                //************************************************************
                // △金、△と金、△成香、△成桂、△成銀
                //************************************************************
                //----------
                // 候補マス
                //----------
                //┌─┬─┬─┐
                //│  │A│  │
                //├─┼─┼─┤
                //│G│至│C│先手から見た図
                //├─┼─┼─┤
                //│F│E│D│
                //└─┴─┴─┘
                bool isA = true;
                bool isC = true;
                bool isD = true;
                bool isE = true;
                bool isF = true;
                bool isG = true;

                switch (agaruHiku)
                {
                case AgaruHiku.Yoru:
                    isA = false;
                    isD = false;
                    isE = false;
                    isF = false;
                    break;

                case AgaruHiku.Agaru:
                    isA = false;
                    isC = false;
                    isG = false;
                    break;

                case AgaruHiku.Hiku:
                    isC = false;
                    isD = false;
                    isE = false;
                    isF = false;
                    isG = false;
                    break;
                }

                switch (migiHidari)
                {
                case MigiHidari.Migi:
                    isA = false;
                    isE = false;
                    isF = false;
                    isG = false;
                    break;

                case MigiHidari.Hidari:
                    isA = false;
                    isC = false;
                    isD = false;
                    isE = false;
                    break;

                case MigiHidari.Sugu:
                    isA = false;
                    isC = false;
                    isD = false;
                    isF = false;
                    isG = false;
                    break;
                }

                SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号");
                if (isA)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻上(pside, dst1));
                }
                if (isC)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻射(pside, dst1));
                }
                if (isD)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻沈(pside, dst1));
                }
                if (isE)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻引(pside, dst1));
                }
                if (isF)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻降(pside, dst1));
                }
                if (isG)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻滑(pside, dst1));
                }

                if (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, out foundKoma))
                {
                    srcOkiba1 = Okiba.ShogiBan;
                    goto gt_EndSyurui;
                }
                #endregion
            }
            else if (PieceType.K == srcSyurui)
            {
                #region 王
                //************************************************************
                // 王
                //************************************************************

                //----------
                // 候補マス
                //----------
                //┌─┬─┬─┐
                //│H│A│B│
                //├─┼─┼─┤
                //│G│至│C│先手から見た図
                //├─┼─┼─┤
                //│F│E│D│
                //└─┴─┴─┘
                bool isA = true;
                bool isB = true;
                bool isC = true;
                bool isD = true;
                bool isE = true;
                bool isF = true;
                bool isG = true;
                bool isH = true;

                SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号");
                if (isA)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻上(pside, dst1));
                }
                if (isB)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻昇(pside, dst1));
                }
                if (isC)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻射(pside, dst1));
                }
                if (isD)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻沈(pside, dst1));
                }
                if (isE)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻引(pside, dst1));
                }
                if (isF)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻降(pside, dst1));
                }
                if (isG)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻滑(pside, dst1));
                }
                if (isH)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻浮(pside, dst1));
                }

                // 王は1つです。
                if (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, out foundKoma))
                {
                    srcOkiba1 = Okiba.ShogiBan;
                    goto gt_EndSyurui;
                }
                #endregion
            }
            else if (PieceType.PR == srcSyurui)
            {
                #region 竜
                //************************************************************
                // 竜
                //************************************************************

                //----------
                // 候補マス
                //----------
                //  ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
                //  │  │  │  │  │  │  │  │  │A7│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │A6│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │A5│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │A4│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                // │  │  │  │  │  │  │  │  │A3│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │A2│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │A1│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │H│A0│B│  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │G7│G6│G5│G4│G3│G2│G1│G0│至│C0│C1│C2│C3│C4│C5│C6│C7│
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │F│E0│D│  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │E1│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │E2│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │E3│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                // │  │  │  │  │  │  │  │  │E4│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │E5│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │E6│  │  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │  │E7│  │  │  │  │  │  │  │  │
                //  └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
                bool isA = true;
                bool isB = true;
                bool isC = true;
                bool isD = true;
                bool isE = true;
                bool isF = true;
                bool isG = true;
                bool isH = true;

                switch (agaruHiku)
                {
                case AgaruHiku.Yoru:
                    isA = false;
                    isB = false;
                    isD = false;
                    isE = false;
                    isF = false;
                    isH = false;
                    break;

                case AgaruHiku.Agaru:
                    isA = false;
                    isB = false;
                    isC = false;
                    isG = false;
                    isH = false;
                    break;

                case AgaruHiku.Hiku:
                    isC = false;
                    isD = false;
                    isE = false;
                    isF = false;
                    isG = false;
                    break;
                }

                switch (migiHidari)
                {
                case MigiHidari.Migi:
                    isA = false;
                    isE = false;
                    isF = false;
                    isG = false;
                    isH = false;
                    break;

                case MigiHidari.Hidari:
                    isA = false;
                    isB = false;
                    isC = false;
                    isD = false;
                    isE = false;
                    break;

                case MigiHidari.Sugu:
                    isA = false;
                    isB = false;
                    isC = false;
                    isD = false;
                    isF = false;
                    isG = false;
                    isH = false;
                    break;
                }

                SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号");
                if (isA)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻上(pside, dst1));
                }
                if (isB)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻昇(pside, dst1));
                }
                if (isC)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻射(pside, dst1));
                }
                if (isD)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻沈(pside, dst1));
                }
                if (isE)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻引(pside, dst1));
                }
                if (isF)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻降(pside, dst1));
                }
                if (isG)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻滑(pside, dst1));
                }
                if (isH)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻浮(pside, dst1));
                }

                if (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, out foundKoma))
                {
                    srcOkiba1 = Okiba.ShogiBan;
                    goto gt_EndSyurui;
                }
                #endregion
            }
            else if (PieceType.PB == srcSyurui)
            {
                #region 馬
                //************************************************************
                // 馬
                //************************************************************
                //----------
                // 候補マス
                //----------
                //  ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
                //  │H7│  │  │  │  │  │  │  │  │  │  │  │  │  │  │  │B7│
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │H6│  │  │  │  │  │  │  │  │  │  │  │  │  │B6│  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │H5│  │  │  │  │  │  │  │  │  │  │  │B5│  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │H4│  │  │  │  │  │  │  │  │  │B4│  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                // │  │  │  │  │H3│  │  │  │  │  │  │  │B3│  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │H2│  │  │  │  │  │B2│  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │H1│  │  │  │B1│  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │H0│A│B0│  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │G│至│C│  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │  │F0│E│D0│  │  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │  │F1│  │  │  │D1│  │  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │  │F2│  │  │  │  │  │D2│  │  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │  │  │F3│  │  │  │  │  │  │  │D3│  │  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                // │  │  │  │F4│  │  │  │  │  │  │  │  │  │D4│  │  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │  │F5│  │  │  │  │  │  │  │  │  │  │  │D5│  │  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │  │F6│  │  │  │  │  │  │  │  │  │  │  │  │  │D6│  │
                //  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
                //  │F7│  │  │  │  │  │  │  │  │  │  │  │  │  │  │  │D7│
                //  └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
                bool isA = true;
                bool isB = true;
                bool isC = true;
                bool isD = true;
                bool isE = true;
                bool isF = true;
                bool isG = true;
                bool isH = true;

                switch (agaruHiku)
                {
                case AgaruHiku.Yoru:
                    isA = false;
                    isB = false;
                    isD = false;
                    isE = false;
                    isF = false;
                    isH = false;
                    break;

                case AgaruHiku.Agaru:
                    isA = false;
                    isB = false;
                    isC = false;
                    isG = false;
                    isH = false;
                    break;

                case AgaruHiku.Hiku:
                    isC = false;
                    isD = false;
                    isE = false;
                    isF = false;
                    isG = false;
                    break;
                }

                switch (migiHidari)
                {
                case MigiHidari.Migi:
                    isA = false;
                    isE = false;
                    isF = false;
                    isG = false;
                    isH = false;
                    break;

                case MigiHidari.Hidari:
                    isA = false;
                    isB = false;
                    isC = false;
                    isD = false;
                    isE = false;
                    break;

                case MigiHidari.Sugu:
                    isA = false;
                    isB = false;
                    isC = false;
                    isD = false;
                    isF = false;
                    isG = false;
                    isH = false;
                    break;
                }

                SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号");
                if (isA)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻上(pside, dst1));
                }
                if (isB)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻昇(pside, dst1));
                }
                if (isC)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻射(pside, dst1));
                }
                if (isD)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻沈(pside, dst1));
                }
                if (isE)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻引(pside, dst1));
                }
                if (isF)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻降(pside, dst1));
                }
                if (isG)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcIppo_戻滑(pside, dst1));
                }
                if (isH)
                {
                    srcAll.AddSupersets(KomanoKidou.SrcKantu_戻浮(pside, dst1));
                }

                if (Query341_OnSky.Query_Koma(pside, srcSyurui, srcAll, kifu.CurNode.Value.KyokumenConst, out foundKoma))
                {
                    srcOkiba1 = Okiba.ShogiBan;
                    goto gt_EndSyurui;
                }
                #endregion
            }
            else
            {
                #region エラー
                //************************************************************
                // エラー
                //************************************************************

                #endregion
            }

gt_EndShogiban:

            if (Fingers.Error_1 == foundKoma && utsu)
            {
                // 駒台の駒を(明示的に)打ちます。
                //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


                Fingers komas = Util_Sky_FingersQuery.InOkibaPsideKomasyuruiNow(
                    siteiNode.Value.KyokumenConst, srcOkiba1, pside, srcSyurui);//(2015-08-05 01:04)変更
                //Fingers komas = Util_Sky051Fingers.Fingers_ByOkibaPsideSyuruiNow_OldSpec(
                //    siteiNode.Value.ToKyokumenConst, srcOkiba1, pside, srcSyurui);

                if (0 < komas.Count)
                {
                    switch (pside)
                    {
                    case Playerside.P2:
                        srcOkiba1 = Okiba.Gote_Komadai;
                        break;

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

                    default:
                        srcOkiba1 = Okiba.Empty;
                        break;
                    }

                    foundKoma = komas[0];
                    goto gt_EndSyurui;
                }
            }

gt_EndSyurui:


            int srcMasuHandle1;

            if (Fingers.Error_1 != foundKoma)
            {
                // 将棋盤の上に駒がありました。
                //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

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

                srcMasuHandle1 = Conv_SyElement.ToMasuNumber(koma.Masu);
            }
            else
            {
                // (符号に書かれていませんが)「打」のとき。
                //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

                switch (pside)
                {
                case Playerside.P2:
                    srcOkiba1 = Okiba.Gote_Komadai;
                    break;

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

                default:
                    srcOkiba1 = Okiba.Empty;
                    break;
                }


                Debug.Assert(0 < siteiNode.Value.KyokumenConst.Count, "星の光が 1個未満。");

                // 駒台から、該当する駒を探します。
                Fingers daiKomaFgs = Util_Sky_FingersQuery.InOkibaPsideKomasyuruiNow(
                    siteiNode.Value.KyokumenConst, srcOkiba1, pside, srcSyurui);//(2015-08-05 01:04)変更
                //Fingers daiKomaFgs = Util_Sky051Fingers.Fingers_ByOkibaPsideSyuruiNow_OldSpec(
                //    siteiNode.Value.ToKyokumenConst, srcOkiba1, pside, srcSyurui);//(2014-10-04 12:46)変更


                Debug.Assert(0 < daiKomaFgs.Count, $"フィンガーズが 1個未満。 srcOkiba1=[{srcOkiba1}] pside=[{pside}] srcSyurui=[{srcSyurui}]");

                // 1個はヒットするはず
                Finger hitKoma = daiKomaFgs[0];//▲![コマ送り]ボタンを連打すると、エラーになります。



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

                srcMasuHandle1 = Conv_SyElement.ToMasuNumber(koma.Masu);
            }


            PieceType dstSyurui;
            if (NariNarazu.Nari == nariNarazu)
            {
                // 成ります
                dstSyurui = Util_Komasyurui14.NariCaseHandle[(int)srcSyurui];
            }
            else
            {
                // そのままです。
                dstSyurui = srcSyurui;
            }


            // 1手を、データにします。
            move = new RO_Starbeam(
                //foundKoma,//TODO:

                new RO_Star(
                    pside,
                    Conv_MasuHandle.ToMasu(srcMasuHandle1),
                    srcSyurui
                    ),

                new RO_Star(
                    pside,
                    dstMasu,//符号は将棋盤の升目です。
                    dstSyurui
                    ),

                PieceType.None // 符号からは、取った駒の種類は分からないんだぜ☆ だがバグではない☆ あとで調べる☆
                );
        }
예제 #14
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//符号からは、取った駒は分からない
                );
        }
예제 #15
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());
        }
예제 #16
0
        /// <summary>
        /// デバッグ用文字列を作ります。
        /// </summary>
        /// <param name="masus"></param>
        /// <param name="memo"></param>
        /// <returns></returns>
        public static string Log_Masus(SySet <SyElement> masus, string memo)
        {
            StringBuilder sb = new StringBuilder();

            int errorCount = 0;

            // フォルスクリア
            bool[] ban81 = new bool[81];

            // フラグ立て
            foreach (New_Basho basho in masus.Elements)
            {
                if (Okiba.ShogiBan == Conv_SyElement.ToOkiba(Masu_Honshogi.Masus_All[basho.MasuNumber]))
                {
                    ban81[basho.MasuNumber] = true;
                }
            }



            sb.AppendLine("...(^▽^)さて、局面は☆?");

            if (null != memo && "" != memo.Trim())
            {
                sb.AppendLine(memo);
            }

            sb.AppendLine(" 9 8 7 6 5 4 3 2 1");
            sb.AppendLine("┏━┯━┯━┯━┯━┯━┯━┯━┯━┓");
            for (int dan = 1; dan <= 9; dan++)
            {
                sb.Append("┃");
                for (int suji = 9; suji >= 1; suji--)// 筋は左右逆☆
                {
                    SyElement masu = Util_Masu10.OkibaSujiDanToMasu(Okiba.ShogiBan, suji, dan);
                    if (Okiba.ShogiBan == Conv_SyElement.ToOkiba(masu))
                    {
                        if (ban81[Conv_SyElement.ToMasuNumber(masu)])
                        {
                            sb.Append("●");
                        }
                        else
                        {
                            sb.Append("  ");
                        }
                    }
                    else
                    {
                        errorCount++;
                        sb.Append("  ");
                    }


                    if (suji == 1)//1筋が最後だぜ☆
                    {
                        sb.Append("┃");
                        sb.AppendLine(Conv_Int.ToKanSuji(dan));
                    }
                    else
                    {
                        sb.Append("│");
                    }
                }

                if (dan == 9)
                {
                    sb.AppendLine("┗━┷━┷━┷━┷━┷━┷━┷━┷━┛");
                }
                else
                {
                    sb.AppendLine("┠─┼─┼─┼─┼─┼─┼─┼─┼─┨");
                }
            }


            // 後手駒台
            sb.Append("エラー数:");
            sb.AppendLine(errorCount.ToString());
            sb.AppendLine("...(^▽^)ドウダッタカナ~☆");


            return(sb.ToString());
        }