国际象棋编程(无人工智能)——动作验证
我正在尝试编写自己的国际象棋引擎(没有人工智能)。 我知道有国际象棋游戏入门套件,我观看了它以获取入门灵感。
但我没有注意到的是经过验证的动作在哪里(这里是动作验证)对于我的非国王棋子阻止让自己过牌?
想象一下情况:
A5 - 对手车
A4 - 我的主教
A3 - 我的国王
,我现在不能移动我的主教,因为我要过牌。
或者您建议如何检查这种情况?
谢谢
I'm trying to program my own chess engine (no AI).
I know there is Chess Game Starter Kit and I watched it for start inspiration.
But what I didn't catch is where are validated moves (here is moves validation) for my non-king pieces preventing to get myself to check?
Imagine situation:
A5 - opponents rook
A4 - my bishop
A3 - my king
I can't move my bishop now since I would get to check.
Or how would you suggest to check this situation?
Thank you
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
对于给定的棋盘位置,大多数国际象棋引擎仅通过生成伪合法动作来启动。所谓伪合法,我的意思是即使发生以下情况,也会生成一个移动:
这样做的原因是性能。由于 Beta 修剪,许多动作实际上不会被搜索,因此您可以通过避免全面检查动作有效性来节省时间。
对于搜索的每一步,您都需要检查它是否确实有效。这通常是通过将国王的颜色和方格(以及王的易位移动中国王旁边的方格)传递到 IsAttacked 方法中来完成的。如果该方法返回 true,则您知道该移动无效,因此不应将其包含在搜索中。
这是我自己的 C# 国际象棋引擎的 IsAttacked 方法。请记住,我的引擎是基于 magic bitboard 的,因此代码不会直接适用于您链接到的国际象棋入门套件。除非您熟悉魔法位板,否则翻译不会是微不足道的。
下面是为白方生成伪合法易位移动的代码片段:
下面是检查伪合法易位移动是否实际上合法的代码:
For a given board position, most chess engines start by generating pseudo-legal moves only. By pseudo-legal, I mean a move will be generated even if it:
The reason for this is performance. As many moves won't actually be searched due to beta pruning, you save time by avoiding the full check of move validity.
For every move that is searched, you need to check that it's really valid. This is normally done by passing the King's colour and square (and squares next to the King for a castling move) into an IsAttacked method. If that method returns true, you know the move isn't valid and therefore you shouldn't include it in your search.
This is the IsAttacked method from my own C# chess engine. Bear in mind that my engine is magic bitboard-based, so the code won't be directly applicable to the chess starter kit to which you linked. Unless you're familiar with magic bitboards, the translation won't be trivial.
Here's a fragment of code that generates pseudo-legal castling moves for White:
And here's the code that checks whether a pseudo-legal castling move is actually legal:
我的国际象棋程序有一个方法可以检查某个区域是否受到威胁。在计算国王的移动时,它会检查国王可能移动到的每个区域(如果该区域受到威胁)。
My chess program has a method that checks if a field is threatened. When calculating moves for the king it checks for every field the king might move to if that field is threatened.