/// <summary> /// 局面データと、出力ファイル名を指定することで、局面の画像ログを出力します。 /// </summary> /// <param name="ro_Kyokumen1"></param> /// <param name="dstMasu_orMinusOne">あれば、移動先升番号。なければ -1。</param> /// <param name="appendFilepath"></param> /// <param name="outFile"></param> /// <param name="reportEnvironment"></param> /// <returns></returns> public static bool Write1( ISfenPosition1 ro_Kyokumen1, int srcMasu_orMinusOne, int dstMasu_orMinusOne, KyokumenPngArgs_FoodOrDropKoma foodKoma, string sfenMoveStrOrEmpty, string appendFilepath, string outFile, KyokumenPngEnvironment reportEnvironment ) { bool successful = true; //---------------------------------------- // 打った駒を調べる //---------------------------------------- KyokumenPngArgs_FoodOrDropKoma dropKoma; { dropKoma = KyokumenPngArgs_FoodOrDropKoma.UNKNOWN; if ("" != sfenMoveStrOrEmpty) { string moji1; string moji2; string moji3; string moji4; string moji5; string rest; SfenMovesTextConv.ToTokens( sfenMoveStrOrEmpty, out moji1, out moji2, out moji3, out moji4, out moji5, out rest ); if (moji2 == "*") { switch (moji1) { case SfenWord.P_PAWN__: dropKoma = KyokumenPngArgs_FoodOrDropKoma.FU__; break; case SfenWord.L_LANCE_: dropKoma = KyokumenPngArgs_FoodOrDropKoma.KYO_; break; case SfenWord.N_KNIGHT: dropKoma = KyokumenPngArgs_FoodOrDropKoma.KEI_; break; case SfenWord.S_SILVER: dropKoma = KyokumenPngArgs_FoodOrDropKoma.GIN_; break; case SfenWord.G_GOLD__: dropKoma = KyokumenPngArgs_FoodOrDropKoma.KIN_; break; case SfenWord.B_BISHOP: dropKoma = KyokumenPngArgs_FoodOrDropKoma.KAKU; break; case SfenWord.R_ROOK__: dropKoma = KyokumenPngArgs_FoodOrDropKoma.HI__; break; default: break; } } else { dropKoma = KyokumenPngArgs_FoodOrDropKoma.NONE; } } } //---------------------------------------- // ファイルに使える文字に変換 //---------------------------------------- appendFilepath = appendFilepath.Replace('*', '*'); outFile = outFile.Replace('*', '*'); KyokumenPngArgs args = new KyokumenPngArgsImpl( ro_Kyokumen1, srcMasu_orMinusOne, dstMasu_orMinusOne, foodKoma, dropKoma, outFile, reportEnvironment ); // 局面画像を描きだします。 Bitmap bmp = new Bitmap( 2 * (args.Env.KmW + 2 * args.Env.SjW) + Util_KyokumenPngPainter.BN_SUJIS * args.Env.KmW + Util_KyokumenPngPainter.BN_BRD_R_W, Util_KyokumenPngPainter.BN_DANS * args.Env.KmH + Util_KyokumenPngPainter.BN_BRD_B_W ); Util_KyokumenPngPainter.Paint(Graphics.FromImage(bmp), args); //args.Env.OutFolder + args.OutFile, "bmp.Save" string filepath = args.Env.OutFolder + appendFilepath + args.OutFile; // フォルダーが無ければ、作る必要があります。 { DirectoryInfo dirInfo = Directory.GetParent(filepath); if (!Directory.Exists(dirInfo.FullName)) { Directory.CreateDirectory(dirInfo.FullName); } } bmp.Save(filepath); 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); }