我想实现一个类似于国际象棋的9x9棋盘游戏,它只有类似车子的移动部件。由于我也想开发AI,因此性能至关重要。
我阅读了有关位板的文章,这是一种表示游戏引擎的有效方法。有一些有趣的文章,例如Chess bitboard implementation in Java和https://www.chessprogramming.org/Bitboards。
当然,它们指的是8x8板,并且它们可以快速按位运行,因此非常适用于64位CPU。
在这种情况下,我需要一块9x9的电路板,因此我希望至少使用两个原始数据(64位+ 32位,以便表示我需要的81个正方形)。
// 9x9 board, possible representation (64bits+32bits)
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
+15 unused bits
除了我需要的更复杂的逻辑之外,在这种情况下是否值得使用位板?实际上,我会在性能方面获得很好的收获吗?
最佳答案
有关位板和车架的最好的事情之一是,您可以根据等级或文件的占用情况预先计算合法移动。这很好,因为您无需任何if
指示即可找到所有合法举动。例如,假设您通过移位和遮罩隔离了当前等级,
10100R001
其中1是占用的正方形,0是空的正方形,并且您的车队从正方形3开始(从最低有效位,即位0开始计数)。假设您已预先计算:
ROOK_MOVE[3][101000001] = 000110110
ROOK_CAPTURE[3][101000001] = 001000001
(在这里幼稚的方法就足够了,因为只有9个开始位置,剩下的8个正方形占据256个位置。)然后您可以生成四个合法移动到正方形1、2、4和5。这不需要分支,因为您可以一位一位地提取位(例如使用Kernighan's method)。要获得合法抓获的清单,您需要将第二张面具与该对手的棋子相加。
我希望这对于9x9的板子也能很好地工作。额外的位处理功能仍应比替代功能(
if
和分支)快很多。如评论中所述,找出答案的最佳方法是测试几种方法!