今天小编给大家分享一下怎么使用Python在2秒内评估国际象棋位置的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
使用 OpenCV (开源计算机视觉库)和 NumPy 库来截取棋盘,可视化棋盘方格,并比较图像之间的差异。
如果你不熟悉OpenCV,鼓励你了解有关它的更多信息。接下来,使用 PIL(Pillow)库来修改图像(例如,裁剪)。CompareImages 模块使用 OpenCV 来查找并突出显示两个图像之间的差异。
mss 库是一种快速简便的方法来获取监视器的屏幕截图并将图像保存为 PNG 文件。接下来,使用chess库,用于移动生成、验证和可视化。
最后,使用stockfish 引擎来评估国际象棋的位置并确定最佳走法。
在 Windows 中为这个项目使用 Stockfish 14.1 (AVX2)。
接下来,创建了一个函数来定位显示器上的棋盘。该函数接受三个输入:棋盘左上角的 X 和 Y 坐标以及棋盘上每个方格的宽度。
在显示器上,X 和 Y 坐标为像素(585、163),每个正方形的宽度为 90 像素(图 1)。你需要为你的显示器配置这些输入。
当你运行“capture_board”功能时,它将打开一个窗口,根据输入参数显示监视器的实时视图。它还将绘制一个 8x8 网格。确保蓝色框与棋盘格紧密对齐(图 2)。
左侧的图像可能会导致对棋位的评估不佳或根本不起作用。
相反,请确保蓝线与棋盘格对齐以准确捕获棋子(右图)。
在第三步中,创建了一个函数,该函数根据 capture_board 函数的输入获取棋盘位置的单个屏幕截图。此屏幕截图将保存在本地目录中,并在接下来的步骤中进行处理。
下面的函数检测棋盘是否翻转。它通过检测棋盘左上角的车(黑色或白色)来工作。如果游戏开始并且车已经从原来的位置移动,此函数可能无法正常工作。
你可以通过在棋盘翻转时取消注释“is_board_flipped=True”或在棋盘未翻转时取消注释“is_board_flipped=False”(即,棋盘底部为白色)来覆盖此函数。
下面的数组将根据棋盘是否翻转来排列。我在下一步中使用该数组来检测棋盘上哪个方格上的棋子。如果棋盘没有翻转,方块 A1 将在左下角;否则,A1 方块将位于右上角。
这一步只运行一次(假设棋盘的大小在游戏之间没有变化)。确定每个棋子的像素数后,你可以删除此部分。
想找到一种简单、高效且一致的方法来检测和识别棋子。计算每个棋格上的黑/白像素数效果很好。
下面的代码集按照构成每个块的黑白像素的数量来排列黑白块;请注意,我手动执行了此步骤,但你的顺序应该相同。你会注意到黑色国王拥有最少的黑色像素,而黑色骑士拥有最多的黑色像素。白象的白色像素数最少,而白骑士的白色像素数最多。BPieceType和WPieceType与 Chess 库分配的棋子类型一致。
棋子类型
Pawn = 1
Knight = 2
Bisphop = 3
Rook = 4
Queen = 5
King = 6
下面的 for 循环将从提供的棋盘图像中裁剪并保存 64 张图像。64 个图像中的每一个都将根据步骤 5 中指定的方向与特定的正方形对齐。确保在主目录中创建一个“Pieces”文件夹;裁剪后的图像将保存在此文件夹中。
下面的代码旨在识别每个棋子的黑白像素数。我已经从上面创建了一个包含黑白像素数量的列表。
对于每种颜色,我执行以下操作:
保留唯一的像素值
以升序对列表进行排序,并保留六个最大的像素值
每个像素值将与BPieces / Wpieces中指定的部分对齐
如果这是第一次运行代码,请使用步骤 6 输出为“BlackPieces”分配黑色像素数,为“WhitePieces”分配白色像素数。下面的代码以我的显示器为例。
我们已经完成了所有的设置步骤。我们首先将 stockfish 的等级设置为 3000 ELO,并将深度设置为 15。你可以将深度设置为 26,但这会显着增加处理时间。然后我们创建“evaluate_position”函数。该函数将:
截屏
将彩色图像转换为灰度并保存图像
确定每个棋子在棋盘上的位置,并使用国际象棋库将这些棋子放置在棋盘上的适当位置
将该回合分配给指定的颜色。默认是轮到白棋。
根据国际象棋库中的位置分配 stockfish 中的 FEN 位置
生成请求的输出
恭喜,你完成了!指定是轮到白(设置 white_turn=True)还是轮到黑(white_turn=False)并运行评估函数。该函数将输出:
Best Move:最明智的一步
Evaluation:对当前位置的评估
Top moves:最佳移动
当前位置和下一个最佳移动的视觉效果
如果位置发生变化,重新运行evaluate_postition函数;你不需要重新运行前面的步骤。
evaluate_position 输出示例。
以上就是“怎么使用Python在2秒内评估国际象棋位置”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注亿速云行业资讯频道。