使用魔术位板建立国际象棋......我怎么知道运动是否有效

时间:2016-07-30 03:34:27

标签: chess bitboard

好的我已经在网上阅读了很多东西,其中大多数使用的是没有unsigned int的Java。我正在研究具有unsigned int的Objective-C。

让我们考虑以下情况。

董事会是这样的:

enter image description here

A1位于左下角,是最低位,H8位于右上角,是最重要的位。

我为棋盘上的所有位置构建了所有棋子移动的位掩码。

假设以下简单情况:

  1. 游戏将开始。所有作品都在他们的初始位置。
  2. 用户尝试将骑士G1移至E2
  3. 显然这种运动是不可能的,因为E2上有一个棋子。

    如何判断移动是否有效?

    好的,我有所有部分的位掩码:

    1111111111111111000000000000000000000000000000001111111111111111

    我有G1骑士可能的动作的位掩码

    00000000
    00000000
    00000000
    00000000
    00000000
    00000X0X
    0000X000
    00000000
    

    或位

    0000000000001000000001010000000000000000000000000000000000000000

    如果我AND这两个

    1111111111111111000000000000000000000000000000001111111111111111 0000000000001000000001010000000000000000000000000000000000000000

    我得到了

    0000000000001000000000000000000000000000000000000000000000000000

    我所知道的是,那时候有一块,但我没有看到这是如何告诉我这是否是一个有效的举动。

    另一个问题是:假设此举会让我的国王受到攻击。显然,根据骑士的行动规则,此举在技术上是可行的,但不可能,因为我不能采取行动让我的国王受到攻击。

    我如何获得这些信息?感谢

1 个答案:

答案 0 :(得分:0)

如果你只有所有作品的位掩码,那么你根本无法知道你是否试图将骑士移动到对手的作品或你的拥有。你将不得不为白色碎片和黑色碎片使用单独的位掩码。

在考虑其他棋子的位置之前,你已经拥有骑士所有可能移动的位掩码K。只是按位和这与白色部分所在的NOT:M = K && !W

现在据我所知,骑士的行动会危及国王的唯一方法就是骑士先前阻挡了对手的攻击。具体来说,只有它阻止了车或主教的攻击。只有当骑士位于国王位置的八个基本方向之一时,才有可能实现这一点。因此,检查在八个主要方向之一中是否有从国王到骑士的直线,畅通线。如果没有,那么移动不可能危及国王,所以你不需要再做任何检查。如果有,则循环通过M的位置,检查国王是否会在每个人之后受到威胁。

在骑士的特殊情况下,由于它以L形行进,所以它无法从 阻挡此攻击的位置移动到另一个位置继续挫败它。因此,在骑士的特殊情况下,您应该执行以下操作:

  1. 检查国王与骑士是否有不间断的直线。如果没有,请转到4.
  2. 检查这条线上是否有对手车或主教,其中唯一的阻碍国王的障碍就是你想要移动的骑士。如果没有,请转到4.
  3. 如果你已达到这一点,那么移动骑士将导致检查。它无法移动。设置M = 0并继续使用该程序。
  4. 设置M = K && !W并继续使用该程序。
  5. 我应该注意到,这是假设国王没有开始检查。根据需要进行调整。

相关问题