Java中的棋盘位板实现

6
我希望能够创建一个基本的国际象棋引擎(或者不能的话,跳棋/西洋跳棋)。在研究这个主题之后,我相信我想使用一系列位棋盘。我对这个概念有了基本的了解,但我在Java中表示它们时遇到了问题。
我试图使用长整型来表示国际象棋棋盘上的白色棋子为1,其他所有棋子为0:
long whitePieces = 0000000000000000000000000000000000000000000000001111111111111111L;

但是当我打印出来后,我得到了以下46位:
System.out.println(Long.toBinaryString(whitePieces));
1001001001001001001001001001001001001001001001

什么导致了这个结果?我肯定自己有些基本的误解;如果有人能指点一下我,我会非常感激。

国际象棋中有多种棋子,所以一个比特不够吗?而且前导零行不通。你需要一个数组或列表。05是哪个数字?答案:5。改为制作一个二维布尔数组。或者使用某种编码的整数代替多个这样的数组。 - keyser
我计划使用一系列的位棋盘,我会编辑我的帖子以使其更加清晰,谢谢。 - BeepBeep
long类型只存储1而不是0。为什么不使用数组来存储碎片?boolean[][] white = new boolean[num][num]; - KriszDev
为什么你想要做这样的事情呢?一个简单的计数器也可以很好地完成同样的工作,不是吗? - Nir Alfasi
2
如果您想要得到整数 1111111111111111 的二进制表示,它不会是 1111111111111111... 1111111111111111 是二进制数 1111111111111111 的二进制表示,其对应的整数为 65535 - rid
2个回答

11

在你的数值前面添加0b来表示它是一个二进制数。

long whitePieces = 0b0000000000000000000000000000000000000000000000001111111111111111L;
                   ^^

(0b 前缀是在 Java 7 中引入的。如果你使用旧版本,可以使用 Long.parseLong("000...111", 2))


另一种方法:创建一个枚举:

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

将棋盘存储在一个 ChessPiece[8][8]中。这将为您提供比一堆long更清晰的接口,以读取和修改状态。

如果您担心性能问题,请确保将实际表示正确地封装在一个 Board类中(使实际数据结构为私有)。如果您在以后发现ChessPiece[8][8]是一个瓶颈,可以轻松地尝试并将其改为long


修复了,非常感谢。您认为这是一种有效的位棋盘表示方法吗? - BeepBeep
1
根据您实现的算法,使用一些 long 可能是最好的选择。例如,克隆一个棋盘状态应该很快。但在选择 long 之前,请问自己是否清楚地了解了算法中的性能瓶颈,并且是否值得立即深入了解位操作。 - aioobe
问题在于我是一个相当业余的程序员;我以前编写过游戏,但国际象棋AI比我以前做过的任何事情都要难得多。我发现国际象棋移动生成和AI是一个令人困惑的话题,目前唯一我理解这个话题的方法是对长整型进行位运算。我肯定需要进行实验并获得更好的理解,然后才能决定具体的实现方式。 - BeepBeep
关于一个长整型,我该如何处理被忽略的前导零?非常感谢。 - BeepBeep
请认真考虑比long更好的抽象。枚举和二维数组是更好的抽象,可以使您的代码更清晰易懂。总的来说,我建议先编写干净的代码,然后再为速度或内存进行优化。请考虑Ahmdla定律:http://en.wikipedia.org/wiki/Ahmdal%27s_Law - Nick Palmer
显示剩余3条评论

0

你没有存储二进制数,而是十进制数。要使用二进制表示法创建数字,需要在前面加上0b。请参见Oracle关于二进制字面量的文档

此外,一个棋盘的单个方块或棋子根本不能用单个位表示,因此您可能需要重新考虑您的解决方案。


谢谢!您能解释一下为什么一个单独的棋子不能用一个比特表示吗?为什么这些长整数序列对于棋盘的每个方面(白兵,白车,黑兵等)都不足够呢? - BeepBeep
@BeepBeep,一系列的长整型数据可以使用,是的。我以为你计划将所有的数据合并在一起,这是不可能的。 - kviiri
@BeepBeep,我认为laune是指规则,例如易位和吃过路兵,这些规则不能仅从棋子的位置推断出来。 - kviiri
易位和吃过路兵确实很难,但我读到可以使用这种实现方法来解决它们。网络上有大量相关资料,希望我能够掌握! - BeepBeep
@BeepBeep,当然可以,但这正是我们所说的。你必须记得存储它们。 - kviiri
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接