2017-04-11 35 views
0

所以我一直在围绕一个问题缠绕我的头。 我目前正在用Java编写一个基于棋盘的国际象棋引擎(它一直在计算一切)。到目前为止,所有的棋子/王/骑士移动都按预期工作,没有错误。国际象棋引擎中的滑块生成

我需要帮助理解的是滑块移动的一代。我已经为每个方块/块生成了一系列空板移动。根据我目前的理解,我还需要开发一个包含每个平方的每个可能占用的数组 - 然后以某种方式根据各种方法查找该数组。

这种想法正确吗?是从0到2^63中选取每个数字,然后用该方块的移动位图板进行异化,然后用某种方法(魔术/旋转的位图板)来存储该数组,以初始化数组并以相同的方式访问它运行?

伪代码和解释非常感谢。 (顺便说一句,我正在使用>>>)。

回答

3

有许多方法可以产生滑动块移动的位置,具有不同的性能和复杂性。其中很多都列出了here

也许最快和最常见的是magic bitboards,它使用位板与“魔术”预先计算的值相乘来一次生成在所有四个方向上可能的移动。缺点是它使用非常大的查找表。这可能不应该是你的第一个实现,因为它更复杂。

Obstruction differencehyperbola quintessence没有比魔术贴片慢很多,但更容易实现。

即使更简单也更慢是dumb7fill这是一个循环在每个可能的方向,而不需要任何查找表。

+0

谢谢您,但即使使用魔术贴纸,您也可以使用幻数来准确参考查找表。我的问题更多的是如何生成查找表。除非我不明白。 – thePanthurr

+0

@thePanthurr您的问题使您看起来像您认为相同的查找表将用于任何滑动块的方法。但他们都需要不同的查找表。其中一些(例如魔术棋盘)使用多个查找表。你应该决定你想使用哪种方法,阅读它,然后具体询问你不了解的内容。 – interjay

+0

@thePanthurr你不需要自己生成表格。 – SmallChess