【问题标题】:Building a chess using magic bitboard... how do I know if the movement is valid使用魔术位板构建国际象棋......我如何知道移动是否有效
【发布时间】:2016-07-30 03:34:27
【问题描述】:

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

让我们考虑以下场景。

板子是这样的:

A1 位于左下方,是最低有效位,H8 位于右上方,是最高有效位。

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

假设以下简单情况:

  1. 游戏将开始。所有棋子都在初始位置。
  2. 用户试图将G1 上的骑士移动到E2

显然这个动作是不可能的,因为E2上有一个棋子。

我如何发现一个动作是否有效?

好的,我有所有片段的位掩码:

1111111111111111000000000000000000000000000000001111111111111111

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

00000000
00000000
00000000
00000000
00000000
00000X0X
0000X000
00000000

或以位为单位

0000000000001000000001010000000000000000000000000000000000000000

如果我AND这两个

1111111111111111000000000000000000000000000000001111111111111111 0000000000001000000001010000000000000000000000000000000000000000

我明白了

0000000000001000000000000000000000000000000000000000000000000000

我只知道当时有一块棋子,但我不知道这如何告诉我这是否是一个有效的举动。

另一个问题是:假设这一步会让我的国王受到攻击。显然,根据骑士的移动规则,这在技术上是可行的,但不可能,因为我无法做出让我的国王受到攻击的动作。

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

【问题讨论】:

  • 你只会得到伪有效的移动,这意味着棋子有可能移动到那里。结果位置是否有效,您必须单独检查。要么通过验证结果位置的国王状态,要么等待对手捕获你的国王并将减号 CheckMate 分配给它。
  • 注意:same question 在 chess.se 上。

标签: chess bitboard


【解决方案1】:

如果您只有所有棋子的位掩码,那么您根本无法知道您是想将马移动到对手的棋子上还是自己的棋子上。您必须为白色块和黑色块使用单独的位掩码。

在考虑其他棋子的位置之前,您已经有了马的所有可能动作的位掩码K。只需按位与白色部分所在位置的 NOT 相加:M = K && !W

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

在骑士的特殊情况下,由于它以 L 形行进,它不可能从它 阻挡这次攻击的位置移动到它继续攻击的另一个位置阻止它。所以在骑士的特殊情况下,你应该做到以下几点:

  1. 检查从国王到骑士是否有不间断的直线。如果没有,请转到 4。
  2. 检查这条线上是否有对手的车或主教,其唯一的障碍就是你试图移动的马。如果没有,请转到 4。
  3. 如果你已经达到了这一点,那么移动骑士将导致检查。它不能被移动。设置M = 0 并继续程序。
  4. 设置M = K && !W 并继续程序。

我应该注意到,这是在假设国王没有开始检查的情况下编写的。根据需要进行调整。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    相关资源
    最近更新 更多