/// <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, }); }
/// <summary> /// コンストラクタ /// </summary> public SampleMoveData(string moveText, double value) { MoveText = moveText; Value = value; Move = ShogiParser.ParseMove(moveText, true); if (Move == null) { throw new RagnarokException( "指し手の変換に失敗しました。"); } }
/// <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); } }