如何处理边缘方攻击

问题描述 投票:0回答:1

我一直在尝试了解国际象棋引擎中用于生成攻击的魔法位板。 我想我大致理解它们,但每个人都未能正确解释的一件事是如何处理带有边缘方块的阻挡物

例如,这个 stackoverflow 答案 https://stackoverflow.com/a/30862064/18749115

阻挡掩模是所有可以被占据并阻挡你的棋子进一步移动的方块。边缘方块不需要成为其中的一部分,因为无论如何你的棋子都无法进一步移动超过该方块

移动板是对于给定的阻挡板,您的棋子可用的移动结果。这包括您的作品可能的捕获。请注意,它还包括捕获您自己的棋子(但您可以将其与“不是”您自己的棋子位置来删除这些棋子)。

这里他解释了不需要包括边缘方块,但他给出的例子没有边缘方块,所以他很容易

and
位板。

我知道不包括边缘方块会大大减小桌子的大小。 但我很困惑,当敌方棋子恰好位于边缘方块中时,我们将如何发起攻击

chess bitboard
1个回答
2
投票

重点是,无论边缘方块上是否有棋子,滑动棋子在任何情况下都会受到相同的攻击。如果边缘方格被占据(被朋友或敌人占据)?该棋子可以攻击它。如果没有被占用呢?嗯,方格仍然受到攻击,攻击方式是一样的。

底线是,无论边缘方块处于占用状态,滑动块始终能够攻击边缘方块。

考虑以下板:

. . . P . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . R . P . .
. . . . . . . .
. . . . . . . .
. . . . . . . . 

棋盘上有 3 个棋子。中间有一个车和另外两个棋子(无论是什么棋子)。车的攻击模式是什么?

. . . 1 . . . .
. . . 1 . . . .
. . . 1 . . . .
. . . 1 . . . .
1 1 1 R 1 1 . .
. . . 1 . . . .
. . . 1 . . . .
. . . 1 . . . . 

现在让我们考虑另一种电路板配置:

. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . R . P . .
. . . . . . . .
. . . . . . . .
. . . . . . . . 

这次D8上没有作品。攻击模式是什么?

. . . 1 . . . .
. . . 1 . . . .
. . . 1 . . . .
. . . 1 . . . .
1 1 1 R 1 1 . .
. . . 1 . . . .
. . . 1 . . . .
. . . 1 . . . . 

一模一样。

D8 上棋子的存在并没有改变攻击模式 - 如果它不存在,我们也会得到相同的棋子。因此,当我们探测预先计算的攻击表时,我们可以安全地屏蔽用于密钥计算的占用位板的边缘方块,因为我们知道无论它们是否被占用,我们都会得到相同的攻击模式。这使我们能够使包含预先计算的攻击的表变得更小并节省一些空间。

如果滑动件位于棋盘内部,则可以将 A 档和 H 档以及 1 档和 8 档完全屏蔽。唯一的问题是当滑动件位于板的边缘时

. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
R . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . . 

现在你还必须仔细考虑A文件的占用情况。您只能屏蔽 1 级和 8 级以及 H 档。

所以掩码计算为:

Bitboard rank_edge_mask = (rank_mask[RANK_1] | rank_mask[RANK_8]) & ~rank_mask[attacking_piece_rank];
Bitboard file_edge_mask = (file_mask[FILE_A] | file_mask[FILE_H]) & ~file_mask[attacking_piece_file];
Bitboard inner_mask = ~(rank_edge_mask | file_edge_mask);
© www.soinside.com 2019 - 2024. All rights reserved.