Java 最有效的棋盘表示方法

Java 最有效的棋盘表示方法,java,chess,Java,Chess,我有一个用Java编写的国际象棋程序。目前我使用2d字符数组来表示棋盘。大写字符表示白色,小写字符表示黑色。我应该使用字节数组来减少内存使用吗?或者是枚举?谢谢。简而言之:最有效、最专业的方法是使用比特板 基本上,有3种常用的表示棋盘的方法: 8x8二维阵列: 缓慢但易于维护 10x12一维阵列: 更快一点,更棘手一点 比特板: 它们是最快的方法,也用于专业引擎,如Stockfish或Rybka。基本上,每个图形类型都需要一个64位uint,其中每个位代表一个字段。有关更多信息,我推荐ches

我有一个用Java编写的国际象棋程序。目前我使用2d字符数组来表示棋盘。大写字符表示白色,小写字符表示黑色。我应该使用字节数组来减少内存使用吗?或者是枚举?谢谢。

简而言之:最有效、最专业的方法是使用比特板

基本上,有3种常用的表示棋盘的方法:

  • 8x8二维阵列: 缓慢但易于维护

  • 10x12一维阵列: 更快一点,更棘手一点

  • 比特板: 它们是最快的方法,也用于专业引擎,如Stockfish或Rybka。基本上,每个图形类型都需要一个64位uint,其中每个位代表一个字段。有关更多信息,我推荐chessprogramming wiki或google=>bitboards


只有64个单元,根本不需要关心内存使用情况。我会创建一个2D类数组,比如
ChessBoardCell[][]
如果你真的想节省内存,你可以将一个片段的位置存储为2x 3位,片段本身存储为4位(1表示颜色,3表示片段)。这样,您只需要一个32*10=320位或10字节的缓冲区。你可能会找到另一个窥探的方法。但老实说,如果您担心将棋盘存储为64个字符,那么您应该从Java切换到另一种语言,如C或更低级的语言。但是你不应该担心这个问题,直到它成为一个问题,也就是说,直到你想储存数百万或数十亿的棋盘。谢谢你的评论。我的国际象棋程序有一个撤销功能,每次移动时都会将2d数组添加到数组列表中。@Alex Shesterov国际象棋引擎的强度实际上取决于移动生成器的执行速度。使用类是你可能犯过的最严重的错误,因为它太慢了。@xXliolauXx,我完全不同意;如果使用一种奇特的方式来表示单元格,并且其他信息(如尝试的移动等)存储在其他地方,那么存储和检索有关单元格的附加信息的逻辑可能会花费更多的时间。此外,如果效率很重要,而且是关于CPU时间,那么Java无论如何都不是正确的语言。所以我必须在一个类中编写检查合法移动的所有代码?没有啊?基本上是的。我仍然建议创建一个类或结构棋盘,以便将位棋盘干净地放在一起。尽可能使用静态方法和类,这会带来另一个性能提升。@xXliolauXx您忽略的一个非常重要的细节是,特定于块的位板无法表示哪些块是黑色的,哪些块是白色的。为此,您需要额外的位板。因此,总共有六个比特板:当铺、骑士、主教、车、女王和派系。两个玩家只能有一个国王,因此不需要额外的比特板。从那里,您可以使用每个玩家一个字节来表示国王的位置(1,64)。为了节省额外的字节,您还可以将两个派系的国王放入一个字节中,其中低位/高位代表两个国王的位置。@hatefind如果我误解了您的评论,我很抱歉。首先,为什么你认为这是一个非常重要的细节?第二,这取决于你对已经包括颜色的体型的定义。第三,是的,你所有关于节省空间的建议都是正确的,但是在一个国际象棋引擎中,这一点都不重要。位板的优点不是存储空间,而是能够将移动生成器实现为位操作,这是运行时最耗时的部分。存储只是查找表的一个问题,但无论如何,您只在那里存储哈希。