public static MoveCharacter Parse(string line, ref int caret) { // うしろに続く文字は☆(^▽^) if (Util_String.MatchAndNext("HyokatiYusen", line, ref caret)) { return(MoveCharacter.HyokatiYusen); } else if (Util_String.MatchAndNext("SyorituYusen", line, ref caret)) { return(MoveCharacter.SyorituYusen); } else if (Util_String.MatchAndNext("SyorituNomi", line, ref caret)) { return(MoveCharacter.SinteYusen); } else if (Util_String.MatchAndNext("SinteYusen", line, ref caret)) { return(MoveCharacter.SinteYusen); } else if (Util_String.MatchAndNext("SinteNomi", line, ref caret)) { return(MoveCharacter.SinteNomi); } else if (Util_String.MatchAndNext("TansakuNomi", line, ref caret)) { return(MoveCharacter.TansakuNomi); } return(MoveCharacter.Yososu);// パース・エラー☆(^▽^) }
/// <summary> /// /// </summary> /// <param name="line">B4B3、または toryo といった文字列を含む行☆</param> /// <param name="caret">文字カーソルの位置</param> /// <param name="ky">取られた駒を調べるために使う☆</param> /// <param name="out_move"></param> /// <returns></returns> public static bool MatchFenMove( FenSyurui f, string line, ref int caret, out Move out_move ) { if (Util_String.MatchAndNext(Itiran_FenParser.GetToryo(f), line, ref caret)) { out_move = Move.Toryo; return(true); } // 「toryo」でも「none」でもなければ、「B4B3」形式と想定して、1手だけ読込み // テキスト形式の符号「A4A3 C1C2 …」の最初の1要素を、切り取ってトークンに分解します。 Match m = Itiran_FenParser.GetMovePattern(f).Match(line, caret); if (!m.Success) { //// 「B4B3」形式ではなかった☆(^△^)!? 次の一手が読めない☆ //string msg = $"指し手のパースに失敗だぜ☆(^~^)! commandline=[{ commandline }] caret=[{ caret }] m.Groups.Count=[{ m.Groups.Count }]"; //Util_Machine.AppendLine(msg); //Util_Machine.Flush(); //throw new Exception(msg); out_move = Move.Toryo; return(false); } // m.Groups[1].Value : ABCabc か、 ZKH // m.Groups[2].Value : 1234 か、 * // m.Groups[3].Value : ABCabc // m.Groups[4].Value : 1234 // m.Groups[5].Value : + // カーソルを進めるぜ☆(^~^) Util_String.SkipMatch(line, ref caret, m); // 符号1「B4B3」を元に、move を作ります。 out_move = TryFenMove2( f, m.Groups[1].Value, m.Groups[2].Value, m.Groups[3].Value, m.Groups[4].Value, m.Groups[5].Value ); Debug.Assert((int)out_move != -1, ""); return(true); }
// /// <summary> // /// コンピューターに思考させます。 // /// ここが入り口です。 // /// </summary> // /// <param name="gky"></param> // /// <param name="out_hyokatiUtiwake"></param> // /// <param name="dlgt_CreateJoho"></param> // /// <param name="hyoji"></param> // /// <returns></returns> // public static bool TryFail_Go( // out Move out_move, // Genkyoku gky, // out HyokatiAb out_hyokatiUtiwake, // StringBuilder hyoji // ) // { // if (Util_Tansaku.TryFail_Go(out out_move, gky, out out_hyokatiUtiwake, hyoji)) // { // return Pure.FailTrue("Util_Tansaku.Try_Go" //#if DEBUG // , (IDebugMojiretu)hyoji //#endif // ); // } // return Pure.SUCCESSFUL_FALSE; // } /// <summary> /// 2017-11-08 undo の後ろには 符号を付けないように変更☆(^~^) /// </summary> /// <param name="line"></param> /// <param name="hyoji"></param> /// <returns></returns> public static bool Try_Undo(string line, StringBuilder hyoji) { // うしろに続く文字は☆(^▽^) int caret = 0; if (Util_String.MatchAndNext("undo", line, ref caret)) { if (UndoMoveOpe.TryFailUndoMove( #if DEBUG PureSettei.fenSyurui , (IDebugMojiretu)hyoji #endif )) { return(false); } } return(true); }
public static Motigoma Yomu_Motikoma(FenSyurui f, string line, ref int caret, ref bool sippai, StringBuilder hyoji) { if (sippai) { hyoji.AppendLine("failure 持ち駒"); return(Motigoma.Yososu); } foreach (Motigoma mk in Conv_Motigoma.itiran) { if (Util_String.MatchAndNext(SpkMotiKoma.GetFen(f, mk), line, ref caret)) { return(mk); } } sippai = true; hyoji.AppendLine("failure 持ち駒"); return(Motigoma.Yososu); }
/// <summary> /// /// </summary> /// <param name="line">コマンドライン</param> /// <param name="ky2"></param> /// <param name="hyoji"></param> public static void Set( string line, StringBuilder hyoji ) { int caret = 0; if (Util_String.MatchAndNext("set", line, ref caret)) { #region BanTateHaba if (Util_String.MatchAndNext("BanTateHaba", line, ref caret)) { // うしろに続く文字は☆(^▽^) string rest = line.Substring(caret); if (int.TryParse(rest, out int val)) { PureSettei.banTateHabaOld = PureSettei.banTateHaba; PureSettei.banTateHaba = val; // 縦幅と横幅は続けて変えることが多いんで、 // 駒の動きの作り直しは別コマンドに分けて行えだぜ☆(^~^) } } #endregion #region BanYokoHaba else if (Util_String.MatchAndNext("BanYokoHaba", line, ref caret)) { // うしろに続く文字は☆(^▽^) string rest = line.Substring(caret); if (int.TryParse(rest, out int val)) { PureSettei.banYokoHabaOld = PureSettei.banYokoHaba; PureSettei.banYokoHaba = val; // 縦幅と横幅は続けて変えることが多いんで、 // 駒の動きの作り直しは別コマンドに分けて行えだぜ☆(^~^) } } #endregion #region FEN else if (Util_String.MatchAndNext("FEN", line, ref caret)) { // うしろに続く文字は☆(^▽^) string rest = line.Substring(caret); switch (rest) { case "dfen": PureSettei.fenSyurui = FenSyurui.dfe_n; break; case "sfen": PureSettei.fenSyurui = FenSyurui.sfe_n; break; default: throw new Exception(string.Format("未定義 {0}", rest)); } } #endregion #region GameRule else if (Util_String.MatchAndNext("GameRule", line, ref caret)) { if (Util_String.MatchAndNext("DobutuShogi", line, ref caret)) { PureSettei.gameRule = GameRule.DobutuShogi; } else if (Util_String.MatchAndNext("HonShogi", line, ref caret)) { PureSettei.gameRule = GameRule.HonShogi; } } #endregion #region HimodukiHyokaTukau else if (Util_String.MatchAndNext("HimodukiHyokaTukau", line, ref caret)) { // うしろに続く文字は☆(^▽^) string rest = line.Substring(caret); if (bool.TryParse(rest, out bool val)) { ComSettei.himodukiHyokaTukau = val; } } #endregion #region IttedumeTukau else if (Util_String.MatchAndNext("IttedumeTukau", line, ref caret)) { // うしろに続く文字は☆(^▽^) string rest = line.Substring(caret); if (bool.TryParse(rest, out bool val)) { PureSettei.ittedumeTukau = val; } } #endregion #region JohoJikan else if (Util_String.MatchAndNext("JohoJikan", line, ref caret)) { // うしろに続く文字は☆(^▽^) string rest = line.Substring(caret); if (int.TryParse(rest, out int val)) { ComSettei.johoJikan = val; } } #endregion #region P1Char else if (Util_String.MatchAndNext("P1Char", line, ref caret)) { // うしろに続く文字は☆(^▽^) PureSettei.char_playerN[(int)Taikyokusya.T1] = LisMoveCharacter.Parse(line, ref caret); } #endregion #region P1Com else if (Util_String.MatchAndNext("P1Com", line, ref caret)) { // うしろに続く文字は☆(^▽^) string rest = line.Substring(caret); if (bool.TryParse(rest, out bool val)) { PureSettei.p1Com = val; } } #endregion #region P1Name else if (Util_String.MatchAndNext("P1Name", line, ref caret)) { // うしろに続く文字は☆(^▽^) PureSettei.name_playerN[(int)Taikyokusya.T1] = line.Substring(caret); } #endregion #region P2Char else if (Util_String.MatchAndNext("P2Char", line, ref caret)) { // うしろに続く文字は☆(^▽^) PureSettei.char_playerN[(int)Taikyokusya.T2] = LisMoveCharacter.Parse(line, ref caret); } #endregion #region P2Com else if (Util_String.MatchAndNext("P2Com", line, ref caret)) { // うしろに続く文字は☆(^▽^) string rest = line.Substring(caret); if (bool.TryParse(rest, out bool val)) { PureSettei.p2Com = val; } } #endregion #region P2Name else if (Util_String.MatchAndNext("P2Name", line, ref caret)) { // うしろに続く文字は☆(^▽^) PureSettei.name_playerN[(int)Taikyokusya.T2] = line.Substring(caret); } #endregion #region RenzokuTaikyoku else if (Util_String.MatchAndNext("RenzokuTaikyoku", line, ref caret)) { // うしろに続く文字は☆(^▽^) string rest = line.Substring(caret); if (bool.TryParse(rest, out bool val)) { ConsolegameSettei.renzokuTaikyoku = val; } } #endregion #region SaidaiFukasa else if (Util_String.MatchAndNext("SaidaiFukasa", line, ref caret)) { // うしろに続く文字は☆(^▽^) string rest = line.Substring(caret); if (int.TryParse(rest, out int val)) { ComSettei.saidaiFukasa = val; if (PureMemory.MaxMoveDepth - 1 < ComSettei.saidaiFukasa) { ComSettei.saidaiFukasa = PureMemory.MaxMoveDepth - 1; hyoji.AppendLine($"(^q^)実装の上限の [{ (PureMemory.MaxMoveDepth - 1) }] に下げたぜ☆"); } } } #endregion #region SikoJikan else if (Util_String.MatchAndNext("SikoJikan", line, ref caret)) { // うしろに続く文字は☆(^▽^) string rest = line.Substring(caret); if (long.TryParse(rest, out long val)) { ComSettei.sikoJikan = val; } } #endregion #region SikoJikanRandom else if (Util_String.MatchAndNext("SikoJikanRandom", line, ref caret)) { // うしろに続く文字は☆(^▽^) string rest = line.Substring(caret); if (int.TryParse(rest, out int val)) { ComSettei.sikoJikanRandom = val; } } #endregion #region TobikikiTukau else if (Util_String.MatchAndNext("TobikikiTukau", line, ref caret)) { // うしろに続く文字は☆(^▽^) string rest = line.Substring(caret); if (bool.TryParse(rest, out bool val)) { PureSettei.tobikikiTukau = val; } } #endregion #region UseTimeOver else if (Util_String.MatchAndNext("UseTimeOver", line, ref caret)) { // うしろに続く文字は☆(^▽^) string rest = line.Substring(caret); if (bool.TryParse(rest, out bool val)) { ComSettei.useTimeOver = val; } } #endregion #region USI else if (Util_String.MatchAndNext("USI", line, ref caret)) { // うしろに続く文字は☆(^▽^) string rest = line.Substring(caret); if (bool.TryParse(rest, out bool val)) { PureSettei.usi = val; } } #endregion } else { // 該当しないものは無視だぜ☆(^▽^) } }