问题标签 [python-chess]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
561 浏览

python-chess - 找出该举动是否在蟒蛇国际象棋中获得一块棋子的最佳方法是什么?

我发现检查移动是否捕获一块的最佳方法是计算移动前后的所有块并验证是否不同,但在我看来效率很低且不优雅。

0 投票
0 回答
877 浏览

python - 改进 Stockfish 计算以生成可能的最佳移动

我使用stockfish 引擎在模拟国际象棋游戏中生成最佳移动。我使用 python-chess 将 Stockfish 引擎集成到我的模拟中。目前我设置搜索操作的深度以获得最佳移动chess.engine.Limit(depth=engine_depth)

据称,Stockfish 11 的评分约为 3550。在此处输入图像描述

当然,移动的质量取决于搜索深度。在本文(http://web.ist.utl.pt/diogo.ferreira/papers/ferreira13impact.pdf)中,他们分析了搜索深度和引擎评级之间的相关性,基本结果基本上是:在此处输入图像描述 不幸的是,这篇论文来自 2013并且没有命名特定的引擎,但可以假设现在的结果要高一些。我还发现了这篇堆栈溢出文章:国际象棋引擎的深度是它的力量吗?但是那里的大多数链接都死了。

我想更深入地研究如何实现最佳移动。因为当使用深度为 20 的 Stockfish 11 时,它几乎无法战胜 chess.com 级别 10 的计算机,据传它的评分约为 2600。大多数情况下,Stockfish 会取得平局,有时可以用白色获胜。

这让我相信,刚刚给 Stockfish 的搜索深度并不是最好的方法。搜索树修剪等方面可以显着改善最佳移动的搜索结果。

有没有人有使用 Stockfish 的经验,并且可以指导我如何优化搜索以找到最佳可能移动的正确方向。理想情况下,您可以为我现在使用的 python-chess 提供一些代码。

0 投票
2 回答
3268 浏览

python - 如何获取 python-chess 模块中所有合法移动的列表?

我正在使用 python 国际象棋模块。在网站上,它显示您可以通过使用来检查移动是否合法

但是,我希望能够从board.legal_moves. 当我尝试这个时:

这将返回以下错误:

如何像使用列表一样选择移动?那么,我将如何将选择用作移动?

0 投票
1 回答
35 浏览

python - na单独的类为什么在该构造函数中接收类的实例会导致没有语句效果错误?

我正在创建一个国际象棋游戏,我决定在其中实现两个类,一个抽象类的棋子类扩展到各种抽象操作(Pawn、King、Queen、Rook、Knight、Bishop),每个棋子都将放在一个位置. 点类代表 8x8 网格的一个块和一个可选块。在我的现场类中,我在构造函数中获取了一个片段类的实例,但我收到一个错误“无语句效果错误”。我不确定为什么?

0 投票
2 回答
486 浏览

python - Python Chess:如何阻止 chess.engine.SimpleEngine.popen_uci() 打开 shell

我正在制作自己的国际象棋 GUI,并为此使用 python 国际象棋和鱼。将其冻结为可执行文件后,每次调用时chess.engine.SimpleEngine.popen_uci('location\\of\\stockfish'),它都会为 stockfish 打开 shell,如果我关闭 shell,stockfish 将停止工作。我该怎么做才能使外壳仅在后台运行并且对用户不可见?

0 投票
1 回答
1472 浏览

python - 使用 python-chess 库打印单个动作

我想从我从文本文件中读取的游戏(使用 python-chess 库)中顺序打印移动(每次移动一个字符串)。

所以,假设我有一个包含以下动作的游戏的 pgn 文件......

1. f3 e5 2. g4 Qh4#

...我想遍历这些动作并一一打印(使用 for 循环或类似方法),显示

f3

e5

g4

Qh4

我在这里找到了 python-chess 的文档: https ://python-chess.readthedocs.io/en/latest/

从文档中我了解到

  1. 我需要创建一个访问者的实例,它可以使用接受方法按 PGN 顺序遍历游戏节点
  2. san methon 会给我导致当前节点的移动的字符串

但是我发现这种文档很难阅读,并且可以通过示例得到很大帮助。

我设法做的是从 pgn 文件中读取游戏并使用变体方法一次性打印所有动作(而不是一个一个)。

0 投票
1 回答
250 浏览

python - 使用 python-chess 库打印每次移动的剩余时钟时间

我想从我从文本文件中读取的游戏(使用 python-chess 库)中顺序打印剩余的时钟时间(每次移动一个字符串)。

所以,假设我有一个包含以下动作的游戏的 pgn 文件......

  1. f3 { [%clk 0:05:00] } 1... e5 { [%clk 0:05:00] } 2. g4 { [%clk 0:04:49] } 2... Qh4# { [ %clk 0:04:48] }

...我想遍历动作并一一打印相应的时钟时间(使用for循环或类似的),显示

0:05:00

0:05:00

0:04:49

0:04:48

我知道如何迭代游戏的动作: 使用 python-chess 库打印单个动作

我将代码从那个答案更改为

但这没有用。在第一次迭代中,它确实打印了完整的变化(所有移动和时钟时间都在一行中)。在第二次迭代中,它引发了一个错误:

“KeyError:Move.from_uci('e7e5')”

0 投票
1 回答
631 浏览

python - Stockfish 国际象棋引擎在 Heroku 上得到:“EngineTerminatedError:引擎进程意外死亡”

我正在尝试构建一个带有 python 后端和 React 前端的人工智能国际象棋机器人。当我在本地运行它时,它工作正常,但是在 Heroku 上免费部署时,我收到以下错误消息:

结果 = engine.play(board, chess.engine.Limit(time=0.1)) chess.engine.EngineTerminatedError: 引擎进程意外死亡(退出代码:0)

linux stockfish 文件在 Heroku bash 上运行良好。

这是我的代码:

以下是部分日志:

DEBUG:chess.engine:<UciProtocol (pid=10)>: >> uciok

DEBUG:chess.engine:<UciProtocol (pid=10)>: << ucinewgame

DEBUG:chess.engine:<UciProtocol (pid=10)>: << isready

DEBUG:chess.engine:<UciProtocol (pid=10)>: 进程退出

DEBUG:chess.engine:<UciProtocol (pid=10)>:连接丢失(退出代码:0,错误:无)

chess.engine.EngineTerminatedError:引擎进程意外死亡(退出代码:0)

0 投票
1 回答
131 浏览

python - 无限while循环意外停止python线程

我希望你有一个美好的一天:)

最近在做一个象棋程序。

我现在正处于制作 AI 的阶段,我正在使用 Stockfish 进行测试。

由于我需要计算机有时间在不暂停 pygame 游戏循环的情况下进行评估,因此我正在使用线程库。

我还使用 python-chess 作为我的主要库来处理游戏状态和移动,以及访问 Stockfish。

这是我的线程代码:

由于某种原因,engine_play() 中的 while 循环停止执行。

它不会一直停止,它只是随机停止。

当它在while循环之后打印board.result时,值=“*”。

当条件 (board.result() == "*") 仍然满足时,这个 while 循环如何停止?

它实际上是一个线程问题吗?

此外,pygame 游戏循环只是更新图形并实现诸如拖放功能之类的东西。

没有显示错误,我只有一个线程。

0 投票
1 回答
2032 浏览

python - 回溯 8 Queens Python 问题

我已经开始用 Python 回溯解决 8 个皇后问题。一切都很好。它甚至打印出第一个答案。然而,它在第一次回溯尝试中陷入了困境。

任务听起来是这样的:

实现一个解决 8 个皇后谜题的 Python 函数。8皇后拼图包括将8个皇后放在棋盘上,这样任何一个皇后都无法捕获任何其他皇后。请注意,皇后可以在任何方向上正交或对角移动。

你应该实现一个函数solve(),当被调用时,它会打印出第一个谜题的解,然后等待输入。一旦用户按下“输入”,就会打印下一个解决方案,依此类推。

- 您的程序应该能够找到该难题的所有解决方案,并且每个解决方案只能找到一次。'

- 修改程序应该很容易,因此它适用于不同的电路板尺寸。提示:

- 在任何一排中,只有一个皇后。因此,您需要计算的只是可以放置 8 个皇后的列。

- 你应该实现一个递归函数solve(n),它为第n+1个皇后找到一个位置,然后为第n+1个皇后递归调用自己(除非所有皇后都已放置)。它应该系统地探索使用回溯的所有可能性。

- 允许(并鼓励)定义额外的函数(除了 solve() )以在必要时提高代码的质量。

我遵循了@mkam 的建议,现在我有了皇后的随机星座,但我完全摆脱了递归。