/// <summary> /// 「0」→「1一」。 /// </summary> /// <param name="hMasu"></param> /// <returns></returns> public static string Handle_To_Label(int hMasu) { string result; if (0 <= hMasu && hMasu < ConstShogi.BAN_SIZE) { SyElement masu = Conv_MasuHandle.ToMasu(hMasu); int suji; Util_MasuNum.TryMasuToSuji(masu, out suji); int dan; Util_MasuNum.TryMasuToDan(masu, out dan); StringBuilder sb = new StringBuilder(); sb.Append(Conv_Int.ToArabiaSuji(suji)); sb.Append(Conv_Int.ToKanSuji(dan)); result = sb.ToString(); } else { StringBuilder sb = new StringBuilder(); sb.Append("エラー"); sb.Append("("); sb.Append(hMasu); sb.Append(")"); result = sb.ToString(); } return(result); }
/// <summary> /// 角道を想定しています。 /// 「8八」を指定すれば、答えは「9七」を返すことを想定しています。 /// /// TODO:先後 /// </summary> /// <param name="prm1"></param> /// <returns></returns> public static string func左上一直線升たち(string prm1) { StringBuilder sb = new StringBuilder(); // 例「8八」 int suji = Conv_Suji.ToInt(prm1.Trim().ToCharArray()[0].ToString()); //8→8 int dan = Conv_Suji.ToInt(prm1.Trim().ToCharArray()[1].ToString()); //八→8 bool first = true; suji++; dan--; while (suji <= 9 && 0 < dan)//本将棋盤という前提がある { if (first) { first = false; } else { sb.Append(","); } sb.Append(Conv_Int.ToArabiaSuji(suji)); sb.Append(Conv_Int.ToKanSuji(dan)); suji++; dan--; } return(sb.ToString()); }
/// <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> /// 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()); }
/// <summary> /// ************************************************************************************************************************ /// 将棋盤の描画はここに書きます。 /// ************************************************************************************************************************ /// </summary> /// <param name="g"></param> public void Paint(Graphics g) { if (!this.Visible) { goto gt_EndMethod; } //---------- // 筋の数字 //---------- for (int i = 0; i < 9; i++) { g.DrawString(Conv_Int.ToArabiaSuji(i + 1), new Font("MS ゴシック", 25.0f), Brushes.Black, new Point((8 - i) * this.MasuWidth + this.Bounds.X - 8, -1 * this.MasuHeight + this.Bounds.Y)); } //---------- // 段の数字 //---------- for (int i = 0; i < 9; i++) { g.DrawString(Conv_Int.ToKanSuji(i + 1), new Font("MS ゴシック", 23.0f), Brushes.Black, new Point(9 * this.MasuWidth + this.Bounds.X, i * this.MasuHeight + this.Bounds.Y)); g.DrawString(Conv_Int.ToAlphabet(i + 1), new Font("MS ゴシック", 11.0f), Brushes.Black, new Point(9 * this.MasuWidth + this.Bounds.X, i * this.MasuHeight + this.Bounds.Y)); } //---------- // 水平線 //---------- for (int i = 0; i < 10; i++) { g.DrawLine(Pens.Black, 0 * this.MasuWidth + this.Bounds.X, i * this.MasuHeight + this.Bounds.Y, 9 * this.MasuHeight + this.Bounds.X, i * this.MasuHeight + this.Bounds.Y ); } //---------- // 垂直線 //---------- for (int i = 0; i < 10; i++) { g.DrawLine(Pens.Black, i * this.MasuWidth + this.Bounds.X, 0 * this.MasuHeight + this.Bounds.Y, i * this.MasuHeight + this.Bounds.X, 9 * this.MasuHeight + this.Bounds.Y ); } //---------- // 升目 //---------- foreach (UserWidget widget in this.ShogibanGui.Widgets.Values) { if ("Masu" == widget.Type && Okiba.ShogiBan == widget.Okiba) { Shape_BtnMasuImpl cell = (Shape_BtnMasuImpl)widget.Object; SySet <SyElement> masus2 = new SySet_Default <SyElement>("何かの升"); masus2.AddElement(Masu_Honshogi.Masus_All[widget.MasuHandle]); cell.Kiki = this.KikiBan.ContainsAll(masus2); cell.KikiSu = this.HMasu_KikiKomaList[widget.MasuHandle].Count; cell.Paint(g); } } gt_EndMethod: ; }
/// <summary> /// 2重の入れ子の将棋盤。 /// </summary> /// <returns></returns> private static string Format_NestedShogiban_P1Banjo(FeatureVector fv, int p1_base, PpItem_P2 p2Item) { StringBuilder sb = new StringBuilder(); //---------------------------------------- // タイトル行 //---------------------------------------- sb.AppendLine("\"#----------------------------------------\","); sb.Append("\"#"); sb.Append(p2Item.Title); sb.AppendLine("\","); sb.AppendLine("\"#----------------------------------------\","); //---------------------------------------- // p1 が 一段~九段 //---------------------------------------- for (int p1Dan = 1; p1Dan < 10; p1Dan++) { // 列見出し行を作ります。 sb.Append("\"#");//2文字 string danStr = Conv_Int.ToKanSuji(p1Dan); 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("\","); //---------------------------------------- // p2 が 一段~九段 //---------------------------------------- for (int p2Dan = 1; p2Dan < 10; p2Dan++) { // 行頭 sb.Append(" ");//4文字 //---------------------------------------- // 任意駒 p1 が 9筋~1筋 //---------------------------------------- for (int p1Suji = 9; p1Suji > 0; p1Suji--) { if (p1Suji != 9) { // 表の横の隙間 sb.Append(" "); } // 大テーブル升は、P1。 int p1Masu = Util_Masu10.Handle_OkibaSujiDanToMasu(Okiba.ShogiBan, p1Suji, p1Dan); //---------------------------------------- // p2 が 9筋~1筋 //---------------------------------------- for (int p2Suji = 9; p2Suji > 0; p2Suji--) { // 小テーブル升は、P2。 int p2Masu = Util_Masu10.Handle_OkibaSujiDanToMasu(Okiba.ShogiBan, p2Suji, p2Dan); int p1 = p1_base + p1Masu; int p2 = p2Item.P2_base + p2Masu; 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> /// テキストを作ります。 /// </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()); }
/// <summary> /// 角道を想定しています。 /// 「8八」を指定すれば、答えは「7九」を返すことを想定しています。 /// /// TODO:先後 /// </summary> /// <param name="prmList_Str">引数のドット区切りリスト</param> /// <returns></returns> public static string func右下一直線升たち(string prmList_Str) { StringBuilder sb = new StringBuilder(); List <string> prmList = new List <string>(); if (-1 != prmList_Str.IndexOf('.')) { string[] prmArray = prmList_Str.Split('.'); prmList.AddRange(prmArray); } else { prmList.Add(prmList_Str); } int prmIx = 0; foreach (string prm in prmList) { switch (prmIx) { case 0: { // 例「8八」 int suji = Conv_Suji.ToInt(prmList_Str.Trim().ToCharArray()[0].ToString()); //8→8 int dan = Conv_Suji.ToInt(prmList_Str.Trim().ToCharArray()[1].ToString()); //八→8 bool first = true; suji--; dan++; while (0 < suji && dan <= 9) //本将棋盤という前提がある { if (first) { first = false; } else { sb.Append(","); } sb.Append(Conv_Int.ToArabiaSuji(suji)); sb.Append(Conv_Int.ToKanSuji(dan)); suji--; dan++; } } break; default: { } break; } prmIx++; } return(sb.ToString()); }