/// <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); }
/// <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); }
/// <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 // ); //} }
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); }
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); }
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); }
/// <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); }
/// <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); //指定の初期局面 } }
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 = ""; }
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); }
/// <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); }
/// <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); }
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); }