象棋位板的Java实现
我希望创建一个基本的国际象棋(或者失败的话,跳棋/绘图)引擎。在研究了这个主题之后,我很有信心我会使用一系列的比特板。我基本上理解这个概念,但在用Java表示它们时遇到了困难 我尝试使用长符号将棋盘的白色部分表示为1,其他所有部分表示为0:象棋位板的Java实现,java,bitboard,Java,Bitboard,我希望创建一个基本的国际象棋(或者失败的话,跳棋/绘图)引擎。在研究了这个主题之后,我很有信心我会使用一系列的比特板。我基本上理解这个概念,但在用Java表示它们时遇到了困难 我尝试使用长符号将棋盘的白色部分表示为1,其他所有部分表示为0: long whitePieces = 0000000000000000000000000000000000000000000000001111111111111111L; 但当我打印出来时,我得到以下46位: System.out.println(Long
long whitePieces = 0000000000000000000000000000000000000000000000001111111111111111L;
但当我打印出来时,我得到以下46位:
System.out.println(Long.toBinaryString(whitePieces));
1001001001001001001001001001001001001001001001
是什么导致了这一结果?我确信这里有一些我根本误解的东西;如果有人能给我指出正确的方向,我将非常感激 将
0b
添加到long前面,表示它是一个二进制数
long whitePieces = 0b0000000000000000000000000000000000000000000000001111111111111111L;
^^
(0b
前缀是在Java 7中引入的。如果您使用的是较旧的版本,则可以执行Long.parseLong(“000…111”,2)
)
另一种方法:创建枚举如何:
enum ChessPiece { Pawn, Knight, ... };
并将棋盘存储在棋子[8][8]
中。这将为您提供一个比一堆long
s更干净的界面来读取和修改状态
如果您关心性能,只需将实际的表示形式正确封装在
Board
类中(将实际数据结构设置为私有)。如果你后来发现ChessPiece[8][8]
是一个瓶颈,你可以不费吹灰之力把它改成long
。你存储的不是二进制数,而是十进制数。要使用二进制表示法创建数字,需要在其前面加上0b
。看
此外,一块棋盘或一块棋盘根本不能用一个位来表示,因此您可能需要重新考虑您的总体解决方案。国际象棋有多种棋子,所以一个位是不够的?前导零不起作用。您需要一个数组或列表。哪个号码是
05
?,回答:5
。制作一个布尔值的二维数组。或者是一个编码的整数,而不是多个这样的数组。我计划使用一系列的比特板,我会编辑我的帖子,让它更清晰,谢谢。long不存储0,只存储1。为什么不使用数组来存储碎片?布尔[][]白=新布尔[num][num];你为什么要做那样的事?一个简单的计数器也能做同样的工作,不是吗?如果你在寻找整数的二进制表示形式1111111111111
,它就不是1111111111111
1111111111111
是二进制数1111111111111
的二进制表示,它是整数65535
。谢谢!你能解释一下为什么一个磁贴不能用一个位来表示吗?为什么在棋盘的每一个方面(白棋子、白车、黑棋子等),一系列这样的长棋子是不够的?每种棋子一个长fpr就足以存储当前位置。但你也必须存储棋子的状态,至少对国王、车和棋子来说是这样。你能澄清一下你所说的状态是什么吗?@beepep,一系列的多头操作会有效的,是的。“我以为你们打算把所有的碎片都放在一个里面,这是不可能的。”嘟嘟嘟嘟,我相信劳恩的意思是说,单凭碎片的位置是无法推断出的,比如说,城堡和过道。这就解决了这个问题,非常感谢。在您看来,这是一种有效的位板表示法吗?根据您实现的算法,一些long
s可能是一种方法。例如,克隆电路板状态应该很快。但是在你选择一个长的之前,问问你自己,你是否清楚你的算法中的性能瓶颈是什么,是否值得马上投入到一些无聊的事情中去;我以前编程过游戏,但国际象棋AI比我以前做过的任何事情都要难。我发现国际象棋移动生成和人工智能是一个令人困惑的话题,而对长码进行位运算是目前我理解这个话题的唯一方式。在我决定具体的实现之前,我肯定需要进行实验并获得更好的理解。另外,关于一个较长的问题,我将如何处理忽略的前导零?许多感谢都强烈地考虑了比长时间更好的抽象。enum和二维数组是一种更好的抽象,可以使编写代码更加清晰。一般来说,我建议先编写干净的代码,然后优化速度或内存。请考虑AHMDA的定律: