Artificial intelligence 获取位板的占用位掩码

Artificial intelligence 获取位板的占用位掩码,artificial-intelligence,bit-manipulation,chess,Artificial Intelligence,Bit Manipulation,Chess,我用比特板来代表一个国际象棋棋盘,并检查合法的移动。我一直在做的是计算滑动块攻击中源方和目标方之间的占用率我不想通过查找,因此我正在尝试找出是否有可能在不进行查找的情况下为之间的方块获得遮罩。例如,在下面的电路板中,c4上有一辆车: 8 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 4 0 0 R 0 0 0 0 0 3 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0

我用比特板来代表一个国际象棋棋盘,并检查合法的移动。我一直在做的是计算滑动块攻击中源方和目标方之间的占用率我不想通过查找,因此我正在尝试找出是否有可能在不进行查找的情况下为之间的方块获得遮罩。例如,在下面的电路板中,c4上有一辆车:


8 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 0 0 
6 0 0 0 0 0 0 0 0 
5 0 0 0 0 0 0 0 0 
4 0 0 R 0 0 0 0 0 
3 0 0 0 0 0 0 0 0 
2 0 0 0 0 0 0 0 0 
1 0 0 0 0 0 0 0 0 
  a b c d e f g h
给定一个表示空方块(或占用方块,更容易的)的位板和一个伪有效移动Rf4(Rook可以从c4移动到f4),如何获得方块d4-e4的掩码(不包括源和目标方块)

我假设,一旦这是明确的,垂直移动将是很容易的,对角线移动可以通过使用旋转的位板来计算


编辑:位板用ulong/unsigned int64表示,每包8位代表实际板的一个列/行。

除了进行一些预先计算和生成所有可能的工件移动掩码(一种确定的可能性),我认为,在运行时构建遮罩在时间上很可能与简单的“查找每个正方形”方法一样昂贵。

获取方向的单位向量(dx,dy)/dx

在这种情况下,(1,0)


然后用该向量重复增加当前位置,直到到达目的地。增加/分配相应的矩阵单元。

我将在这里做一些假设:电路板存储为64位数字,每个8字节块代表一行。行中的每一位表示一列(a..h)。起点和终点位置为零坐标。i、 e:
start=“C4”=[2,3];end=“F4”=[5,3]


对于增加列的水平移动,可以计算移动的距离:
d=(F4-C4=3)
。减去1以排除目的地,则d-1位的“trail”t为
t=(1这就是为什么问题是,是否可以在给定两个正方形的情况下计算动态掩码,比如说一个方向(东/西)这绝对是可能的,但很可能不会比另一种更简单的方法更便宜。预先计算所有可能性肯定更便宜。@sehe:不,我自己没有描述过,但这是计算机象棋界的每个人都这样做的。我知道你在夸大事实。这可能是事实的一半以上,所以我会就我而言,我找到了一种似乎更适合我的方法——尽管我必须说它涉及到修改过的棋盘(想想8x8)并且仍然会预计算移动表。只是不是以比特板的形式。看起来它并不比从EmptySquares比特板逐点查找好。谢谢你的回答!我今晚会尝试一下并发布结果。一个问题:为什么这样做?这只是针对人类玩家的移动吗?对于AI移动,它似乎更容易计算首先推迟未阻止的移动,然后选择最好的移动,而不是从所有可能的移动中选择一个移动,然后测试它是否被阻止。我这样做是为了验证游戏中写的移动。在某些符号中,你必须计算出移动到目的地的块的源方。例如,在某些符号中,你可能会et只是将rook从c4移动到f4的Rf4。如果你有超过1个rook,你必须使用验证来确定哪一个可以移动到f4。无论如何,对你的公式进行一些小的调整,我为给定的2之间的正方形获得了正确的位掩码。将很快对结果进行基准测试并发布。谢谢!在水平移动中,你可能意味着nt
M=(t如果你还是要使用位盘,不要浪费时间重复生成它们。在一个棋盘上只有1953种选择两条线的方法。你可以轻松地将它们存储在一个数组中。@ThomasAhle在尝试制作一个象棋引擎后放弃了数组
 d = (C4-F4 = -3)
 t = (1<<(-d-1))-1
 M = (t<<dest.column+1)
 //-or-
 M = ((1<<-d)-2)<<(dest.row*8 + dest.column)
 d = (C7-C4 = 3)
 t=(1<<8)
 (d-1) times: { t |= (t<<8)}
 M = t << (start.row*8 + start.column)
 d = (C4-C7 = 3)
 t=(1<<8)
 (d-1) times: { t |= (t<<8)}
 M = t << (dest.row*8 + start.column)