难以解读PGN在国际象棋中的移动

时间:2019-12-20 21:36:46

标签: c

我正在制作一个国际象棋游戏,上面写着“便携式游戏符号”(PGN),它是描述游戏中动作的字符串。

我在分解组件移动方面遇到问题。

我正在尝试编写一种小的算法来选择片段,检查是否进行了捕获(如果字符串中包含“ X”)并获取片段的新平方。

符号的用法如下:

移动开始于棋子移动(NBRQK)或(a-h)+(1-8),这意味着棋子移动。 如果有2个棋子可以移动到新的方块中,则该棋子将包含开始行(1-8)或开始行col(a-h)以消除歧义。

接下来,如果进行了捕获,将出现一个“ x”。

接下来是目的地栏(a-h)。

下一个目标行(1-8)。

如果该棋子是到达其提升方块的棋子,则将出现“ =”,并且该棋子将被提升为(NBRQ)。

如果选中,将显示“ +”。

如果有伴侣,将会有“#”。

我创建了一个函数,该函数返回选择的片段(NBRQKP),但我对其余的内容迷失了。我试图仅使用移动的索引,但是由于移动可以从2个字符到失败的7个字符进行,我不确定给定元素将出现在哪里。如何阅读这种记号?

1 个答案:

答案 0 :(得分:0)

“正则表达式”允许您执行此操作。我知道的最清楚的方法是使用“命名捕获组”,只需使用?就可以使其中一些或全部成为可选的。组之后(0或1个匹配项)。在某些情况下,这可能会遗漏,但是您的主旨是。在python中,它将去:

import re
strings = ['a3','Rxg6','Ra2xh7','O-O','O-O-O']
regex = re.compile(r'(?P<pawnmove>(([a-h][1-8])?))
                     (?P<piece>[NBRQK]?)
                     (?P<square1>([a-h][1-8])?)
                     (?P<capture>(x)?)
                     (?P<square2>([a-h][1-8])?)
                     (?P<castle>(O-O-O|O-O)?)')
for s in strings:
    match = regex.search(s)
    print('move:',s)
    if match:
        pawnmove = match.group('pawnmove')
        if pawnmove:
            print('pawnmove', pawnmove)
        piece = match.group('piece')
        if piece:
            print('piece',piece)
        square1 = match.group('square1')
        if square1:
            print('square1',square1)
        capture = match.group('capture')
        if capture:
            print('capture',capture)
        square2 = match.group('square2')
        if square2:
            print('square2',square2)
        castle = match.group('castle')
        if castle:
            print('castle',ca