/// <summary> /// 5枚の将棋盤。P1が「持ち香」のときなどに使用。 /// largeColumnMaxを指定して、3枚 or 5枚の将棋盤にすることも可能。 /// </summary> /// <returns></returns> private static string Format_3or5Shogibans(FeatureVector fv, int p1_base, PpItem_P2Banjo p2Item, int largeColumnMax) { StringBuilder sb = new StringBuilder(); //---------------------------------------- // タイトル行 //---------------------------------------- sb.AppendLine("\"#----------------------------------------\","); sb.Append("\"#"); sb.Append(p2Item.Title); sb.AppendLine("\","); sb.AppendLine("\"#----------------------------------------\","); //---------------------------------------- // 1段で、横に5枚の将棋盤を並べます。 //---------------------------------------- { // 列見出し行を作ります。 sb.Append("\"#");//2文字 for (int largeColumn = 0; largeColumn < largeColumnMax; largeColumn++) { if (largeColumn != 0) { sb.Append(" ");//4文字(列間) } // 大グループの枚数 int maisu = largeColumn; sb.Append(" "); sb.Append(" "); //十の位は空っぽ。 sb.Append(Conv_Int.ToArabiaSuji(maisu % 10)); //一の位。 sb.Append("枚 "); //15文字(3列分) for (int col = 0; col < 6; col++) { sb.Append(" ");//5文字 } } sb.AppendLine("\","); //---------------------------------------- // p2 が 一段~九段 //---------------------------------------- for (int p2Dan = 1; p2Dan < 10; p2Dan++) { // 行頭 sb.Append(" ");//4文字 //---------------------------------------- // 大グループが 0列~9列。 //---------------------------------------- for (int largeColumn = 0; largeColumn < largeColumnMax; largeColumn++) { if (largeColumn != 0) { // 表の横の隙間 sb.Append(" "); } // 大グループの枚数 int maisu = largeColumn; //---------------------------------------- // p2 が 9筋~1筋 //---------------------------------------- for (int p2Suji = 9; p2Suji > 0; p2Suji--) { int pMasu = Util_Masu10.Handle_OkibaSujiDanToMasu(Okiba.ShogiBan, p2Suji, p2Dan); int p1 = p1_base + maisu; int p2 = p2Item.P2_base + pMasu; if (Const_FeatureVectorFormat.PARAMETER_INDEX_OUTPUT) { sb.Append(string.Format("{0,4}_{1,4}", p1, p2)); } else { // スコアの倍率を復元します。 float scoreF = fv.NikomaKankeiPp_ForMemory[p1, p2] / fv.Bairitu_NikomaKankeiPp; int value = (int)Math.Round(scoreF, 0);//小数点以下を丸めます。 sb.Append(string.Format("{0,4}", value)); } sb.Append(","); } } // 次の段へ sb.AppendLine(); } // 段の隙間 sb.AppendLine(); } return(sb.ToString()); }
/// <summary> /// 19枚の将棋盤。P1が「持ち歩」のときに使用。 /// </summary> /// <param name="fv"></param> /// <param name="p1_base_motiFu">持ち駒の位置から。</param> /// <param name="p2Item"></param> /// <returns></returns> private static string Format_19Shogibans(FeatureVector fv, int p1_base_motiFu, PpItem_P2Banjo p2Item) { StringBuilder sb = new StringBuilder(); //---------------------------------------- // タイトル行 //---------------------------------------- sb.AppendLine("\"#----------------------------------------\","); sb.Append("\"#"); sb.Append(p2Item.Title); sb.AppendLine("\","); sb.AppendLine("\"#----------------------------------------\","); //---------------------------------------- // 2段を用意します。(大グループ) // 上段が 0~9枚のとき。(10枚の将棋盤) // 下段が 10~18枚のとき。(9枚の将棋盤) //---------------------------------------- for (int largeRow = 0; largeRow < 2; largeRow++) { // 列見出し行を作ります。 sb.Append("\"#");//2文字 for (int largeColumn = 0; largeColumn < 10; largeColumn++) { if (largeRow == 1 && largeColumn == 9) { // 下段には 大10列目はありません。 break; } if (largeColumn != 0) { sb.Append(" ");//4文字(列間) } // 大テーブルの枚数 int maisu = largeRow * 10 + largeColumn; string maisuStr10; if (maisu < 10) { maisuStr10 = " "; } else { maisuStr10 = "1"; } string maisuStr01 = Conv_Int.ToArabiaSuji(maisu % 10); sb.Append(" "); sb.Append(maisuStr10); sb.Append(maisuStr01); sb.Append("枚 ");//15文字(3列分) for (int col = 0; col < 6; col++) { sb.Append(" ");//5文字 } if (Const_FeatureVectorFormat.PARAMETER_INDEX_OUTPUT) { sb.Append(" ");//調整 } } sb.AppendLine("\","); //---------------------------------------- // p2 が 一段~九段 //---------------------------------------- for (int smallDan = 1; smallDan < 10; smallDan++) { // 行頭 sb.Append(" ");//4文字 //---------------------------------------- // 大グループが 0列~9列。 //---------------------------------------- for (int largeColumn = 0; largeColumn < 10; largeColumn++) { if (largeRow == 1 && largeColumn == 9) { // 下段には 大10列目はありません。 break; } if (largeColumn != 0) { // 表の横の隙間 sb.Append(" "); } // 大グループの枚数 int maisu = largeRow * 10 + largeColumn;//0~18 //---------------------------------------- // p2 が 9筋~1筋 //---------------------------------------- for (int smallSuji = 9; smallSuji > 0; smallSuji--) { // 0~80 int smallMasu = Util_Masu10.Handle_OkibaSujiDanToMasu(Okiba.ShogiBan, smallSuji, smallDan); int p1 = p1_base_motiFu + maisu; int p2 = p2Item.P2_base + smallMasu; if (Const_FeatureVectorFormat.PARAMETER_INDEX_OUTPUT) { sb.Append(string.Format("{0,4}_{1,4}", p1, p2)); } else { // スコアの倍率を復元します。 float scoreF = fv.NikomaKankeiPp_ForMemory[p1, p2] / fv.Bairitu_NikomaKankeiPp; int value = (int)Math.Round(scoreF, 0); //小数点以下を丸めます。 sb.Append(string.Format("{0,4}", value)); //アウトプットはok:持ち歩 vs 盤上の駒 } sb.Append(","); } } // 次の段へ sb.AppendLine(); } // 段の隙間 sb.AppendLine(); } return(sb.ToString()); }