【问题标题】:Get list of moves from PGN从 PGN 获取移动列表
【发布时间】:2014-02-26 19:44:11
【问题描述】:

我有一个国际象棋游戏的 PGN(便携式游戏符号)。我想要的是只得到一个动作列表。例如:

PGN:

1. e4 e5 2. f4 exf4 3. Nf3 d5 4. exd5 Nf6 5. Nc3 Nxd5 6. Nxd5 Qxd5 7. d4 Bg4 8.
Bxf4 Nc6 9. Be2 O-O-O 10. c3 Qe4 11. Qd2 Rxd4 12. Nxd4 Nxd4 13. cxd4 Bb4 14.
Kf2 Bxd2 15. Bxg4+ f5 16. Bxd2 fxg4 17. Rhe1 Qxd4+ 18. Be3 Qxb2+ 19. Kf1 Re8
0-1

输出:

['e4','e5','f4','exf4','Nf3','d5', .... , 'Re8']

我的想法是获取字符串并在空格处拆分它,然后以这种方式排列一个新数组,但我想知道是否有更好的方法来做到这一点。没有我只对一般语言感兴趣的特定语言。可能是python,javascript,并不重要。

另外,有时 PGN 在字符串中间带有符号或括号中表示的“变体”,我想忽略这些。有任何想法吗? 谢谢

【问题讨论】:

  • 您需要一个 PGN 解析器。存在许多可以用作学习的资源。甚至可能有一个规范。请使用这些资源来学习。

标签: language-agnostic chess


【解决方案1】:

奇怪,我找不到适合 Ruby 或 Javascript 的 PGN 解析器。以下是我简要测试过的另外两个库:

也许自己编写解析器确实是最好的方法。您可以使用正则表达式消除 cmets,因为它们不是嵌套的。

(来自Wikipedia) 注释由“;”插入(持续到行尾的注释)或“{”(持续到匹配的“}”)。评论不嵌套。

在 cmets(包括变体)消失后,您可以按预期解析移动(拆分为空格并过滤移动编号)。

【讨论】:

    【解决方案2】:

    我刚开始在https://rubygems.org/gems/pgn 使用 Ruby PGN gem,它有一个解析器模块,你可以做 PGN-> FEN,玩游戏,通过 FEN 导入设置位置等。我一直在使用https://github.com/tobiasvl/pgn/tree/pgn-annotations 的一个分支,该分支能够解析包含变体和 cmets 的 PGN。

    这是一个 javascript 版本,https://github.com/jhlywa/chess.js

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      相关资源
      最近更新 更多