我想实现一个类似于国际象棋的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
除了我需要的更复杂的逻辑之外,在这种情况下是否值得使用位板?实际上,我会在性能上获得很好的收获吗?
答案 0 :(得分:0)
关于位板和车子的最好的事情之一是,您可以根据等级或文件的占用情况预先计算合法移动。这非常好,因为您无需任何OrderTitle.generateMessage(...)
指令就能找到所有合法的举动。例如,假设您通过移动和遮罩隔离了当前等级,然后得到了
if
其中1是一个占用的正方形,0是一个空正方形,并且您的车队开始于正方形3(从最低有效位,即位0开始计数)。假设您已经预先计算:
10100R001
(这里的幼稚方法足够好,因为只有9个起始位置,剩下的8个正方形占据256个位置。)然后,您可以生成四个合法移动到正方形1、2、4和5。这不需要分支因为您可以一位一位地提取位(例如,使用Kernighan's method)。要获取合法抓获清单,您需要将第二张面具与该对手的棋子相加。
我希望这对于9x9的板子也能很好地工作。额外的位处理功能仍应比替代功能(ROOK_MOVE[3][101000001] = 000110110
ROOK_CAPTURE[3][101000001] = 001000001
和分支)快很多。如评论中所述,找出答案的最佳方法是测试几种方法!