Java中的国际象棋位板实现

时间:2014-08-15 07:10:33

标签: java bitboard

我正在寻找创建一个基本的国际象棋(或失败,跳棋/选秀)引擎。在研究了这个主题之后,我非常有信心想要使用一系列的位板。我在基本层面理解这个概念,但我在用Java表示它们时遇到了麻烦。

我试图将棋盘的白色部分表示为1,其他所有部分使用long表示为0:

long whitePieces = 0000000000000000000000000000000000000000000000001111111111111111L;

但是当我打印出来时,我得到以下46位:

System.out.println(Long.toBinaryString(whitePieces));
1001001001001001001001001001001001001001001001

导致此结果的原因是什么?我确信这里有一些我从根本上误解的东西;如果有人能指出我正确的方向,我将非常感激。

2 个答案:

答案 0 :(得分:9)

在你的前面添加0b,说它是二进制数。

long whitePieces = 0b0000000000000000000000000000000000000000000000001111111111111111L;
                   ^^

(Java {7}中引入了0b前缀。如果您使用的是旧版本,则可以执行Long.parseLong("000...111", 2)


另一种方法:如何创建枚举:

enum ChessPiece { Pawn, Knight, ... };

并将电路板存储在ChessPiece[8][8]中。这应该为您提供一个更清晰的界面来读取和修改状态,而不是一堆long给你的。

如果您关注性能,只需将实际表示正确地封装在Board类中(使实际数据结构保密)。如果您稍后发现ChessPiece[8][8]已成为瓶颈,您可以在不费吹灰之力的情况下将其更改为long

答案 1 :(得分:0)

您不会存储二进制数字,而是存储十进制数字。要使用二进制表示法创建数字,您需要在其前面添加0b。请参阅Oracle docs on binary literals

此外,单个棋盘或棋盘只能用一个比特来代表,所以你可能想要重新考虑你的解决方案。