public static bool ParseDoMove(Kyokumen ky, out Move out_sasite) { // コンソールからのキー入力を解析するぜ☆(^▽^) int caret = Util_Commandline.Caret; int oldCaret = Util_Commandline.Caret; Util_String.TobasuTangoToMatubiKuhaku(Util_Commandline.Commandline, ref caret, "do "); // うしろに続く文字は☆(^▽^) if (!Med_Parser.TryFenMove(Option_Application.Optionlist.USI, Util_Commandline.Commandline, ref caret, ky.Sindan, out out_sasite)) { Util_Commandline.Caret = oldCaret; //String2 str = new String2Impl(); //str.Append("指し手のパースに失敗だぜ☆(^~^)! #鷺 commandline=["); //str.Append(commandline); //str.Append("] caret=["); //str.Append(caret); //str.Append("]"); //syuturyoku.AppendLine(str.ToString()); //Logger.Flush(); //throw new Exception(str.ToString()); return(false); } // do コマンドだった場合☆ Util_Commandline.Caret = caret; Util_Commandline.CommentCommandline();// コマンドの誤発動防止 return(true); }
public static Move TryFenMove2( bool isSfen, Kyokumen.Sindanyo kys, string str1, string str2, string str3, string str4, string str5 ) { int dstSuji = FenSuji_Int(isSfen, str3); // 至筋 int dstDan = FenDan_Int(isSfen, str4); // 至段 // 取った駒を調べるぜ☆(^▽^) Masu dstMs = Conv_Masu.ToMasu(dstSuji, dstDan); //------------------------------ // 5 //------------------------------ bool natta = false; if ("+" == str5) { // 成りました natta = true; } //------------------------------ // 結果 //------------------------------ if ("*" == str2) { // 駒台から打ったぜ☆ return(ConvMove.ToMove01cUtta( dstMs, Med_Parser.Moji_MotikomaSyurui(isSfen, str1)//打った駒 )); } else { // 盤上の駒を動かしたぜ☆ if (natta) { return(ConvMove.ToMove01bNariSasi(Med_Parser.FenSujiDan_Masu(isSfen, str1, str2), dstMs, kys)); } else { return(ConvMove.ToMove01aNarazuSasi(Med_Parser.FenSujiDan_Masu(isSfen, str1, str2), dstMs, kys)); } } }
public static void Undo(string commandline, Kyokumen ky, StringBuilder syuturyoku) { // うしろに続く文字は☆(^▽^) int caret = 0; Util_String.TobasuTangoToMatubiKuhaku(commandline, ref caret, "undo "); if (!Med_Parser.TryFenMove(Option_Application.Optionlist.USI, commandline, ref caret, ky.Sindan, out Move ss)) { throw new Exception($"パースエラー [{ commandline }]"); } ky.UndoMove(Option_Application.Optionlist.USI, ss, syuturyoku); // このムーブには取った駒は含まれないのでは。 }
public static void Kiki(bool isSfen, string commandline, Kyokumen ky, out Masu out_ms, out Bitboard out_kikiBB) { //KomanoUgokikata komanoUgokikata, // うしろに続く文字は☆(^▽^) int caret = 0; Util_String.TobasuTangoToMatubiKuhaku(commandline, ref caret, "kiki "); string line = commandline.Substring(caret).TrimEnd(); if (line.Length == 2)// kiki b3 { out_kikiBB = null; // 升を返すぜ☆ if (!Med_Parser.TryParseMs(isSfen, commandline, ky, ref caret, out out_ms)) { throw new Exception("パースエラー102"); } } else// kiki b3 R 1 { out_ms = ky.MASU_ERROR; // 盤面表示を返すぜ☆ string moji1 = ""; string moji2 = ""; string moji3 = ""; string moji4 = ""; Match m = Itiran_FenParser.GetKikiCommandPattern(Option_Application.Optionlist.USI).Match(commandline, caret); if (m.Success) { Util_String.SkipMatch(commandline, ref caret, m); moji1 = m.Groups[1].Value; moji2 = m.Groups[2].Value; moji3 = m.Groups[3].Value; moji4 = m.Groups[4].Value; if (!Med_Parser.TryTaikyokusya(Option_Application.Optionlist.USI, moji4, out Option <Phase> phase)) { throw new Exception($"対局者のパースエラー moji4=[{ moji4 }]"); } out_kikiBB = Util_Application.Kiki_BB(Med_Koma.KomasyuruiAndTaikyokusyaToKoma(Med_Parser.Moji_Komasyurui(Option_Application.Optionlist.USI, moji3), phase), Med_Parser.FenSujiDan_Masu(Option_Application.Optionlist.USI, moji1, moji2), ky.Shogiban);// komanoUgokikata } else { out_kikiBB = null; } } }
/// <summary> /// moves 以降の符号を指定しろだぜ☆(^~^) /// </summary> /// <param name="moves"></param> public void AddMoves(bool isSfen, string moves, Kyokumen.Sindanyo kys) { string[] fugoItiran = moves.Split(' '); foreach (string fugo in fugoItiran) { int caret = 0; if (!Med_Parser.TryFenMove(isSfen, fugo, ref caret, kys, out Move move)) { throw new System.Exception($"指し手のパースエラー fugo=[{ fugo }]"); } SsList.Add(move); } }
public static bool TryParse(Kyokumen ky, string commandline, ref int caret, out SeisekiMove out_result, SeisekiKyokumen owner, StringBuilder syuturyoku) { bool successfule = true; // 指し手☆ if (!Med_Parser.TryFenMove(Option_Application.Optionlist.USI, commandline, ref caret, ky.Sindan, out Move ss)) { successfule = false; } // 応手☆ if (!Med_Parser.TryFenMove(Option_Application.Optionlist.USI, commandline, ref caret, ky.Sindan, out Move ss2)) { successfule = false; } // バージョン(これは無いこともある☆ 評価値のパーサーを使いまわし) if (!Conv_Hyokati.TryParse(commandline, ref caret, out int version, syuturyoku)) { version = 0; //successfule = false; } // 勝った回数(評価値のパーサーを使いまわし) if (!Conv_Hyokati.TryParse(commandline, ref caret, out int kati, syuturyoku)) { successfule = false; } // 引き分けた回数 if (!Conv_Hyokati.TryParse(commandline, ref caret, out int hikiwake, syuturyoku)) { successfule = false; } // 負けた回数 if (!Conv_Hyokati.TryParse(commandline, ref caret, out int make, syuturyoku)) { successfule = false; } out_result = new SeisekiMove(ss, ss2, version, kati, hikiwake, make, owner); return(successfule); }
public static bool MoveCmd(string commandline, Kyokumen.Sindanyo kys, out Move out_sasite) { // うしろに続く文字は☆(^▽^) int caret = 0; Util_String.TobasuTangoToMatubiKuhaku(commandline, ref caret, "move "); string line = commandline.Substring(caret).Trim(); // move 912 といった数字かどうか☆(^~^) if (int.TryParse(line, out int ssSuji)) { out_sasite = (Move)ssSuji; return(true); } // 数字でなければ、 move B2B3 といった文字列か☆(^~^) if (Med_Parser.TryFenMove(Option_Application.Optionlist.USI, commandline, ref caret, kys, out out_sasite)) { return(true); } out_sasite = Move.Toryo; return(false); }
/// <summary> /// 定跡ファイルの解析☆(^~^) /// </summary> /// <param name="lines"></param> public void Parse(bool isSfen, string[] lines, StringBuilder syuturyoku) { this.Clear(); Kyokumen ky_forJoseki = new Kyokumen();//使いまわすぜ☆(^▽^) JosekiKyokumen josekiKy = null; JosekiMove josekiSs; Match m; string commandline; for (int iGyoBango = 0; iGyoBango < lines.Length; iGyoBango++) { commandline = lines[iGyoBango]; if (commandline.Length < 1) { // 空行は無視☆ // 半角空白とか、全角空白とか、タブとか 入れてるやつは考慮しないぜ☆(^~^)! } else if ('f' == commandline[0])// fen で始まれば局面データ☆(^▽^)// caret == commandline.IndexOf("fen ", caret) { // キャレットは進めずに続行だぜ☆(^▽^) m = Itiran_FenParser.GetJosekiKyPattern(Option_Application.Optionlist.USI).Match(commandline);//, caret if (!m.Success) { StringBuilder reigai1 = new StringBuilder(); reigai1.AppendLine($@"パースに失敗だぜ☆(^~^)! #寿 定跡ファイル解析失敗 commandline=[{ commandline }]"); #if DEBUG reigai1.Append(" ["); reigai1.Append(iGyoBango.ToString()); reigai1.Append("]行目"); #endif syuturyoku.AppendLine(reigai1.ToString()); var msg = syuturyoku.ToString(); Logger.Flush(msg); syuturyoku.Clear(); throw new Exception(msg); } // .Value は、該当しないときは空文字列か☆ // .Value は、該当しないときは空文字列か☆ if (Itiran_FenParser.STARTPOS_LABEL == m.Groups[1].Value) { DanStrings = Itiran_FenParser.GetStartpos(Option_Application.Optionlist.USI).Split('/'); } else { DanStrings = m.Groups[1].Value.Split('/'); // N段目 } ky_forJoseki.SetNaiyo( isSfen, true, //適用 false, Joseki.DanStrings, //1~N 段目 m.Groups[2].Value, m.Groups[3].Value, //手番 syuturyoku ); /* #if DEBUG * { * Kyokumen ky3 = new KyokumenImpl(); * int caret = 0; * ky3.ParseFen(commandline, ref caret, false, syuturyoku); * ulong newHash = ky3.CreateKyokumenHash(); * if (newHash != ky2.KyokumenHash) * { * StringBuilder reigai1 = new StringBuilder(); * reigai1.Append("局面ハッシュが異なるぜ☆(^~^)! commandline=["); * reigai1.Append(commandline); * reigai1.Append("] ky3.AppendFenTo=["); * ky3.AppendFenTo(reigai1); * reigai1.Append("] dan1["); * reigai1.Append(JosekiImpl.DanStrings[0]); * reigai1.Append("] dan2["); * reigai1.Append(JosekiImpl.DanStrings[1]); * reigai1.Append("] dan3["); * reigai1.Append(JosekiImpl.DanStrings[2]); * reigai1.Append("] dan4["); * reigai1.Append(JosekiImpl.DanStrings[3]); * reigai1.Append("] newHash=["); * reigai1.Append(newHash.ToString()); * reigai1.Append("] ky2.KyokumenHash=["); * reigai1.Append(ky2.KyokumenHash.ToString()); * reigai1.Append("]"); * syuturyoku.AppendLine(reigai1.ToString()); * Logger.Flush(syuturyoku); * throw new Exception(reigai1.ToString()); * } * } #endif */ josekiKy = this.ParseKyokumenLine(commandline, ky_forJoseki.KyokumenHash.Value, ky_forJoseki.CurrentOptionalPhase, syuturyoku); } else { // それ以外は手筋☆(^▽^) if (null == josekiKy) { throw new Exception("定跡ファイル解析失敗 定跡局面の指定なし☆"); } // 指し手、指し手、数字、数字、数字 と並んでいるぜ☆(^▽^) m = Itiran_FenParser.GetJosekiSsPattern(Option_Application.Optionlist.USI).Match(commandline); if (!m.Success) { //* // FIXME: syuturyoku.AppendLine($"パースに失敗だぜ☆(^~^)! #鮪 commandline=[{ commandline }]"); var msg = syuturyoku.ToString(); syuturyoku.Clear(); Logger.Flush(msg); throw new Exception(msg); // */ } // 高速化のために、ローカル変数を減らして、詰め込んだコードにしているぜ☆(>_<) // 第1引数 B1C1 や toryo のような指し手の解析。 josekiSs = new JosekiMove( // 1列目:指し手☆ (1:グループ,2:指し手全体,3~7:指し手各部,8:投了) m.Groups[8].Success ? Move.Toryo : // "toryo" が入っている場合☆ Med_Parser.TryFenMove2(Option_Application.Optionlist.USI, ky_forJoseki.Sindan, m.Groups[3].Value, m.Groups[4].Value, m.Groups[5].Value, m.Groups[6].Value, m.Groups[7].Value ), // 2列目:応手☆ none とか。(9:グループ,10:none,11:指し手全体,12~16:指し手各部,17:投了) m.Groups[10].Success || m.Groups[17].Success ? Move.Toryo :// [10]"none" または[17]"toryo" が入っている場合☆ FIXME: none と toryo を区別してないぜ☆(^~^) Med_Parser.TryFenMove2(Option_Application.Optionlist.USI, ky_forJoseki.Sindan, m.Groups[12].Value, m.Groups[13].Value, m.Groups[14].Value, m.Groups[15].Value, m.Groups[16].Value ), (Hyokati)int.Parse(m.Groups[18].Value), //hyokati (18) 解析はokなはず☆ int.Parse(m.Groups[19].Value), //fukasa (19) 解析はokなはず☆ int.Parse(m.Groups[20].Value), //version (20) 解析はokなはず☆(旧版ではバージョンは無いこともある☆) josekiKy ); // 定跡ファイルの局面には、重複指し手データがないようにしてくれだぜ☆(^~^)チェックは省くぜ☆ /* * if (josekiKy.SsItems.ContainsKey(josekiSs.Move)) * { * // FIXME: * String2 str = new String2Impl(); * str.Append("局面データに重複の指し手があるぜ☆(^~^)! 局面=["); * str.Append(josekiKy.Fen); * str.Append("] 指し手=["); * ConvMove.Setumei(josekiSs.Move,str); * str.Append("]"); * Util_Machine.AppendLine(str.ToString()); * Logger.Flush(); * throw new Exception(str.ToString()); * } * else * { * // */ // 新規 //#if DEBUG // // 指し手の整合性をチェックしておきたいぜ☆(^▽^) // { // Kyokumen ky2 = new KyokumenImpl(); // if (!ky2.ParseFen(ky.ToFen(), false)) // { // string msg = "新規: パースに失敗だぜ☆(^~^)!"; // Face_Application.MessageLine(msg); // Face_Application.Write(); // throw new Exception(msg); // } // Move bestMove; // int caret_test = 0; // ConvMove.TryParse(commandline, ref caret_test, ky2, out bestMove); // MoveError reason; // if (!ky2.CanDoMove( bestMove, out reason)) // { // throw new Exception($"新規: 指せない指し手を定跡に登録しようとしたぜ☆(^~^)!:{ConvMove.Setumei(reason)}"); // } // } //#endif josekiKy.SsItems.Add(josekiSs.Move, josekiSs); this.Edited = true; //} } } }