/// <summary> /// 指し手の±部 /// </summary> private static void ReadPlaceMinusMove(string line, CsaKifuImpl csaKifuData) { if (line.Length < 7) { goto gt_EndMethod; } CsaKifuMove move = new CsaKifuMoveImpl(); // 1文字目 switch (line[0]) { case '+': move.Sengo = line[0].ToString(); break; case '-': move.Sengo = line[0].ToString(); break; } // 2~3文字目 move.SourceMasu = line.Substring(1, 2); // 4~5文字目 move.DestinationMasu = line.Substring(3, 2); // 6~7文字目 move.Syurui = line.Substring(5, 2); // オプション。手目済み。 move.OptionTemezumi = csaKifuData.MoveList.Count + 1; csaKifuData.MoveList.Add(move); gt_EndMethod: ; }
/// <summary> /// N部。 /// </summary> /// <param name="line"></param> private static void ReadN(string line, CsaKifuImpl csaKifuData) { if (line.Length < 2) { goto gt_EndMethod; } // 2文字目が「+」なら先手の名前、「-」なら後手の名前。 switch (line[1]) { case '+': csaKifuData.Player1Name = line.Substring(2); break; case '-': csaKifuData.Player2Name = line.Substring(2); break; default: break; } gt_EndMethod: ; }
/// <summary> /// T部。 /// </summary> /// <param name="line"></param> private static void ReadT(string line, CsaKifuImpl csaKifuData) { if (line.Length < 2) { goto gt_EndMethod; } if (csaKifuData.MoveList.Count < 1) { goto gt_EndMethod; } int second; if (int.TryParse(line.Substring(1), out second)) { csaKifuData.MoveList.Last().Second = second; } gt_EndMethod: ; }
public static CsaKifu ReadFile(string filepath) { CsaKifuImpl csaKifuData = new CsaKifuImpl(); if (!File.Exists(filepath)) { MessageBox.Show($@"ファイルがありません。 ファイルパス=[{filepath}]", "エラー"); goto gt_EndMethod; } string[] allLines = File.ReadAllLines(filepath); int phase = 0; foreach (string line in allLines) { if (line.Length < 1) { goto gt_EndLoop1; } gt_Continue1: ; switch (phase) { case 0: // // V,N,$部 // switch (line[0]) { case 'V': Util_Csa.ReadV(line, csaKifuData); break; case 'N': Util_Csa.ReadN(line, csaKifuData); break; case '$': break; // 対局情報は無視します。 case '\'': break; // コメントは無視します。 default: phase = 1; goto gt_Continue1; } break; case 1: // // P部 // switch (line[0]) { case 'P': Util_Csa.ReadP(line, csaKifuData); break; case '\'': break; // コメントは無視します。 default: phase = 2; goto gt_Continue1; } break; case 2: // // ±部 // switch (line[0]) { case '+': //thru case '-': Util_Csa.ReadPlaceMinus_FirstSengo(line, csaKifuData); phase = 3; break; case '\'': break; // コメントは無視します。 default: phase = 3; //本当はエラーのはず。 goto gt_Continue1; } break; case 3: // // 指し手の±部、T部 // switch (line[0]) { case '+': case '-': Util_Csa.ReadPlaceMinusMove(line, csaKifuData); break; case 'T': Util_Csa.ReadT(line, csaKifuData); break; case '\'': break; // コメントは無視します。 default: phase = 4; goto gt_Continue1; } break; case 4: // // %部 // switch (line[0]) { case '%': Util_Csa.ReadFinishedStatus(line, csaKifuData); break; case '\'': break; // コメントは無視します。 default: phase = 5; goto gt_Next1; } break; default: break; } gt_EndLoop1: ; } gt_Next1: ; gt_EndMethod: ; return(csaKifuData); }
/// <summary> /// %部。 /// </summary> private static void ReadFinishedStatus(string line, CsaKifuImpl csaKifuData) { csaKifuData.FinishedStatus = line.Substring(1); }
/// <summary> /// 初手の先後の±部 /// </summary> private static void ReadPlaceMinus_FirstSengo(string line, CsaKifuImpl csaKifuData) { csaKifuData.FirstSengo = line; }
/// <summary> /// V部。 /// </summary> /// <param name="line"></param> private static void ReadV(string line, CsaKifuImpl csaKifuData) { csaKifuData.Version = line.Substring(1); }