1

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

让我们考虑以下场景。

板子是这样的:

在此处输入图像描述

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

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

假设以下简单情况:

  1. 游戏将开始。所有棋子都在它们的初始位置。
  2. 用户试图将骑士移动G1E2.

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

我如何发现运动是否有效?

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

1111111111111111000000000000000000000000000000001111111111111111

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

00000000
00000000
00000000
00000000
00000000
00000X0X
0000X000
00000000

或位

0000000000001000000001010000000000000000000000000000000000000000

如果我AND这两个

1111111111111111000000000000000000000000000000001111111111111111 0000000000001000000001010000000000000000000000000000000000000000

我明白了

0000000000001000000000000000000000000000000000000000000000000000

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

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

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

4

1 回答 1

1

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

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

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

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

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

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

于 2016-07-30T09:54:39.747 回答