/// <summary> /// 段 /// </summary> /// <param name="isSfen"></param> /// <param name="suji"></param> /// <returns></returns> public static int FenDan_Int(bool isSfen, string dan) { if (isSfen) { return(Conv_Kihon.AlphabetToInt(dan)); } else { if (!int.TryParse(dan, out int iDan)) { throw new Exception($"パース失敗 dan=[{ dan }]"); } return(iDan); } }
///// <summary> ///// ///// </summary> ///// <param name="out_restString"></param> ///// <param name="commandline">B3といった文字列☆</param> ///// <returns></returns> //public static bool TryParseMs( // string commandline, // Kyokumen ky, // ref int caret, // out Masu result //) //{ // //「B4」形式と想定 // // テキスト形式の符号「A4 …」の最初の1要素を、切り取ってトークンに分解します。 // //------------------------------------------------------------ // // リスト作成 // //------------------------------------------------------------ // Match m = Itiran_FenParser.GetMasuMovePattern(Option_Application.Optionlist.USI).Match(commandline, caret); // if (m.Success) // { // Util_String.SkipMatch(commandline, ref caret, m); // // 符号1「B4」を元に、Masu を作ります。 // // 盤上の駒を動かしたぜ☆ // result = Med_Parser.FenSujiDan_Masu( // Option_Application.Optionlist.USI, // m.Groups[1].Value, //ABCabc か、 ZKH // m.Groups[2].Value //1234 か、 * // ); // return true; // } // // 「B4B3」形式ではなかった☆(^△^)!? 次の一手が読めない☆ // result = ky.MASU_ERROR; // return false; //} /// <summary> /// 筋 /// </summary> /// <param name="isSfen"></param> /// <param name="suji"></param> /// <returns></returns> public static int FenSuji_Int(bool isSfen, string suji) { if (isSfen) { if (!int.TryParse(suji, out int iSuji)) { throw new Exception($"パース失敗 suji=[{suji}]"); } return(Option_Application.Optionlist.BanYokoHaba + 1 - iSuji); } else { return(Conv_Kihon.AlphabetToInt(suji)); } }
//private static Option<T> Option<T>(T white) //{ // throw new NotImplementedException(); //} /// <summary> /// 将棋盤をコンソールへ出力するぜ☆(^▽^) /// コンソールでゲームするのに向いた表示☆ /// </summary> /// <returns></returns> public static void Setumei_NingenGameYo(Kyokumen ky, StringBuilder syuturyoku) { // 1行目 { // 千日手 int sennitite = ky.Konoteme.GetSennititeCount(); if (Const_Game.SENNITITE_COUNT == sennitite) { Conv_Taikyokusya.Setumei_Name(Conv_Taikyokusya.Reverse(ky.CurrentOptionalPhase), syuturyoku); syuturyoku.Append("の着手にて 千日手"); syuturyoku.AppendLine(); } else if (1 < sennitite) { syuturyoku.Append("同一局面反復 "); syuturyoku.Append(sennitite.ToString()); syuturyoku.AppendLine(" 回目"); } else { syuturyoku.AppendLine(); } } // 2行目 { // 何手目 syuturyoku.Append("図は"); syuturyoku.Append(string.Format("{0,3}", ky.Konoteme.ScanNantemadeBango())); syuturyoku.Append("手まで "); // 手番 Conv_Taikyokusya.Setumei_Name(ky.CurrentOptionalPhase, syuturyoku); syuturyoku.Append("の番"); // #仲ルール if (Option_Application.Optionlist.SagareruHiyoko) { syuturyoku.Append(" #仲"); } syuturyoku.AppendLine(); } // 3行目 後手の持ち駒の数 { foreach (MotiKomasyurui mks in Conv_MotiKomasyurui.Itiran) { MotiKoma mk = Med_Koma.MotiKomasyuruiAndPhaseToMotiKoma(mks, OptionalPhase.White); if (ky.MotiKomas.HasMotiKoma(mk)) { syuturyoku.Append(Conv_MotiKomasyurui.GetHyojiName(mks)); syuturyoku.Append(ky.MotiKomas.Get(mk).ToString()); } } syuturyoku.AppendLine(); } // 4行目 { syuturyoku.Append(" "); AppendLine_SujiFugo_Kyokumen(syuturyoku); //syuturyoku.AppendLine(" A B C "); } // 5行目~13行目 // 盤上 { // 5行目 syuturyoku.Append(" "); Util_Information.AppendLine_Top_Kyokumen(1, syuturyoku); // ┌──┬──┬──┐ for (int dan = 0; dan < Option_Application.Optionlist.BanTateHaba; dan++) { // 6,8,10,12行目 syuturyoku.Append(Conv_Kihon.ToZenkakuInteger(dan + 1)); AppendLine_Data_Kyokumen(ky, dan, syuturyoku); if (dan + 1 < Option_Application.Optionlist.BanTateHaba) { // 7,9,11行目 syuturyoku.Append(" "); AppendLine_Middle(1, syuturyoku);//├──┼──┼──┤ } } // 13行目 syuturyoku.Append(" "); AppendLine_Bottom(1, syuturyoku);//└──┴──┴──┘ } // 14行目 { // 先手の持ち駒の数 foreach (MotiKomasyurui mks in Conv_MotiKomasyurui.Itiran) { MotiKoma mk = Med_Koma.MotiKomasyuruiAndPhaseToMotiKoma(mks, OptionalPhase.Black); if (ky.MotiKomas.HasMotiKoma(mk)) { syuturyoku.Append(Conv_MotiKomasyurui.GetHyojiName(mks)); syuturyoku.Append(ky.MotiKomas.Get(mk).ToString()); } } syuturyoku.AppendLine(); } }
public static void Setumei(Masu ms, Kyokumen ky, StringBuilder syuturyoku) { syuturyoku.Append(Conv_Kihon.ToAlphabetLarge(ky.ToSuji_WithError(ms))); syuturyoku.Append(ky.ToDan_WithError(ms).ToString()); }
/// <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("+"); } }