Exemplo n.º 1
0
        private StartposImporter(
            string inputLine,
            ISfenPosition2 ro_SfenStartpos
            )
        {
            this.InputLine = inputLine;

            this.RO_SfenStartpos = ro_SfenStartpos;

            this.StringToObject();
        }
Exemplo n.º 2
0
        private static void Assert_Koma40(ISfenPosition2 result, string hint)
        {
            //#if DEBUG
            StringBuilder sb        = new StringBuilder();
            int           komaCount = 0;

            result.Foreach_Masu201((int masuHandle, string masuString, ref bool toBreak) =>
            {
                sb.Append("[" + masuString + "]");
                if (masuString != "")
                {
                    komaCount++;
                }
            });

            Debug.Assert(komaCount == 40, "将棋の駒の数が40個ではありませんでした。[" + komaCount + "] " + sb.ToString() + "\n hint=" + hint);
            //#endif
        }
Exemplo n.º 3
0
        public static void Assert_Koma40(ISfenPosition2 result, string hint)
        {
            //#if DEBUG
            StringBuilder sb        = new StringBuilder();
            int           komaCount = 0;

            result.Foreach_Masu201((int masuHandle, string masuString, ref bool toBreak) =>
            {
                sb.Append($"[{masuString}]");
                if (masuString != "")
                {
                    komaCount++;
                }
            });

            Debug.Assert(komaCount == 40, $@"将棋の駒の数が40個ではありませんでした。[{ komaCount }] { sb }
hint={ hint}");
            //#endif
        }
Exemplo n.º 4
0
        /// <summary>
        /// ************************************************************************************************************************
        /// 「lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1」といった記述を解析します。
        /// ************************************************************************************************************************
        /// </summary>
        /// <returns></returns>
        public static bool ToKyokumen2(
            string inputLine,
            out string rest,
            out ISfenPosition2 result_kyokumen2
            )
        {
            // 頭に 「position」 があれば、外します。
            {
                inputLine = inputLine.TrimStart();
                if (inputLine.StartsWith("position"))
                {
                    inputLine = inputLine.Substring("position".Length);
                }
            }

            // 頭に 「startpos」があれば、置き換えます。
            {
                inputLine = inputLine.TrimStart();
                if (inputLine.StartsWith("startpos"))
                {
                    inputLine = inputLine.Substring("startpos".Length);
                }

                inputLine = $"sfen lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1 { inputLine }";
            }


            bool successful = false;

            result_kyokumen2 = null;

            // 1~27
            string[] stra = new string[28];
            //stra[0] = "";//未使用
            for (int i = 1; i < 28; i++)
            {
                stra[i] = "";
            }

            rest = inputLine;

            bool startposPattern = false;

            //------------------------------------------------------------
            // リスト作成
            //------------------------------------------------------------
            if (!startposPattern)
            {
                MatchCollection mc = regexOfStartpos.Matches(inputLine);
                foreach (Match m in mc)
                {
                    if (0 < m.Groups.Count)
                    {
                        // 残りのテキスト
                        rest = inputLine.Substring(0, m.Index) + inputLine.Substring(m.Index + m.Length, inputLine.Length - (m.Index + m.Length));

                        stra[1]  = m.Groups[1].Value;  //1段目
                        stra[2]  = m.Groups[2].Value;  //2段目
                        stra[3]  = m.Groups[3].Value;  //3段目
                        stra[4]  = m.Groups[4].Value;  //4段目
                        stra[5]  = m.Groups[5].Value;  //5段目
                        stra[6]  = m.Groups[6].Value;  //6段目
                        stra[7]  = m.Groups[7].Value;  //7段目
                        stra[8]  = m.Groups[8].Value;  //8段目
                        stra[9]  = m.Groups[9].Value;  //9段目
                        stra[10] = m.Groups[10].Value; //先後
                        stra[11] = m.Groups[11].Value; //持駒▲王
                        stra[12] = m.Groups[12].Value; //持駒▲飛
                        stra[13] = m.Groups[13].Value; //持駒▲角
                        stra[14] = m.Groups[14].Value; //持駒▲金
                        stra[15] = m.Groups[15].Value; //持駒▲銀
                        stra[16] = m.Groups[16].Value; //持駒▲桂
                        stra[17] = m.Groups[17].Value; //持駒▲香
                        stra[18] = m.Groups[18].Value; //持駒▲歩
                        stra[19] = m.Groups[19].Value; //持駒△王
                        stra[20] = m.Groups[20].Value; //持駒△飛
                        stra[21] = m.Groups[21].Value; //持駒△角
                        stra[22] = m.Groups[22].Value; //持駒△金
                        stra[23] = m.Groups[23].Value; //持駒△銀
                        stra[24] = m.Groups[24].Value; //持駒△桂
                        stra[25] = m.Groups[25].Value; //持駒△香
                        stra[26] = m.Groups[26].Value; //持駒△歩
                        stra[27] = m.Groups[27].Value; //手目

                        if (
                            !(
                                stra[1] == "" && stra[2] == "" && stra[3] == "" && stra[4] == "" && stra[5] == "" &&
                                stra[6] == "" && stra[7] == "" && stra[8] == "" && stra[9] == "" && stra[10] == "" &&
                                stra[11] == "" && stra[12] == "" && stra[13] == "" && stra[14] == "" && stra[15] == "" &&
                                stra[16] == "" && stra[17] == "" && stra[18] == "" && stra[19] == "" && stra[20] == "" &&
                                stra[21] == "" && stra[22] == "" && stra[23] == "" && stra[24] == "" && stra[25] == "" &&
                                stra[26] == "" && stra[27] == ""
                                )

                            )
                        {
                            result_kyokumen2 = Sfenstring146Conv.ReadString2(
                                stra[1],  //1段目
                                stra[2],  //2段目
                                stra[3],  //3段目
                                stra[4],  //4段目
                                stra[5],  //5段目
                                stra[6],  //6段目
                                stra[7],  //7段目
                                stra[8],  //8段目
                                stra[9],  //9段目
                                stra[10], //先後
                                stra[11], //持駒▲王
                                stra[12], //持駒▲飛
                                stra[13], //持駒▲角
                                stra[14], //持駒▲金
                                stra[15], //持駒▲銀
                                stra[16], //持駒▲桂
                                stra[17], //持駒▲香
                                stra[18], //持駒▲歩
                                stra[19], //持駒△王
                                stra[20], //持駒△飛
                                stra[21], //持駒△角
                                stra[22], //持駒△金
                                stra[23], //持駒△銀
                                stra[24], //持駒△桂
                                stra[25], //持駒△香
                                stra[26], //持駒△歩
                                stra[27]  //手目
                                );
                            successful = true;
                        }
                    }

                    // 最初の1件だけ処理して終わります。
                    break;
                }
            }


            rest = rest.Trim();

            //// 解析失敗時用
            //{
            //    StringBuilder sb = new StringBuilder();
            //    sb.Append($"解析失敗☆ inputLine=[{ inputLine }]");

            //    for (int i = 1; i < 28; i++)
            //    {
            //        sb.Append($"str{ i }[{ stra[i] }]");
            //    }

            //    Debug.Assert(result_Sfenstring != null, sb.ToString());

            //    Util_SfenstringReader.Assert_Koma40(result_Sfenstring, $"inputLine=[{ inputLine }]");
            //}

            return(successful);
        }
Exemplo n.º 5
0
        /// <summary>
        /// 「lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1」といった記述を解析します。
        /// </summary>
        /// <returns></returns>
        public static bool ReadString(
            string inputLine,
            out string rest,
            out ISfenPosition2 result_Sfenstring
            )
        {
            // 頭に 「position」 があれば、外します。
            {
                inputLine = inputLine.TrimStart();
                if (inputLine.StartsWith("position"))
                {
                    inputLine = inputLine.Substring("position".Length);
                }
            }

            // 頭に 「startpos」があれば、置き換えます。
            {
                inputLine = inputLine.TrimStart();
                if (inputLine.StartsWith("startpos"))
                {
                    inputLine = inputLine.Substring("startpos".Length);
                }

                inputLine = "sfen lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1 " + inputLine;
            }


            bool successful = false;

            result_Sfenstring = null;

            // 1~27
            string[] stra = new string[28];
            //stra[0] = "";//未使用
            for (int i = 1; i < 28; i++)
            {
                stra[i] = "";
            }

            rest = inputLine;

            bool startposPattern = false;

            //------------------------------------------------------------
            // リスト作成
            //------------------------------------------------------------
            if (!startposPattern)
            {
                Regex regex2 = new Regex(
                    @"^\s*" +
                    @"sfen " +
                    @"((?:[123456789]|\+?[KRBGSNLPkrbgsnlp])+)/" + //1段目
                    @"((?:[123456789]|\+?[KRBGSNLPkrbgsnlp])+)/" + //2段目
                    @"((?:[123456789]|\+?[KRBGSNLPkrbgsnlp])+)/" + //3段目
                    @"((?:[123456789]|\+?[KRBGSNLPkrbgsnlp])+)/" + //4段目
                    @"((?:[123456789]|\+?[KRBGSNLPkrbgsnlp])+)/" + //5段目
                    @"((?:[123456789]|\+?[KRBGSNLPkrbgsnlp])+)/" + //6段目
                    @"((?:[123456789]|\+?[KRBGSNLPkrbgsnlp])+)/" + //7段目
                    @"((?:[123456789]|\+?[KRBGSNLPkrbgsnlp])+)/" + //8段目
                    @"((?:[123456789]|\+?[KRBGSNLPkrbgsnlp])+) " + //9段目
                    @"(b|w) " +                                    //先後
                    @"\-?" +                                       //持駒なし
                                                                   // ↓この書き方だと、順序が決まってしまうが。
                    @"(\d*K)?" +                                   //持駒▲王 ※持ち駒が1個だけの場合は、数字が省略されます。
                    @"(\d*R)?" +                                   //持駒▲飛
                    @"(\d*B)?" +                                   //持駒▲角
                    @"(\d*G)?" +                                   //持駒▲金
                    @"(\d*S)?" +                                   //持駒▲銀
                    @"(\d*N)?" +                                   //持駒▲桂
                    @"(\d*L)?" +                                   //持駒▲香
                    @"(\d*P)?" +                                   //持駒▲歩
                    @"(\d*k)?" +                                   //持駒△王
                    @"(\d*r)?" +                                   //持駒△飛
                    @"(\d*b)?" +                                   //持駒△角
                    @"(\d*g)?" +                                   //持駒△金
                    @"(\d*s)?" +                                   //持駒△銀
                    @"(\d*n)?" +                                   //持駒△桂
                    @"(\d*l)?" +                                   //持駒△香
                    @"(\d*p)?" +                                   //持駒△歩
                    @" (\d+)" +                                    //手目
                    @"",
                    RegexOptions.Singleline
                    );
                MatchCollection mc = regex2.Matches(inputLine);
                foreach (Match m in mc)
                {
                    if (0 < m.Groups.Count)
                    {
                        // 残りのテキスト
                        rest = inputLine.Substring(0, m.Index) + inputLine.Substring(m.Index + m.Length, inputLine.Length - (m.Index + m.Length));

                        stra[1]  = m.Groups[1].Value;  //1段目
                        stra[2]  = m.Groups[2].Value;  //2段目
                        stra[3]  = m.Groups[3].Value;  //3段目
                        stra[4]  = m.Groups[4].Value;  //4段目
                        stra[5]  = m.Groups[5].Value;  //5段目
                        stra[6]  = m.Groups[6].Value;  //6段目
                        stra[7]  = m.Groups[7].Value;  //7段目
                        stra[8]  = m.Groups[8].Value;  //8段目
                        stra[9]  = m.Groups[9].Value;  //9段目
                        stra[10] = m.Groups[10].Value; //先後
                        stra[11] = m.Groups[11].Value; //持駒▲王
                        stra[12] = m.Groups[12].Value; //持駒▲飛
                        stra[13] = m.Groups[13].Value; //持駒▲角
                        stra[14] = m.Groups[14].Value; //持駒▲金
                        stra[15] = m.Groups[15].Value; //持駒▲銀
                        stra[16] = m.Groups[16].Value; //持駒▲桂
                        stra[17] = m.Groups[17].Value; //持駒▲香
                        stra[18] = m.Groups[18].Value; //持駒▲歩
                        stra[19] = m.Groups[19].Value; //持駒△王
                        stra[20] = m.Groups[20].Value; //持駒△飛
                        stra[21] = m.Groups[21].Value; //持駒△角
                        stra[22] = m.Groups[22].Value; //持駒△金
                        stra[23] = m.Groups[23].Value; //持駒△銀
                        stra[24] = m.Groups[24].Value; //持駒△桂
                        stra[25] = m.Groups[25].Value; //持駒△香
                        stra[26] = m.Groups[26].Value; //持駒△歩
                        stra[27] = m.Groups[27].Value; //手目

                        if (
                            !(
                                stra[1] == "" && stra[2] == "" && stra[3] == "" && stra[4] == "" && stra[5] == "" &&
                                stra[6] == "" && stra[7] == "" && stra[8] == "" && stra[9] == "" && stra[10] == "" &&
                                stra[11] == "" && stra[12] == "" && stra[13] == "" && stra[14] == "" && stra[15] == "" &&
                                stra[16] == "" && stra[17] == "" && stra[18] == "" && stra[19] == "" && stra[20] == "" &&
                                stra[21] == "" && stra[22] == "" && stra[23] == "" && stra[24] == "" && stra[25] == "" &&
                                stra[26] == "" && stra[27] == ""
                                )

                            )
                        {
                            result_Sfenstring = SfenStringReader.ReadString2(
                                stra[1],  //1段目
                                stra[2],  //2段目
                                stra[3],  //3段目
                                stra[4],  //4段目
                                stra[5],  //5段目
                                stra[6],  //6段目
                                stra[7],  //7段目
                                stra[8],  //8段目
                                stra[9],  //9段目
                                stra[10], //先後
                                stra[11], //持駒▲王
                                stra[12], //持駒▲飛
                                stra[13], //持駒▲角
                                stra[14], //持駒▲金
                                stra[15], //持駒▲銀
                                stra[16], //持駒▲桂
                                stra[17], //持駒▲香
                                stra[18], //持駒▲歩
                                stra[19], //持駒△王
                                stra[20], //持駒△飛
                                stra[21], //持駒△角
                                stra[22], //持駒△金
                                stra[23], //持駒△銀
                                stra[24], //持駒△桂
                                stra[25], //持駒△香
                                stra[26], //持駒△歩
                                stra[27]  //手目
                                );
                            successful = true;
                        }
                    }

                    // 最初の1件だけ処理して終わります。
                    break;
                }
            }


            rest = rest.Trim();

            //// 解析失敗時用
            //{
            //    StringBuilder sb = new StringBuilder();
            //    sb.Append("解析失敗☆ inputLine=[" + inputLine + "]");

            //    for (int i = 1; i < 28; i++)
            //    {
            //        sb.Append("str" + i + "[" + stra[i] + "]");
            //    }

            //    Debug.Assert(result_Sfenstring != null, sb.ToString());

            //    Util_SfenstringReader.Assert_Koma40(result_Sfenstring, "inputLine=[" + inputLine + "]");
            //}


            // 結果を配列化。
            //result_Sfenstring.ToKyokumen1();

            return(successful);
        }