示例#1
0
        /// <summary>
        /// 棋譜コメントから評価値や変化の取得します。
        /// </summary>
        private PVInfo ParsePVInfo(string comment, Board board)
        {
            var m = KifAnalyzedVariationRegex.Match(comment);

            if (!m.Success)
            {
                return(null);
            }

            // 評価値の取得を行います。
            int value;

            if (!int.TryParse(m.Groups["value"].Value, out value))
            {
                return(null);
            }

            // 変化の各手を解析して取得します。
            var variationStr = m.Groups[2].Value;
            var variation    = new List <Move>();
            var cloned       = board.Clone();

            while (true)
            {
                var parsed = string.Empty;
                var move   = ShogiParser.ParseMoveEx(variationStr, false, ref parsed);
                if (move == null)
                {
                    break;
                }

                var bmove = cloned.ConvertMoveFromLiteral(move, false);
                if (bmove == null || !bmove.Validate())
                {
                    break;
                }

                // すごく重いため変化の時は打ち歩詰めの確認を行いません。
                var flags = MoveFlags.DoMoveDefault & ~MoveFlags.CheckPawnDropCheckMate;
                if (!cloned.DoMove(bmove, flags))
                {
                    break;
                }

                variation.Add(bmove);
                variationStr = variationStr.Substring(parsed.Length);
            }

            return(new PVInfo
            {
                Value = value,
                MoveList = variation,
            });
        }
示例#2
0
        /// <summary>
        /// 文字列に差し手が含まれていれば、順次切り出していきます。
        /// </summary>
        private static IEnumerable <LiteralMove> MakeMoveListFromTextInternal(string text)
        {
            while (true)
            {
                var parsedText = string.Empty;

                // 与えられた文字列の指し手を順次パースします。
                var move = ShogiParser.ParseMoveEx(
                    text, false, ref parsedText);
                if (move == null)
                {
                    break;
                }

                // パースが終わった部分から次のパースをはじめます。
                text = text.Substring(parsedText.Length);
                yield return(move);
            }
        }