我正在制作一个国际象棋游戏,上面写着“便携式游戏符号”(PGN),它是描述游戏中动作的字符串。
我在分解组件移动方面遇到问题。
我正在尝试编写一种小的算法来选择片段,检查是否进行了捕获(如果字符串中包含“ X”)并获取片段的新平方。
符号的用法如下:
移动开始于棋子移动(NBRQK)或(a-h)+(1-8),这意味着棋子移动。 如果有2个棋子可以移动到新的方块中,则该棋子将包含开始行(1-8)或开始行col(a-h)以消除歧义。
接下来,如果进行了捕获,将出现一个“ x”。
接下来是目的地栏(a-h)。
下一个目标行(1-8)。
如果该棋子是到达其提升方块的棋子,则将出现“ =”,并且该棋子将被提升为(NBRQ)。
如果选中,将显示“ +”。
如果有伴侣,将会有“#”。
我创建了一个函数,该函数返回选择的片段(NBRQKP),但我对其余的内容迷失了。我试图仅使用移动的索引,但是由于移动可以从2个字符到失败的7个字符进行,我不确定给定元素将出现在哪里。如何阅读这种记号?
答案 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