6

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

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

long whitePieces = 0000000000000000000000000000000000000000000000001111111111111111L;

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

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

是什么导致了这个结果?我敢肯定我在这里从根本上误解了一些东西。如果有人能指出我正确的方向,我将不胜感激。

4

2 回答 2

10

0b在你的long前面加上一个二进制数。

long whitePieces = 0b0000000000000000000000000000000000000000000000001111111111111111L;
                   ^^

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


一种不同的方法:如何创建一个枚举:

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

并将电路板存放在ChessPiece[8][8]. 这应该为您提供一个更简洁的界面来读取和修改状态,而不是一堆longs 给您的。

如果您关心性能,只需将实际表示正确封装在一个Board类中(将实际数据结构设为私有)。如果您稍后发现这ChessPiece[8][8]是一个瓶颈,您可以long尝试并轻松将其更改为 a 。

于 2014-08-15T07:14:20.457 回答
0

您存储的不是二进制数,而是十进制数。要使用二进制表示法创建数字,您需要在其前面加上0b. 请参阅有关二进制文字的 Oracle 文档

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

于 2014-08-15T07:16:54.097 回答