예제 #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="commandline">B4B3、または toryo といった文字列を含む行☆</param>
        /// <param name="caret">文字カーソルの位置</param>
        /// <param name="ky">取られた駒を調べるために使う☆</param>
        /// <param name="out_sasite"></param>
        /// <returns></returns>
        public static bool TryFenMove(
            bool isSfen,
            string commandline,
            ref int caret,
            Kyokumen.Sindanyo kys,
            out Move out_sasite
            )
        {
            if ('n' == commandline[caret])
            {
                if (caret == commandline.IndexOf("none", caret))//定跡ファイルの応手が無いときに利用☆
                {
                    Util_String.TobasuTangoToMatubiKuhaku(commandline, ref caret, "none");

                    out_sasite = Move.Toryo;
                    return(true);
                }
            }
            else
            //if ('t' == commandline[caret])
            //{
            if (caret == commandline.IndexOf(Itiran_FenParser.GetToryo(isSfen), caret))
            {
                Util_String.TobasuTangoToMatubiKuhaku(commandline, ref caret, Itiran_FenParser.GetToryo(isSfen));

                out_sasite = Move.Toryo;
                return(true);
            }
            //}

            // 「toryo」でも「none」でもなければ、「B4B3」形式と想定して、1手だけ読込み
            // テキスト形式の符号「A4A3 C1C2 …」の最初の1要素を、切り取ってトークンに分解します。

            Match m = Itiran_FenParser.GetMovePattern(isSfen).Match(commandline, caret);

            if (!m.Success)
            {
                //// 「B4B3」形式ではなかった☆(^△^)!? 次の一手が読めない☆
                //string msg = $"指し手のパースに失敗だぜ☆(^~^)! commandline=[{ commandline }] caret=[{ caret }] m.Groups.Count=[{ m.Groups.Count }]";
                //Util_Machine.AppendLine(msg);
                //Logger.Flush();
                //throw new Exception(msg);

                out_sasite = Move.Toryo;
                return(false);
            }

            // m.Groups[1].Value : ABCabc か、 ZKH
            // m.Groups[2].Value : 1234   か、 *
            // m.Groups[3].Value : ABCabc
            // m.Groups[4].Value : 1234
            // m.Groups[5].Value : +

            // カーソルを進めるぜ☆(^~^)
            Util_String.SkipMatch(commandline, ref caret, m);

            // 符号1「B4B3」を元に、move を作ります。
            out_sasite = TryFenMove2(
                isSfen,
                kys,
                m.Groups[1].Value,
                m.Groups[2].Value,
                m.Groups[3].Value,
                m.Groups[4].Value,
                m.Groups[5].Value
                );
            Debug.Assert((int)out_sasite != -1, "");

            return(true);
        }
예제 #2
0
        /// <summary>
        /// 改造FEN符号表記
        /// </summary>
        /// <returns></returns>
        public static void AppendFenTo(bool isSfen, Move ss, StringBuilder syuturyoku)
        {
            if (Move.Toryo == ss)
            {
                syuturyoku.Append(Itiran_FenParser.GetToryo(isSfen)); return;
            }

            int v = (int)ss;//バリュー(ビットフィールド)

            // 打った駒の種類(取り出すのは難しいので関数を使う☆)
            MotiKomasyurui mksUtta = GetUttaKomasyurui(ss);

            if (MotiKomasyurui.Yososu != mksUtta)//指定があれば
            {
                // 打でした。

                // (自)筋・(自)段は書かずに、「P*」といった表記で埋めます。
                Conv_MotiKomasyurui.AppendFenTo(isSfen, mksUtta, syuturyoku);
                syuturyoku.Append("*");
            }
            else
            {
                //------------------------------------------------------------
                // (自)筋
                //------------------------------------------------------------
                if (Option_Application.Optionlist.USI)
                {
                    syuturyoku.Append(Option_Application.Optionlist.BanYokoHaba + 1 - GetSrcSuji_WithoutErrorCheck(v));
                }
                else
                {
                    syuturyoku.Append(Conv_Kihon.ToAlphabetLarge(GetSrcSuji_WithoutErrorCheck(v)));
                }

                //------------------------------------------------------------
                // (自)段
                //------------------------------------------------------------
                if (Option_Application.Optionlist.USI)
                {
                    syuturyoku.Append(Conv_Kihon.ToAlphabetSmall(GetSrcDan_WithoutErrorCheck(v)));
                }
                else
                {
                    syuturyoku.Append(GetSrcDan_WithoutErrorCheck(v).ToString());
                }
            }

            //------------------------------------------------------------
            // (至)筋
            //------------------------------------------------------------
            if (Option_Application.Optionlist.USI)
            {
                syuturyoku.Append(Option_Application.Optionlist.BanYokoHaba + 1 - GetDstSuji_WithoutErrorCheck(v));
            }
            else
            {
                syuturyoku.Append(Conv_Kihon.ToAlphabetLarge(GetDstSuji_WithoutErrorCheck(v)));
            }

            //------------------------------------------------------------
            // (至)段
            //------------------------------------------------------------
            if (Option_Application.Optionlist.USI)
            {
                syuturyoku.Append(Conv_Kihon.ToAlphabetSmall(GetDstDan_WithoutErrorCheck(v)));
            }
            else
            {
                syuturyoku.Append(GetDstDan_WithoutErrorCheck(v).ToString());
            }

            //------------------------------------------------------------
            // 成
            //------------------------------------------------------------
            int natta;

            {
                // (v & m) >> s + 1。 v:バリュー、m:マスク、s:シフト
                natta = (v & (int)MoveMask.Natta) >> (int)MoveShift.Natta;
            }
            if (1 == natta)
            {
                syuturyoku.Append("+");
            }
        }