Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
象棋位板的Java实现_Java_Bitboard - Fatal编程技术网

象棋位板的Java实现

象棋位板的Java实现,java,bitboard,Java,Bitboard,我希望创建一个基本的国际象棋(或者失败的话,跳棋/绘图)引擎。在研究了这个主题之后,我很有信心我会使用一系列的比特板。我基本上理解这个概念,但在用Java表示它们时遇到了困难 我尝试使用长符号将棋盘的白色部分表示为1,其他所有部分表示为0: long whitePieces = 0000000000000000000000000000000000000000000000001111111111111111L; 但当我打印出来时,我得到以下46位: System.out.println(Long

我希望创建一个基本的国际象棋(或者失败的话,跳棋/绘图)引擎。在研究了这个主题之后,我很有信心我会使用一系列的比特板。我基本上理解这个概念,但在用Java表示它们时遇到了困难

我尝试使用长符号将棋盘的白色部分表示为1,其他所有部分表示为0:

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的定律: