Python: 国际象棋移动验证

6

有没有人知道是否有一个免费的Python棋谱移动验证函数可用?

我需要什么。我有一个存储为字符串的图表和移动候选人。我需要看看移动候选人对于图表是否有效。

如果可能的话,真的很想看到示例。


字符串看起来像这样:

ememememememememememememememememememembbememwpemememememememwpemembkememememememememememememememememwbembrememememwkemememememem

我知道这似乎很愚蠢,但我发现这是编码位置最简单的方式。对我而言,移动候选人只是另一个这样的位置(在下一步之后发生,可以改变此行为)。


7
你不能自己写一个吗? :) - Justin Ethier
1
你能分享一下棋盘的字符串编码和移动候选的编码吗? - vicatcu
3
为什么不使用像FEN这样的标准符号,而要发明自己的符号呢? FEN是指Forsyth-Edwards符号表示法。 - zvone
6个回答

5
你缺少信息,例如轮到谁移动,每个国王是否曾经移动过(这意味着不能进行王车易位),每个兵的“吃过路兵”的状态。除此之外,对于你来说编写自己的代码将是一个非常有益的练习,使用不太复杂的棋盘表示法,比如描述here的10x12元素数组(除了你需要将其线性化为一个120元素数组)。

如果可能的话,原帖作者应该将这种信息作为标志与棋盘状态一起存储。 - Cam
还有三次重复规则和五十步规则需要考虑。 - John La Rooy
@gnibbler:我写了“例如”,并不想吓到OP太多;-) - John Machin

4

我知道这是一个相当老的问题,但是我和我的兄弟正在寻找同样的东西,我们发现了这个非常棒的小Python模块,它叫做Chessnut

这里是它的使用示例:

#!/usr/bin/python
from Chessnut import Game

chessgame = Game(fen="rnbq1rk1/ppppp1bp/5np1/5p2/2PP4/2NBPN2/PP3PPP/R1BQK2R b KQ - 4 6")
print chessgame  

print chessgame.get_moves()

# apply a move 
chessgame.apply_move(chessgame.get_moves()[1])

print chessgame

以下是生成的输出:

rnbq1rk1/ppppp1bp/5np1/5p2/2PP4/2NBPN2/PP3PPP/R1BQK2R b KQ - 4 6
['b8a6', 'b8c6', 'd8e8', 'f8e8', 'f8f7', 'g8h8', 'g8f7', 'a7a6', 'a7a5', 'b7b6', 'b7b5', 'c7c6', 'c7c5', 'd7d6', 'd7d5', 'e7e6', 'e7e5', 'g7h8', 'g7h6', 'h7h6', 'h7h5', 'f6e8', 'f6d5', 'f6e4', 'f6g4', 'f6h5', 'g6g5', 'f5f4']
r1bq1rk1/ppppp1bp/2n2np1/5p2/2PP4/2NBPN2/PP3PPP/R1BQK2R w KQ - 5 7

太棒了!:) 感谢cgearhart


3

1
你提供的参考资料是用于评估(得分)棋盘位置,而非用于验证(检查合法移动)。 - John Machin
@John:你说得对,看来我现在找不到正确的代码了。但是Dimo414的答案似乎更好,所以我不会再去寻找了 :) - Wolph
1
@Oleg:您将使用pychess.Utils.lutils.validator模块。它需要一个pychess.Utils.lutils.lboard对象和一个lmove对象。两者都可以从纯棋类格式(如fen和代数符号表示法)初始化。 - Thomas Ahle

1

构建自己的东西并不容易 :(. 无论如何,重用已经创建的东西会很棒。 - Oleg Tarasenko
3
对我来说似乎很简单 - 确定棋子类型,确定该类型棋子从该位置的所有路径。检查移动是否在有效路径上。然后确认(除了马)该路径上没有棋子,也没有友方棋子在新位置上。 - dimo414
1
也许吧,但如果已经有开源的Python库解决了这个问题,我会使用它。 - Oleg Tarasenko
是的,我同意这很简单。这不像你在试图评估移动的有用性之类的东西。自己编写可能比解剖开源程序的文档/源代码更容易。 - Cam
也许吧,但我敢打赌,在你提问后的两个多小时里,你已经可以自己动手了。使用现有工具确实有其优点,但有时重新发明轮子比让别人的轮子适配你的车更容易。 - dimo414

0

看看ChessBoard

不幸的是,它有一些缺点:

  • 似乎已经被放弃了,因为在评论中报告的错误已经超过一年了,但似乎没有修复
  • 代码并不真正符合PEP-8规范
  • 一些方法非常丑陋而冗长,不是所有方法都有文档字符串
  • 没有单元测试,所以深入研究这段代码可能会很有挑战性(我至少尝试过两次,但失败了)

好的一点是,代码是GPL许可的,所以只要遵守该许可证,你可以随意使用。


0
我在这里使用移动验证制作了一个简单的国际象棋实现:https://github.com/akulakov/pychess 验证逻辑在每个棋子的“移动()”方法中,您可以通过生成完整的移动列表并检查您的移动是否在列表中来验证自己的移动。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接