Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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());
        }
Ejemplo n.º 3
0
        /// <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());
        }
Ejemplo n.º 4
0
        /// <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());
        }
Ejemplo n.º 5
0
        /// <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());
        }
Ejemplo n.º 6
0
        /// <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:
            ;
        }
Ejemplo n.º 7
0
        /// <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());
        }
Ejemplo n.º 8
0
        /// <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());
        }
Ejemplo n.º 9
0
        /// <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());
        }