コード例 #1
0
        /// <summary>
        /// 1ステップずつ実行します。
        /// </summary>
        /// <param name="inputLine"></param>
        /// <param name="kifu"></param>
        /// <param name="larabeLogger"></param>
        /// <returns></returns>
        public string Execute_Step(
            ref KifuParserA_Result result,
            Model_Taikyoku model_Taikyoku,
            KifuParserA_Genjo genjo
            ,
            [CallerMemberName] string memberName    = "",
            [CallerFilePath] string sourceFilePath  = "",
            [CallerLineNumber] int sourceLineNumber = 0
            )
        {
            //shogiGui_Base.Model_PnlTaikyoku.Kifu.AssertPside(shogiGui_Base.Model_PnlTaikyoku.Kifu.CurNode, "Execute_Step",logTag);

#if DEBUG
            Logger.Trace("┏━━━━━┓(^o^)");
            Logger.Trace($"わたしは {this.State.GetType().Name} の Execute_Step だぜ☆ : 呼出箇所={memberName}.{sourceFilePath}.{sourceLineNumber}");
#endif

            KifuParserA_State nextState;
            genjo.InputLine = this.State.Execute(
                ref result,
                model_Taikyoku,
                out nextState, this,
                genjo);
            this.State = nextState;

            return(genjo.InputLine);
        }
コード例 #2
0
        /// <summary>
        /// [コマ送り]ボタン
        ///
        /// vsコンピューター対局でも、タイマーによって[コマ送り]が実行されます。
        ///
        /// </summary>
        public static bool Komaokuri_Srv(
            ref string inputLine,
            Model_Taikyoku model_Taikyoku,
            Model_Manual model_Manual
            ,
            [CallerMemberName] string memberName    = "",
            [CallerFilePath] string sourceFilePath  = "",
            [CallerLineNumber] int sourceLineNumber = 0
            )
        {
            if ("" == inputLine)
            {
                goto gt_EndMethod;
            }

            bool toBreak = false;

            Util_Functions_Server.ReadLine_TuginoItteSusumu_Srv(
                ref inputLine,
                model_Taikyoku,//SetCurNodeがある。
                model_Manual,
                out toBreak,
                "hint"
                );

gt_EndMethod:
            ;
            return(true);
        }
コード例 #3
0
        /// <summary>
        /// 最初から最後まで実行します。(きふわらべCOMP用)
        /// </summary>
        /// <param name="inputLine"></param>
        /// <param name="kifu"></param>
        /// <param name="larabeLogger"></param>
        public void Execute_All(
            ref KifuParserA_Result result,
            Model_Taikyoku model_Taikyoku,
            KifuParserA_Genjo genjo
            ,
            [CallerMemberName] string memberName    = "",
            [CallerFilePath] string sourceFilePath  = "",
            [CallerLineNumber] int sourceLineNumber = 0
            )
        {
#if DEBUG
            Logger.Trace("┏━━━━━━━━━━┓");
            Logger.Trace($"わたしは {this.State.GetType().Name} の Execute_All だぜ☆ : 呼出箇所={memberName}.{sourceFilePath}.{sourceLineNumber}");
#endif

            KifuParserA_State nextState = this.State;

            while (!genjo.IsBreak())//breakするまでくり返し。
            {
                if ("" == genjo.InputLine)
                {
                    // FIXME: コンピューターが先手のとき、ここにくる?

                    // 異常時。
                    //FIXME: Logger.Trace($"\(^o^)/「{genjo.InputLine}」入力がない3☆! 終わるぜ☆");
                    genjo.ToBreak_Abnormal();
                    goto gt_NextLoop1;
                }


                genjo.InputLine = this.State.Execute(
                    ref result,
                    model_Taikyoku,
                    out nextState, this,
                    genjo);
                this.State = nextState;

gt_NextLoop1:
                ;
            }



            //if (null != genjo.StartposImporter_OrNull)
            //{
            //    // SFENの解析結果を渡すので、
            //    // その解析結果をどう使うかは、委譲します。
            //    this.Delegate_OnChangeSky_Im(
            //        model_PnlTaikyoku,
            //        genjo,
            //        logTag
            //        );
            //}
        }
コード例 #4
0
        public string Execute(
            ref KifuParserA_Result result,
            Model_Taikyoku model_Taikyoku,
            out KifuParserA_State nextState,
            KifuParserA owner,
            KifuParserA_Genjo genjo
            )
        {
            nextState = this;

            Logger.Error($"(^△^)「{genjo.InputLine}」vs【{this.GetType().Name}】 : さて、どんな内容なんだぜ☆?");

            StartposImporter startposImporter1;
            string           restText;

            bool successful = StartposImporter.TryParse(
                genjo.InputLine,
                out startposImporter1,
                out restText
                );

            genjo.StartposImporter_OrNull = startposImporter1;
            Logger.Error($"(^△^)restText=「{restText}」 successful=【{successful}】");

            if (successful)
            {
                genjo.InputLine = restText;

                //if(null!=genjo.StartposImporter_OrNull)
                //{
                //    // SFENの解析結果を渡すので、
                //    // その解析結果をどう使うかは、委譲します。
                //    owner.Delegate_OnChangeSky_Im(
                //        model_PnlTaikyoku,
                //        genjo,
                //        logTag
                //        );
                //}

                nextState = KifuParserA_StateA2_SfenMoves.GetInstance();
            }
            else
            {
                // 解析に失敗しました。
                //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                genjo.ToBreak_Abnormal();
            }

            return(genjo.InputLine);
        }
コード例 #5
0
        public string Execute(
            ref KifuParserA_Result result,
            Model_Taikyoku model_Taikyoku,
            out KifuParserA_State nextState,
            KifuParserA owner,
            KifuParserA_Genjo genjo
            )
        {
            nextState = this;

            if (genjo.InputLine.StartsWith("startpos"))
            {
                // 平手の初期配置です。
                //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

#if DEBUG
                Logger.Trace($"(^△^)「{genjo.InputLine}」vs【{this.GetType().Name}】 : 平手のようなんだぜ☆");
#endif

                genjo.InputLine = genjo.InputLine.Substring("startpos".Length);
                genjo.InputLine = genjo.InputLine.Trim();

                //----------------------------------------
                // 棋譜を空っぽにし、平手初期局面を与えます。
                //----------------------------------------
                {
                    model_Taikyoku.Kifu.Clear();// 棋譜を空っぽにします。

                    model_Taikyoku.Kifu.GetRoot().Value.SetKyokumen(
                        SkyConst.NewInstance(Util_SkyWriter.New_Hirate(Playerside.P1),
                                             0                                                    //初期配置は 0手目済み。)
                                             ));                                                  //SFENのstartpos解析時
                    model_Taikyoku.Kifu.SetProperty(Word_KifuTree.PropName_Startpos, "startpos"); //平手の初期局面
                }

                nextState = KifuParserA_StateA1a_SfenStartpos.GetInstance();
            }
            else
            {
                //#if DEBUG
                // : 局面の指定のようなんだぜ☆ 対応していない☆?
                Logger.Error($"(^△^)ここはスルーして次に状態遷移するんだぜ☆\n「{genjo.InputLine}」vs【{this.GetType().Name}】");
                //#endif
                nextState = KifuParserA_StateA1b_SfenLnsgkgsnl.GetInstance();
            }

            return(genjo.InputLine);
        }
コード例 #6
0
        public string Execute(
            ref KifuParserA_Result result,
            Model_Taikyoku model_Taikyoku,
            out KifuParserA_State nextState,
            KifuParserA owner,
            KifuParserA_Genjo genjo
            )
        {
            nextState = this;

            if (genjo.InputLine.StartsWith("position"))
            {
                // SFEN形式の「position」コマンドが、入力欄に入っていました。
                //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

                //------------------------------------------------------------
                // まずこのブロックで「position ~ moves 」まで(*1)を処理します。
                //------------------------------------------------------------
                //
                //          *1…初期配置を作るということです。
                //

#if DEBUG
                Logger.Trace($"(^△^)「{genjo.InputLine}」vs【{this.GetType().Name}】 : フムフム... SFEN形式か...☆");
#endif
                genjo.InputLine = genjo.InputLine.Substring("position".Length);
                genjo.InputLine = genjo.InputLine.Trim();


                nextState = KifuParserA_StateA1_SfenPosition.GetInstance();
            }
            else if ("" == genjo.InputLine)
            {
                // 異常時。
                Logger.Error($"\(^o^)/「{genjo.InputLine}」入力がない2☆! 終わるぜ☆");
                genjo.ToBreak_Abnormal();
            }
            else
            {
#if DEBUG
                Playerside pside = model_Taikyoku.Kifu.CurNode.Value.KyokumenConst.KaisiPside;
                Logger.Trace($"(^△^)「{genjo.InputLine}」vs【{this.GetType().Name}】 : フムフム... positionじゃなかったぜ☆ 日本式か☆? SFENでmovesを読んだあとのプログラムに合流させるぜ☆ : 先後=[{pside}]");
#endif
                nextState = KifuParserA_StateA2_SfenMoves.GetInstance();
            }

            return(genjo.InputLine);
        }
コード例 #7
0
        /// <summary>
        /// 「棋譜ツリーのカレントノード」の差替え、
        /// および
        /// 「GUI用局面データ」との同期。
        ///
        /// (1) 駒をつまんでいるときに、マウスの左ボタンを放したとき。
        /// (2) 駒の移動先の升の上で、マウスの左ボタンを放したとき。
        /// (3) 成る/成らないダイアログボックスが出たときに、マウスの左ボタンを押下したとき。
        /// </summary>
        /// <param name="kifu"></param>
        /// <param name="newNode"></param>
        public static void SetCurNode_Srv(
            Model_Taikyoku model_Taikyoku,// Taikyokuの内容をManualへ移す。
            Model_Manual model_Manual,
            Node <IMove, KyokumenWrapper> newNode,
            out string jsaFugoStr
            )
        {
            Debug.Assert(null != newNode, "新規ノードがヌル。");

            model_Taikyoku.Kifu.SetCurNode(newNode);

            model_Manual.SetGuiSky(newNode.Value.KyokumenConst);
            model_Manual.GuiTemezumi = model_Taikyoku.Kifu.CurNode.Value.KyokumenConst.Temezumi;
            model_Manual.GuiPside    = model_Taikyoku.Kifu.CurNode.Value.KyokumenConst.KaisiPside;

            jsaFugoStr = ConvMoveStrJsa.ToMoveStrJsa(newNode);
        }
コード例 #8
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="kifu"></param>
        /// <param name="restText"></param>
        /// <param name="startposImporter"></param>
        /// <param name="logTag"></param>
        public static void OnChangeSky_Im_Client(
            Model_Taikyoku model_Taikyoku,
            KifuParserA_Genjo genjo
            )
        {
            Logger.Trace($"(^△^)「{genjo.InputLine}」Util_InClient : クライアントの委譲メソッドキター☆");


            string         old_inputLine = genjo.InputLine;//退避
            string         rest;
            ISfenPosition2 ro_Kyokumen2_ForTokenize;

            Sfenstring146Conv.ToKyokumen2(
                genjo.InputLine,
                out rest,
                out ro_Kyokumen2_ForTokenize
                );

            Logger.Trace($"(^△^)old_inputLine=「{old_inputLine}」 rest=「{rest}」 Util_InClient : ハハッ☆");

            //string old_inputLine = genjo.InputLine;
            //genjo.InputLine = "";


            //----------------------------------------
            // 棋譜を空っぽにし、指定の局面を与えます。
            //----------------------------------------
            {
                model_Taikyoku.Kifu.Clear();// 棋譜を空っぽにします。

                // 文字列から、指定局面を作成します。
                Playerside pside    = Playerside.P1;
                int        temezumi = 0;
                model_Taikyoku.Kifu.GetRoot().Value.SetKyokumen(
                    SkyConst.NewInstance(
                        Conv_Sfenstring307.ToSkyConst(new SfenStringImpl(old_inputLine), pside, temezumi),
                        temezumi                                                                 //初期配置は 0手目済み。
                        )
                    );                                                                           //SFENのstartpos解析時
                model_Taikyoku.Kifu.SetProperty(Word_KifuTree.PropName_Startpos, old_inputLine); //指定の初期局面
            }
        }
コード例 #9
0
        public Server_Impl(SkyConst src_Sky, int temezumi, Receiver receiver)
        {
            this.engineClient = new EngineClient_Impl(receiver);
            this.engineClient.SetOwner_Server(this);

            //----------
            // モデル
            //----------
            this.model_Taikyoku = new Model_TaikyokuImpl(new KifuTreeImpl(
                                                             new KifuNodeImpl(
                                                                 Util_Sky258A.RootMove,
                                                                 new KyokumenWrapper(SkyConst.NewInstance(
                                                                                         src_Sky, //model_Manual.GuiSkyConst,
                                                                                         temezumi //model_Manual.GuiTemezumi
                                                                                         ))
                                                                 )
                                                             ));
            this.Model_Taikyoku.Kifu.SetProperty(Word_KifuTree.PropName_Startpos, "9/9/9/9/9/9/9/9/9");

            this.inputString99 = "";
        }
コード例 #10
0
        public string Execute(
            ref KifuParserA_Result result,
            Model_Taikyoku model_Taikyoku,
            out KifuParserA_State nextState,
            KifuParserA owner,
            KifuParserA_Genjo genjo
            )
        {
            nextState = this;

            if (genjo.InputLine.StartsWith("moves"))
            {
                //>>>>> 棋譜が始まります。
                Logger.Trace($"(^△^)「{genjo.InputLine}」vs【{this.GetType().Name}】 : ウム☆ moves 分かるぜ☆");

                genjo.InputLine = genjo.InputLine.Substring("moves".Length);
                genjo.InputLine = genjo.InputLine.Trim();


                nextState = KifuParserA_StateA2_SfenMoves.GetInstance();
            }
            else if ("" == genjo.InputLine)
            {
                // FIXME: コンピューターが先手のとき、ここにくる?

                // 異常時。
                Logger.Error($"\(^o^)/「{genjo.InputLine}」入力がない1☆! 終わるぜ☆");
                genjo.ToBreak_Abnormal();
            }
            else
            {
                // 異常時。
                Logger.Error($"\(^o^)/「{genjo.InputLine}」vs【{this.GetType().Name}】 : movesがない☆! 終わるぜ☆");
                genjo.ToBreak_Abnormal();
            }

            return(genjo.InputLine);
        }
コード例 #11
0
        /// <summary>
        /// ************************************************************************************************************************
        /// 1手進む
        /// ************************************************************************************************************************
        ///
        /// <棋譜読込用><マウス入力非対応>
        ///
        /// 「棋譜並べモード」と「vsコンピューター対局」でも、これを使いますが、
        /// 「棋譜並べモード」では送られてくる SFEN が「position startpos moves 8c8d」とフルであるのに対し、
        /// 「vsコンピューター対局」では、送られてくる SFEN が「8c8d」だけです。
        ///
        /// それにより、処理の流れが異なります。
        ///
        /// </summary>
        public static bool ReadLine_TuginoItteSusumu_Srv(
            ref string inputLine,
            Model_Taikyoku model_Taikyoku,//SetCurNodeがある。[コマ送り][再生]などで使用。
            Model_Manual model_Manual,
            out bool toBreak,
            string hint
            ,
            [CallerMemberName] string memberName    = "",
            [CallerFilePath] string sourceFilePath  = "",
            [CallerLineNumber] int sourceLineNumber = 0
            )
        {
            //IErrorController logTag = OwataMinister.SERVER_KIFU_YOMITORI;

            bool               successful       = false;
            KifuParserA_Impl   kifuParserA_Impl = new KifuParserA_Impl();
            KifuParserA_Result result           = new KifuParserA_ResultImpl();
            KifuParserA_Genjo  genjo            = new KifuParserA_GenjoImpl(inputLine);

            try
            {
                if (kifuParserA_Impl.State is KifuParserA_StateA0_Document)
                {
                    // 最初はここ

#if DEBUG
                    Logger.Trace("(^o^)... ...");
                    Logger.Trace($"サイショハココ☆ : {memberName}.{sourceFilePath}.{sourceLineNumber}");
#endif
                    inputLine = kifuParserA_Impl.Execute_Step(
                        ref result,
                        model_Taikyoku,
                        genjo
                        );

                    Debug.Assert(result.Out_newNode_OrNull == null, "ここでノードに変化があるのはおかしい。");

                    if (genjo.IsBreak())
                    {
                        goto gt_EndMethod;
                    }
                    // (1)position コマンドを処理しました。→startpos
                    // (2)日本式棋譜で、何もしませんでした。→moves
                }

                if (kifuParserA_Impl.State is KifuParserA_StateA1_SfenPosition)
                {
                    //------------------------------------------------------------
                    // このブロックでは「position ~ moves 」まで一気に(*1)を処理します。
                    //------------------------------------------------------------
                    //
                    //          *1…初期配置を作るということです。
                    //

                    {
#if DEBUG
                        string message = $"(^o^)ツギハ ヒラテ マタハ シテイキョクメン ヲ ショリシタイ☆ inputLine=[{inputLine}]";
                        Logger.Trace(message);
#endif

                        inputLine = kifuParserA_Impl.Execute_Step(
                            ref result,
                            model_Taikyoku,
                            genjo
                            );
                        Debug.Assert(result.Out_newNode_OrNull == null, "ここでノードに変化があるのはおかしい。");


                        if (genjo.IsBreak())
                        {
                            goto gt_EndMethod;
                        }
                    }


                    {
#if DEBUG
                        Logger.Trace("(^o^)ツギハ ムーブス ヲ ショリシタイ☆");
#endif

                        inputLine = kifuParserA_Impl.Execute_Step(
                            ref result,
                            model_Taikyoku,
                            genjo
                            );
                        Debug.Assert(result.Out_newNode_OrNull == null, "ここでノードに変化があるのはおかしい。");


                        if (genjo.IsBreak())
                        {
                            goto gt_EndMethod;
                        }
                        // moves を処理しました。
                        // ここまでで、「position ~ moves 」といった記述が入力されていたとすれば、入力欄から削除済みです。
                    }


                    // →moves
                }

                //
                // 対COMP戦で関係があるのはここです。
                //
                if (kifuParserA_Impl.State is KifuParserA_StateA2_SfenMoves)
                {
#if DEBUG
                    Logger.Trace("ツギハ イッテ ショリシタイ☆");
#endif

                    inputLine = kifuParserA_Impl.Execute_Step(
                        ref result,
                        model_Taikyoku,
                        genjo
                        );

                    if (null != result.Out_newNode_OrNull)
                    {
                        string jsaFugoStr;
                        Util_Functions_Server.SetCurNode_Srv(model_Taikyoku, model_Manual, result.Out_newNode_OrNull, out jsaFugoStr);
                    }

                    if (genjo.IsBreak())
                    {
                        goto gt_EndMethod;
                    }


                    // 1手を処理した☆?
                }


                if (null != genjo.StartposImporter_OrNull)
                {
                    // 初期配置が平手でないとき。
                    // ************************************************************************************************************************
                    // SFENの初期配置の書き方(*1)を元に、駒を並べます。
                    // ************************************************************************************************************************
                    //
                    //     *1…「position startpos moves 7g7f 3c3d 2g2f」といった書き方。
                    //
                    ParsedKyokumen parsedKyokumen = Conv_StartposImporter.ToParsedKyokumen(
                        model_Manual,
                        genjo.StartposImporter_OrNull,//指定されているはず。
                        genjo
                        );

                    //------------------------------
                    // 駒の配置
                    //------------------------------
                    string jsaFugoStr;
                    Util_Functions_Server.SetCurNode_Srv(model_Taikyoku, model_Manual, parsedKyokumen.KifuNode, out jsaFugoStr);// GUIに通知するだけ。

                    ////------------------------------
                    //// 駒を、駒袋から駒台に移動させます。
                    ////------------------------------
                    //model_Operating.Manual.SetGuiSky(
                    //    SkyConst.NewInstance(
                    //        parsedKyokumen.buffer_Sky,
                    //        -1//そのまま
                    //    )
                    //);
                }


                successful = true;
            }
            catch (Exception ex)
            {
                Util_Message.Show($"{ex}");
                toBreak    = true;
                successful = false;
            }

gt_EndMethod:
            toBreak = genjo.IsBreak();
            return(successful);
        }
コード例 #12
0
        /// <summary>
        /// ************************************************************************************************************************
        /// [巻戻し]ボタン
        /// ************************************************************************************************************************
        /// </summary>
        public static bool Makimodosi_Srv(
            out Finger movedKoma,
            out Finger foodKoma,
            out string jsaFugoStr,
            Model_Taikyoku model_Taikyoku
            )
        {
            bool successful = false;

            //------------------------------
            // 棋譜から1手削ります
            //------------------------------
            Node <IMove, KyokumenWrapper> removeeLeaf = model_Taikyoku.Kifu.CurNode;
            int korekaranoTemezumi = removeeLeaf.Value.KyokumenConst.Temezumi - 1;//1手前へ。

            if (removeeLeaf.IsRoot())
            {
                // ルート
                jsaFugoStr = "×";
                movedKoma  = Fingers.Error_1;
                foodKoma   = Fingers.Error_1;
                goto gt_EndMethod;
            }


            //------------------------------
            // 符号
            //------------------------------
            // [巻戻し]ボタン
            jsaFugoStr = ConvMoveStrJsa.ToMoveStrJsa(removeeLeaf);



            //------------------------------
            // 前の手に戻します
            //------------------------------
            IttemodosuResult ittemodosuResult = new IttemodosuResultImpl(Fingers.Error_1, Fingers.Error_1, null, PieceType.None, null);

            {
                //Ks14 foodKomaSyurui;//取った駒があれば、取った駒の種類。
                //SkyConst susunda_Sky_orNull;
                //
                // 一手巻き戻す
                //
                Util_IttemodosuRoutine.Before1(
                    new IttemodosuArgImpl(
                        model_Taikyoku.Kifu.CurNode,
                        removeeLeaf.Key,
                        korekaranoTemezumi
                        ),
                    out ittemodosuResult
                    );
                Util_IttemodosuRoutine.Before2(
                    ref ittemodosuResult
                    );
                Util_IttemodosuRoutine.After3_ChangeCurrent(
                    model_Taikyoku.Kifu
                    );
            }
            movedKoma = ittemodosuResult.FigMovedKoma;
            foodKoma  = ittemodosuResult.FigFoodKoma;

            successful = true;


gt_EndMethod:
            return(successful);
        }
コード例 #13
0
        public string Execute(
            ref KifuParserA_Result result,
            Model_Taikyoku model_Taikyoku,
            out KifuParserA_State nextState,
            KifuParserA owner,
            KifuParserA_Genjo genjo
            )
        {
            // 現局面。
            SkyConst src_Sky = model_Taikyoku.Kifu.CurNode.Value.KyokumenConst;
            //            Debug.Assert(!Util_MasuNum.OnKomabukuro((int)((RO_Star_Koma)src_Sky.StarlightIndexOf((Finger)0).Now).Masu), "カレント、駒が駒袋にあった。");

            bool isHonshogi = true;//FIXME:暫定

            // 現在の手番の開始局面+1
            int korekaranoTemezumi = src_Sky.Temezumi + 1;

            nextState = this;

            if (0 < genjo.InputLine.Trim().Length)
            {
                IMove  nextTe = Util_Sky258A.NullObjectMove;
                string rest;

                //「6g6f」形式と想定して、1手だけ読込み
                string str1;
                string str2;
                string str3;
                string str4;
                string str5;
                string str6;
                string str7;
                string str8;
                string str9;
                if (SfenMovesTextConv.ToTokens(
                        genjo.InputLine, out str1, out str2, out str3, out str4, out str5, out rest)
                    &&
                    !(str1 == "" && str2 == "" && str3 == "" && str4 == "" && str5 == "")
                    )
                {
                    ConvSfenMoveTokens.ToMove(
                        isHonshogi,
                        str1,  //123456789 か、 PLNSGKRB
                        str2,  //abcdefghi か、 *
                        str3,  //123456789
                        str4,  //abcdefghi
                        str5,  //+
                        out nextTe,
                        model_Taikyoku.Kifu,
                        "棋譜パーサーA_SFENパース1"
                        );
                }
                else
                {
                    //>>>>> 「6g6f」形式ではなかった☆

                    //「▲6六歩」形式と想定して、1手だけ読込み
                    if (Conv_JsaFugoText.ToTokens(
                            genjo.InputLine, out str1, out str2, out str3, out str4, out str5, out str6, out str7, out str8, out str9, out rest, model_Taikyoku.Kifu))
                    {
                        if (!(str1 == "" && str2 == "" && str3 == "" && str4 == "" && str5 == "" && str6 == "" && str7 == "" && str8 == "" && str9 == ""))
                        {
                            Conv_JsaFugoTokens.ToMove(
                                str1, //▲△
                                str2, //123…9、123…9、一二三…九
                                str3, //123…9、123…9、一二三…九
                                str4, // “同”
                                str5, //(歩|香|桂|…
                                str6, // 右|左…
                                str7, // 上|引
                                str8, //成|不成
                                str9, //打
                                out nextTe,
                                model_Taikyoku.Kifu
                                );
                        }
                    }
                    else
                    {
                        //「6g6f」形式でもなかった☆

                        Logger.Error($"(^△^)「{genjo.InputLine}」vs【{this.GetType().Name}】 : !? 次の一手が読めない☆ inputLine=[{genjo.InputLine}]");
                        genjo.ToBreak_Abnormal();
                        goto gt_EndMethod;
                    }
                }

                genjo.InputLine = rest;



                if (null != nextTe)
                {
                    IttesasuResult ittesasuResult = new IttesasuResultImpl(Fingers.Error_1, Fingers.Error_1, null, PieceType.None, null);

                    //
                    //FIXME: これが悪さをしていないか☆?
                    //FIXME: スピードが必要なので省略。
                    //Application.DoEvents(); // 時間のかかる処理の間にはこれを挟みます。
                    //

                    //------------------------------
                    // ★棋譜読込専用  駒移動
                    //------------------------------
                    //Logger.Trace($"一手指し開始 : 残りの符号つ「{genjo.InputLine}」");

                    //
                    //↓↓将棋エンジンが一手指し(進める)
                    //
                    Util_IttesasuRoutine.Before1(
                        new IttesasuArgImpl(
                            model_Taikyoku.Kifu.CurNode.Value,
                            src_Sky.KaisiPside,
                            nextTe,            //FIXME: if文で分けているので、これがヌルなはずはないと思うが。
                            korekaranoTemezumi //これから作る局面の、手目済み。
                            ),
                        out ittesasuResult,
                        "KifuParserA_StateA2_SfenMoves#Execute"
                        );

                    Util_IttesasuRoutine.Before2(
                        ref ittesasuResult
                        );

                    //----------------------------------------
                    // 次ノード追加、次ノードをカレントに。
                    //----------------------------------------
                    Util_IttesasuRoutine.After3_ChangeCurrent(
                        model_Taikyoku.Kifu,
                        ConvMoveStrSfen.ToMoveStrSfen(ittesasuResult.Get_SyuryoNode_OrNull.Key),
                        ittesasuResult.Get_SyuryoNode_OrNull
                        );

                    result.Out_newNode_OrNull = ittesasuResult.Get_SyuryoNode_OrNull;
                    //↑↑一手指し

                    //exceptionArea = 1090;
                    //Logger.Trace(Util_Sky307.Json_1Sky(
                    //    src_Sky,
                    //    "一手指し終了",
                    //    "SFENパース2",
                    //    src_Sky.Temezumi//読み進めている現在の手目
                    //    ));
                }
                else
                {
                    genjo.ToBreak_Abnormal();
                    throw new Exception($"\(^o^)/Moveオブジェクトがない☆! inputLine=[{genjo.InputLine}]");
                }
            }
            else
            {
                //Logger.Trace($"(^△^)現局面まで進んだのかだぜ☆?\n{Util_Sky307.Json_1Sky(
                //    src_Sky,
                //    "棋譜パース",
                //    "SFENパース3",
                //    src_Sky.Temezumi//読み進めている現在の手目
                //    )}");
                genjo.ToBreak_Normal();//棋譜パーサーAの、唯一の正常終了のしかた。
            }

gt_EndMethod:
            return(genjo.InputLine);
        }