使用魔术位板构建国际象棋......我怎么知道运动是否有效
Building a chess using magic bitboard... how do I know if the movement is valid
好的,我已经在网上阅读了很多内容,其中大部分使用没有 unsigned int 的 Java。我正在研究具有 unsigned int 的 Objective-C。
让我们考虑以下场景。
棋盘是这样的:
A1
在左下角,是最低位,H8
在右上角,是最高位。
我已经为棋盘上所有位置的所有棋子的移动构建了位掩码。
假设以下简单情况:
- 比赛即将开始。所有棋子都在它们的初始位置。
- 用户试图将
G1
上的骑士移动到 E2
。
显然这个动作是不可能的,因为E2
上有一个棋子。
如何判断一个动作是否有效?
好的,我有所有部分的位掩码是这样的:
1111111111111111000000000000000000000000000000001111111111111111
我有 G1
处骑士可能移动的位掩码,即
00000000
00000000
00000000
00000000
00000000
00000X0X
0000X000
00000000
或位
0000000000001000000001010000000000000000000000000000000000000000
如果我AND
这两个
1111111111111111000000000000000000000000000000001111111111111111
0000000000001000000001010000000000000000000000000000000000000000
我明白了
0000000000001000000000000000000000000000000000000000000000000000
我所知道的是那一点上有一个棋子,但我没有看到它如何告诉我这是否是一个有效的移动。
另一个问题是:假设这一步会让我的国王受到攻击。显然,根据骑士的移动规则,这一步在技术上是可行的,但不可能,因为我无法做出让我的国王受到攻击的移动。
我如何获得这些信息?谢谢
如果你只有 所有棋子的位掩码 那么你根本无法知道你是想把马移到对手的棋子上还是你自己的棋子上.您将不得不为白色部分和黑色部分使用单独的位掩码。
在考虑其他棋子的位置之前,您已经有了马所有可能移动的位掩码 K
。只是按位 AND 这与白色部分所在的 NOT:M = K && !W
现在据我所知,骑士的举动会危及其国王的唯一方式是骑士先前是否挡住了对手的攻击。具体来说,只有当它阻挡了车或象的攻击时。这只有在骑士位于国王位置的八个主要方向之一时才有可能。因此,请检查在八个主要方向之一上是否有从国王到骑士的直线、畅通无阻的直线。如果没有,那么此举不可能危及国王,所以你不必再做任何检查。如果有,则循环遍历M
的位置,查看每个位置后国王是否会受到威胁。
在骑士的特殊情况下,由于它以 L 形行进,因此它无法从 阻挡这次攻击的位置移动到另一个位置它继续阻碍它的位置。所以在骑士的特殊情况下,你应该这样做:
- 检查从国王到骑士是否有不间断的直线。否,转4。
- 检查这条线上是否有对手车或象,其唯一阻碍国王的是您要移动的马。否,转4。
- 如果你已经达到了这一点,那么移动马将导致检查。它不能移动。设置
M = 0
并继续执行程序。
- 设置
M = K && !W
并继续执行程序。
我应该注意,这是假设国王没有开始检查而写的。根据需要进行调整。
好的,我已经在网上阅读了很多内容,其中大部分使用没有 unsigned int 的 Java。我正在研究具有 unsigned int 的 Objective-C。
让我们考虑以下场景。
棋盘是这样的:
A1
在左下角,是最低位,H8
在右上角,是最高位。
我已经为棋盘上所有位置的所有棋子的移动构建了位掩码。
假设以下简单情况:
- 比赛即将开始。所有棋子都在它们的初始位置。
- 用户试图将
G1
上的骑士移动到E2
。
显然这个动作是不可能的,因为E2
上有一个棋子。
如何判断一个动作是否有效?
好的,我有所有部分的位掩码是这样的:
1111111111111111000000000000000000000000000000001111111111111111
我有 G1
处骑士可能移动的位掩码,即
00000000
00000000
00000000
00000000
00000000
00000X0X
0000X000
00000000
或位
0000000000001000000001010000000000000000000000000000000000000000
如果我AND
这两个
1111111111111111000000000000000000000000000000001111111111111111
0000000000001000000001010000000000000000000000000000000000000000
我明白了
0000000000001000000000000000000000000000000000000000000000000000
我所知道的是那一点上有一个棋子,但我没有看到它如何告诉我这是否是一个有效的移动。
另一个问题是:假设这一步会让我的国王受到攻击。显然,根据骑士的移动规则,这一步在技术上是可行的,但不可能,因为我无法做出让我的国王受到攻击的移动。
我如何获得这些信息?谢谢
如果你只有 所有棋子的位掩码 那么你根本无法知道你是想把马移到对手的棋子上还是你自己的棋子上.您将不得不为白色部分和黑色部分使用单独的位掩码。
在考虑其他棋子的位置之前,您已经有了马所有可能移动的位掩码 K
。只是按位 AND 这与白色部分所在的 NOT:M = K && !W
现在据我所知,骑士的举动会危及其国王的唯一方式是骑士先前是否挡住了对手的攻击。具体来说,只有当它阻挡了车或象的攻击时。这只有在骑士位于国王位置的八个主要方向之一时才有可能。因此,请检查在八个主要方向之一上是否有从国王到骑士的直线、畅通无阻的直线。如果没有,那么此举不可能危及国王,所以你不必再做任何检查。如果有,则循环遍历M
的位置,查看每个位置后国王是否会受到威胁。
在骑士的特殊情况下,由于它以 L 形行进,因此它无法从 阻挡这次攻击的位置移动到另一个位置它继续阻碍它的位置。所以在骑士的特殊情况下,你应该这样做:
- 检查从国王到骑士是否有不间断的直线。否,转4。
- 检查这条线上是否有对手车或象,其唯一阻碍国王的是您要移动的马。否,转4。
- 如果你已经达到了这一点,那么移动马将导致检查。它不能移动。设置
M = 0
并继续执行程序。 - 设置
M = K && !W
并继续执行程序。
我应该注意,这是假设国王没有开始检查而写的。根据需要进行调整。