好的我已经在网上阅读了很多东西,其中大多数使用的是没有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
我所知道的是,那时候有一块,但我没有看到这是如何告诉我这是否是一个有效的举动。
另一个问题是:假设此举会让我的国王受到攻击。显然,根据骑士的行动规则,此举在技术上是可行的,但不可能,因为我不能采取行动让我的国王受到攻击。
我如何获得这些信息?感谢
答案 0 :(得分:0)
如果你只有所有作品的位掩码,那么你根本无法知道你是否试图将骑士移动到对手的作品或你的拥有。你将不得不为白色碎片和黑色碎片使用单独的位掩码。
在考虑其他棋子的位置之前,你已经拥有骑士所有可能移动的位掩码K
。只是按位和这与白色部分所在的NOT:M = K && !W
现在据我所知,骑士的行动会危及国王的唯一方法就是骑士先前阻挡了对手的攻击。具体来说,只有它阻止了车或主教的攻击。只有当骑士位于国王位置的八个基本方向之一时,才有可能实现这一点。因此,检查在八个主要方向之一中是否有从国王到骑士的直线,畅通线。如果没有,那么移动不可能危及国王,所以你不需要再做任何检查。如果有,则循环通过M
的位置,检查国王是否会在每个人之后受到威胁。
在骑士的特殊情况下,由于它以L形行进,所以它无法从 阻挡此攻击的位置移动到另一个位置继续挫败它。因此,在骑士的特殊情况下,您应该执行以下操作:
M = 0
并继续使用该程序。M = K && !W
并继续使用该程序。我应该注意到,这是假设国王没有开始检查。根据需要进行调整。