/// <summary> /// /// </summary> /// <param name="commandline">B4B3、または toryo といった文字列を含む行☆</param> /// <param name="caret">文字カーソルの位置</param> /// <param name="ky">取られた駒を調べるために使う☆</param> /// <param name="out_sasite"></param> /// <returns></returns> public static bool TryFenMove( bool isSfen, string commandline, ref int caret, Kyokumen.Sindanyo kys, out Move out_sasite ) { if ('n' == commandline[caret]) { if (caret == commandline.IndexOf("none", caret))//定跡ファイルの応手が無いときに利用☆ { Util_String.TobasuTangoToMatubiKuhaku(commandline, ref caret, "none"); out_sasite = Move.Toryo; return(true); } } else //if ('t' == commandline[caret]) //{ if (caret == commandline.IndexOf(Itiran_FenParser.GetToryo(isSfen), caret)) { Util_String.TobasuTangoToMatubiKuhaku(commandline, ref caret, Itiran_FenParser.GetToryo(isSfen)); out_sasite = Move.Toryo; return(true); } //} // 「toryo」でも「none」でもなければ、「B4B3」形式と想定して、1手だけ読込み // テキスト形式の符号「A4A3 C1C2 …」の最初の1要素を、切り取ってトークンに分解します。 Match m = Itiran_FenParser.GetMovePattern(isSfen).Match(commandline, caret); if (!m.Success) { //// 「B4B3」形式ではなかった☆(^△^)!? 次の一手が読めない☆ //string msg = $"指し手のパースに失敗だぜ☆(^~^)! commandline=[{ commandline }] caret=[{ caret }] m.Groups.Count=[{ m.Groups.Count }]"; //Util_Machine.AppendLine(msg); //Logger.Flush(); //throw new Exception(msg); out_sasite = 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(commandline, ref caret, m); // 符号1「B4B3」を元に、move を作ります。 out_sasite = TryFenMove2( isSfen, kys, m.Groups[1].Value, m.Groups[2].Value, m.Groups[3].Value, m.Groups[4].Value, m.Groups[5].Value ); Debug.Assert((int)out_sasite != -1, ""); return(true); }
/// <summary> /// 改造FEN符号表記 /// </summary> /// <returns></returns> public static void AppendFenTo(bool isSfen, Move ss, StringBuilder syuturyoku) { if (Move.Toryo == ss) { syuturyoku.Append(Itiran_FenParser.GetToryo(isSfen)); return; } int v = (int)ss;//バリュー(ビットフィールド) // 打った駒の種類(取り出すのは難しいので関数を使う☆) MotiKomasyurui mksUtta = GetUttaKomasyurui(ss); if (MotiKomasyurui.Yososu != mksUtta)//指定があれば { // 打でした。 // (自)筋・(自)段は書かずに、「P*」といった表記で埋めます。 Conv_MotiKomasyurui.AppendFenTo(isSfen, mksUtta, syuturyoku); syuturyoku.Append("*"); } else { //------------------------------------------------------------ // (自)筋 //------------------------------------------------------------ if (Option_Application.Optionlist.USI) { syuturyoku.Append(Option_Application.Optionlist.BanYokoHaba + 1 - GetSrcSuji_WithoutErrorCheck(v)); } else { syuturyoku.Append(Conv_Kihon.ToAlphabetLarge(GetSrcSuji_WithoutErrorCheck(v))); } //------------------------------------------------------------ // (自)段 //------------------------------------------------------------ if (Option_Application.Optionlist.USI) { syuturyoku.Append(Conv_Kihon.ToAlphabetSmall(GetSrcDan_WithoutErrorCheck(v))); } else { syuturyoku.Append(GetSrcDan_WithoutErrorCheck(v).ToString()); } } //------------------------------------------------------------ // (至)筋 //------------------------------------------------------------ if (Option_Application.Optionlist.USI) { syuturyoku.Append(Option_Application.Optionlist.BanYokoHaba + 1 - GetDstSuji_WithoutErrorCheck(v)); } else { syuturyoku.Append(Conv_Kihon.ToAlphabetLarge(GetDstSuji_WithoutErrorCheck(v))); } //------------------------------------------------------------ // (至)段 //------------------------------------------------------------ if (Option_Application.Optionlist.USI) { syuturyoku.Append(Conv_Kihon.ToAlphabetSmall(GetDstDan_WithoutErrorCheck(v))); } else { syuturyoku.Append(GetDstDan_WithoutErrorCheck(v).ToString()); } //------------------------------------------------------------ // 成 //------------------------------------------------------------ int natta; { // (v & m) >> s + 1。 v:バリュー、m:マスク、s:シフト natta = (v & (int)MoveMask.Natta) >> (int)MoveShift.Natta; } if (1 == natta) { syuturyoku.Append("+"); } }