当前位置: 首页 > 知识库问答 >
问题:

国际象棋引擎中的滑块生成

井昊乾
2023-03-14

所以我一直在思考一个问题。我目前正在用Java编写一个基于比特板的国际象棋引擎(这是一个解决所有问题的过程)。到目前为止,所有的棋子/国王/骑士的动作都按预期进行,而且没有bug。

我需要帮助理解的是滑动件移动生成。我已经为每个方块/棋子生成了一系列空棋盘动作。根据我目前的理解,我还需要开发一个数组,包含每个广场上的每个可能占用空间——然后根据各种方法查找该数组

这种想法正确吗?这是不是一个从0到2^63的每一个数字都被挑选出来,然后用移动比特板对其进行异或运算,然后用某种方法(魔法/旋转比特板)将其存储起来,以初始化数组,并在运行时以同样的方式访问它?

伪代码和解释非常受欢迎。(我正在使用

共有2个答案

陆信瑞
2023-03-14

我个人使用双曲线精髓技术来生成滑块(车、主教)

姚向晨
2023-03-14

有很多方法可以为比特板生成滑动块移动,但性能和复杂性各不相同。这里列出了很多。

可能最快也是最常见的是magic bitboards,它使用“magic”预先计算的值乘以bitboards,一次生成所有四个方向的可能移动。缺点是它使用非常大的查找表。这可能不应该是您的第一个实现,因为它更复杂。

阻塞差和双曲线精粹并不比魔术位板慢多少,同时更容易实现。

更简单、更慢的是dumb7fill,它是一个在所有可能方向上的循环,不需要任何查找表。

 类似资料:
  • 我正在创建一个国际象棋游戏,现在我已经用所有棋子填充了我的图形棋盘,现在我需要使用鼠标滑动器来移动棋子。在实现图形版本之前,我创建了一个2D控制台版本,它采用了“玩家移动”,所以我有所有这些方法,但我现在需要使用Mouselistener,我阅读了这些方法,但是,我需要在每个类中实现Mouselistener吗? 我有1个抽象工件类和7个子类(包括虚拟工件),还有一个棋盘类,它填充所有工件,并提供

  • DreamChess 是一款开放源码、跨平台(可在 Windows、Mac OS X 及 Linux 上运行)的 3D 国际象棋游戏。该游戏包含自身的引擎 Dreamer,提供各种国际象棋棋盘,并具有背景音乐及声效等其他附属功能。

  • 我刚刚开始编写国际象棋引擎,但最近刚刚完成了我的第一个程序。但它运行得很慢,所以我切换到了比特板,现在切换到了魔法比特板。我经常使用国际象棋编程维基。 我现在尝试一个测试位置和perft函数,看看程序每秒可以计算多少节点(包括批量计数)。现在,我的perft函数被设置为只计算伪合法移动,我已经设置make_move函数不切换回合。因此我可以用perft分析位置R7/8/8/8/8/8/8 w。 然

  • 我正在下国际象棋,除了一件事,我几乎得到了所有的东西:我需要使棋手不可能将棋子移动到棋盘上。我很难解决这个问题。 我现在用伪代码生成的有效移动是:类getMoveLocations(我定义了一个位置为国际象棋中的一个方块):如果这个位置在边界内,这个位置的棋子是敌人的棋子,并且模拟的移动不会导致棋盘被检查,然后将该位置添加到工件可以移动到的可能位置。 问题是我如何检查棋盘是否“在检查中”。在我的代

  • 我已经有一个Board对象,包含一个碎片列表。Piece是一个抽象类,有一个位置(x,y)和一个颜色(黑色或白色)。然后是King、Queen、Knight这三个类,实现了Piece类。 谢谢

  • 上面的代码显示了一个可以上下移动的部分的示例。这不是一个有效的棋步。所以,如果我要移动一个皇后,我该怎么做呢?我们只是假设我们已经有了一个矩阵(x,y)8×8的板。