public static bool MatchTaikyokusya(string line, ref int caret, out Taikyokusya out_tai #if DEBUG , IDebugMojiretu hyoji #endif ) { Match m = GetTaikyokusyaPattern(PureSettei.fenSyurui).Match(line, caret); if (m.Success) { string tai_moji = m.Groups[1].Value; if (!Med_Parser.Try_MojiToTaikyokusya(PureSettei.fenSyurui, tai_moji, out out_tai)) { // パースエラーの場合(エラーにはしない) return(false); } // キャレットを進めます Util_String.SkipMatch(line, ref caret, m); return(true); } else { out_tai = Taikyokusya.Yososu; return(false); } }
/// <summary> /// 初期局面としてセットするぜ☆(^▽^) /// </summary> public static bool TryFail_SetSyokiKyokumen_ByFen( FenSyurui f, string[] danMojiretu, // [0~3]1段目~4段目、[0~2]1筋目~3筋目 string motigoma, string tb_Mojis //手番 #if DEBUG , IDebugMojiretu dbg_reigai #endif ) { PureMemory.gky_ky.Tukurinaosi_ClearKyokumen(); // 持ち駒パース { //PureMemory.gky_ky.motigomaItiran.Clear(); if ("-" != motigoma)// '-' は持ち駒無し { int maisu = 0; for (int caret = 0; caret < motigoma.Length; caret++) { char ch = motigoma[caret]; int numeric; if (int.TryParse(ch.ToString(), out numeric)) { maisu = maisu * 10 + numeric; } else { Motigoma mk; if (!LisMotiKoma.TryParseFen(f, ch, out mk)) { return(Pure.FailTrue("TryParseFen")); } else { // 枚数の指定がなかったとき(=0)は、1。 PureMemory.gky_ky.motigomaItiran.Set(mk, maisu == 0 ? 1 : maisu); maisu = 0; } } } } } // 盤上の升(既にクリアされているものとするぜ☆) int suji; for (int dan = 1; dan <= danMojiretu.Length; dan++) // 1段目~N段目 の順に解析。 { // // "2z" のように、3列を 2桁 で表記しているので、タテ筋のループ・カウントの数え方には注意だぜ☆(^~^) // suji = 1; int ruikeiKuhakuSu = 0; //累計空白数 bool isPowerupKoma = false; //パワーアップ駒(成りゴマ) for (int caret = 0; //caret < 3 && caret < danMojiretu[dan - 1].Length // 可変長配列☆ ; caret++) { char moji = danMojiretu[dan - 1][caret]; int kuhaku; if ('+' == moji) { isPowerupKoma = true; } else if (int.TryParse(moji.ToString(), out kuhaku)) { // 数字は空き升の個数なので、筋を進めるぜ☆(^▽^) // とりあえず 1~9 まで対応できるだろうなんだぜ☆(^~^) //for (int i = 0; i < kuhaku; i++) //{ ruikeiKuhakuSu = ruikeiKuhakuSu * 10 + kuhaku; //} //Mojiretu reigai1 = new StringBuilder(); //reigai1.AppendLine($"未定義の空白の数 moji=[{moji}]"); //reigai1.AppendLine($"dan =[{dan}]"); //reigai1.AppendLine($"caret =[{caret}]"); //reigai1.AppendLine($"danMojiretu[dan-1] =[{danMojiretu[dan - 1]}]"); //throw new Exception(reigai1.ToContents()); } else { // 駒でした。 if (0 < ruikeiKuhakuSu) { // 空白は置かなくていいのでは? //Masu ms = Conv_Masu.ToMasu(suji, dan); //Koma km_actual = GetBanjoKoma(ms); //HerasuBanjoKoma(ms, km_actual, true); suji += ruikeiKuhakuSu; ruikeiKuhakuSu = 0; } Piece tmp; if (!LisKoma.Try_ParseFen(f, (isPowerupKoma ? $"+{moji}" : moji.ToString()), out tmp)) { #if DEBUG Pure.Sc.AddErr(string.Format("SetNaiyoで未定義の駒が指定されました。 fen moji=[{0}]", moji)); #endif return(Pure.FailTrue("Try_ParseFen")); } isPowerupKoma = false; if (PureMemory.gky_ky.shogiban.TryFail_OkuKoma(//SetNaiyo Conv_Masu.ToMasu(suji, dan), tmp, true #if DEBUG , dbg_reigai #endif )) { return(Pure.FailTrue("TryFail_Oku")); } // あとで適用 suji += 1; } } if (0 < ruikeiKuhakuSu) { // 空白は置かなくていいのでは? //Masu ms = Conv_Masu.ToMasu(suji, dan); //HerasuBanjoKoma(ms, GetBanjoKoma(ms), true); suji += ruikeiKuhakuSu; ruikeiKuhakuSu = 0; } } // 手番 { Taikyokusya syokikyokumenTai; if (!Med_Parser.Try_MojiToTaikyokusya(f, tb_Mojis, out syokikyokumenTai)) { #if DEBUG dbg_reigai.AppendLine(string.Format("SetNaiyoで未定義の手番が指定されたんだぜ☆ isSfen={0} 入力={1} 出力={2}", f, tb_Mojis, syokikyokumenTai )); //reigai1.AppendLine($"ky.Teban=[{PureMemory.gky_ky.yomiKy.teban}]"); //reigai1.AppendLine($"BanTateHaba=[{PureSettei.banTateHaba}]"); dbg_reigai.AppendLine(string.Format("持ち駒数一覧({0}件)", danMojiretu.Length)); foreach (Motigoma mk in Conv_Motigoma.itiran) { dbg_reigai.AppendLine(string.Format("{0}={1}", mk, PureMemory.gky_ky.motigomaItiran.yomiMotigomaItiran.Count(mk))); } #endif return(Pure.FailTrue("Try_Taikyokusya")); //throw new Exception($"対局者のパースエラー tb_Mojis=[{tb_Mojis}]{reigai1.ToContents()}"); } // 先手番始まりか、後手番始まりか、に合わせるぜ☆(^~^) PureMemory.ResetTebanArray(syokikyokumenTai); // 手番には 1 が入っていると思うんだが、無視して 0 スタートに固定するぜ☆(^~^) // PureMemory.ClearTeme(); } return(Pure.SUCCESSFUL_FALSE); }