/// <summary> /// 1重の入れ子の将棋盤。持ち駒の一覧に利用。 /// </summary> /// <returns></returns> private static string Format_SingleShogiban(FeatureVector fv, Playerside pside, Kp_P2Item kp_p2Item) { StringBuilder sb = new StringBuilder(); //---------------------------------------- // タイトル行 //---------------------------------------- sb.AppendLine("\"#----------------------------------------\","); sb.Append("\"#"); sb.Append(kp_p2Item.Title); sb.AppendLine("\","); sb.AppendLine("\"#----------------------------------------\","); //---------------------------------------- // K が 一段~九段 //---------------------------------------- for (int kDan = 1; kDan < 10; kDan++) { // 行頭 sb.Append(" ");//4文字 //---------------------------------------- // K が 9筋~1筋 //---------------------------------------- for (int kSuji = 9; kSuji > 0; kSuji--) { //int kMasu = Util_Masu10.Handle_OkibaSujiDanToMasu(Okiba.ShogiBan, kSuji, kDan); int k1; Conv_FvKoumoku522.Converter_K1_to_P(pside, kDan, kSuji, out k1); int p2 = kp_p2Item.P2; if (Const_FeatureVectorFormat.PARAMETER_INDEX_OUTPUT) { sb.Append(string.Format("{0,4}_{1,4}", k1, p2)); } else { // スコアの倍率を復元します。 float scoreF = fv.NikomaKankeiPp_ForMemory[k1, p2] / fv.Bairitu_NikomaKankeiPp; int value = (int)Math.Round(scoreF, 0);//小数点以下を丸めます。 sb.Append(string.Format("{0,4}", value)); } sb.Append(","); } // 次の段へ sb.AppendLine(); } return(sb.ToString()); }
/// <summary> /// 2駒関係[KK]用。 /// フィーチャーベクターの調査項目インデックス。該当なければ-1。 /// </summary> /// <param name="pside">プレイヤーサイド</param> /// <param name="komasyurui">盤上の種類</param> /// <param name="masu">盤上の駒の升</param> /// <returns></returns> public static int ToKIndex_From_PsideBanjoKomasyuruiMasu(SkyConst src_Sky, Playerside pside) { // 調査項目番号(K1、K2等) int result; SyElement masu; { Finger figK1 = Util_Sky_FingersQuery.InOkibaPsideKomasyuruiNow(src_Sky, Okiba.ShogiBan, pside, PieceType.K).ToFirst(); RO_Star komaK1 = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figK1).Now); masu = komaK1.Masu; } if (Okiba.ShogiBan != Conv_SyElement.ToOkiba(masu)) { // 盤上でなければ。 result = -1; goto gt_EndMethod; } int kSuji; Util_MasuNum.TryMasuToSuji(masu, out kSuji); int kDan; Util_MasuNum.TryMasuToDan(masu, out kDan); int p1; Conv_FvKoumoku522.Converter_K1_to_P(Playerside.P1, kDan, kSuji, out p1); result = p1; gt_EndMethod: ; return(result); }
/// <summary> /// 2重の入れ子の将棋盤。 /// </summary> /// <returns></returns> private static string Format_NestedShogiban(FeatureVector fv, Playerside pside, Kp_P2Item kp_p2item) { StringBuilder sb = new StringBuilder(); //---------------------------------------- // タイトル行 //---------------------------------------- sb.AppendLine("\"#----------------------------------------\","); sb.Append("\"#"); sb.Append(kp_p2item.Title); sb.AppendLine("\","); sb.AppendLine("\"#----------------------------------------\","); //---------------------------------------- // K が 一段~九段 //---------------------------------------- for (int kDan = 1; kDan < 10; kDan++) { // 列見出し行を作ります。 sb.Append("\"#");//2文字 string danStr = Conv_Int.ToKanSuji(kDan); for (int suji = 9; suji > 0; suji--) { if (suji != 9) { sb.Append(" ");//4文字(列間) } string sujiStr = Conv_Int.ToArabiaSuji(suji); sb.Append(" "); sb.Append(sujiStr); sb.Append(danStr); sb.Append("玉 ");//15文字(3列分) for (int col = 0; col < 6; col++) { sb.Append(" ");//5文字 } if (Const_FeatureVectorFormat.PARAMETER_INDEX_OUTPUT) { sb.Append(" ");//調整 } } sb.AppendLine("\","); //---------------------------------------- // P が 一段~九段 //---------------------------------------- for (int pDan = 1; pDan < 10; pDan++) { // 行頭 sb.Append(" ");//4文字 //---------------------------------------- // K が 9筋~1筋 //---------------------------------------- for (int kSuji = 9; kSuji > 0; kSuji--) { if (kSuji != 9) { // 表の横の隙間 sb.Append(" "); } int p1; Conv_FvKoumoku522.Converter_K1_to_P(pside, kDan, kSuji, out p1); //int kMasu = Util_Masu10.Handle_OkibaSujiDanToMasu(Okiba.ShogiBan, kSuji, kDan); //---------------------------------------- // P が 9筋~1筋 //---------------------------------------- for (int pSuji = 9; pSuji > 0; pSuji--) { int pMasu = Util_Masu10.Handle_OkibaSujiDanToMasu(Okiba.ShogiBan, pSuji, pDan); if (Const_FeatureVectorFormat.PARAMETER_INDEX_OUTPUT) { int p2 = kp_p2item.P2 + pMasu; sb.Append(string.Format("{0,4}_{1,4}", p1, p2)); } else { // スコアの倍率を復元します。 float scoreF = fv.NikomaKankeiPp_ForMemory[p1, kp_p2item.P2 + pMasu] / 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> /// テキストを作ります。 /// </summary> /// <param name="fv"></param> /// <returns></returns> public static string Format_KK(FeatureVector fv) { StringBuilder sb = new StringBuilder(); // // コメント // sb.AppendLine("\"#紹介文\","); sb.AppendLine("\"#\","); sb.AppendLine("\"#ボナンザ6.0アレンジ式きふわらべ2駒関係\","); sb.AppendLine("\"#\","); sb.AppendLine("\"#----------------------------------------\","); sb.AppendLine("\"#KK表☆\","); sb.AppendLine("\"#----------------------------------------\","); sb.AppendLine("\"#\","); sb.AppendLine("\"#常に先手は正の数、後手は負の数の絶対値が大きい方が有利。0は互角。\","); // // 仕様バージョン // sb.AppendLine(); sb.AppendLine("\"Version\",1.0,"); sb.AppendLine(); //---------------------------------------- // プレイヤー1のK が 一段~九段 //---------------------------------------- for (int k1dan = 1; k1dan < 10; k1dan++) { // コメント行を作ります。 sb.Append("\"#KK");//4文字 string danStr = Conv_Int.ToKanSuji(k1dan); for (int suji = 9; suji > 0; suji--) { string sujiStr = Conv_Int.ToArabiaSuji(suji); sb.Append(" "); sb.Append(sujiStr); sb.Append(danStr); sb.Append("1P玉 vs2P玉 ");//15文字 for (int col = 0; col < 5; col++) { sb.Append(" "); //5文字 } sb.Append(" "); //5文字 if (Const_FeatureVectorFormat.PARAMETER_INDEX_OUTPUT) { sb.Append(" ");//調整 } } sb.AppendLine("\","); //---------------------------------------- // プレイヤー2のK が 一段~九段 //---------------------------------------- for (int k2dan = 1; k2dan < 10; k2dan++) { // 行頭 sb.Append(" ");//4文字 //---------------------------------------- // プレイヤー1のK が 9筋~1筋 //---------------------------------------- for (int k1suji = 9; k1suji > 0; k1suji--) { int p1; int p2; //---------------------------------------- // プレイヤー2のK が 9筋~1筋 //---------------------------------------- for (int k2suji = 9; k2suji > 0; k2suji--) { int k2masu = Util_Masu10.Handle_OkibaSujiDanToMasu(Okiba.ShogiBan, k2suji, k2dan); Conv_FvKoumoku522.Converter_KK_to_PP(k1dan, k2dan, k1suji, k2suji, out p1, out p2); 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.Append(" "); } // 次の段へ sb.AppendLine(); } // 段の隙間 sb.AppendLine(); } return(sb.ToString()); }