Java Ataxx游戏中状态的表示

Java Ataxx游戏中状态的表示,java,algorithm,tree,minimax,Java,Algorithm,Tree,Minimax,我已经在这里问了一个关于这个主题的问题: 但让我一步一步地说: 表示状态的最佳方式(或最佳数据结构)是什么(使用7x7网格板) *状态由游戏树的一个节点表示,但节点中有什么?价值观?一根绳子?另一种数据结构?整个电路板可以由某种整型的2D数组(即字节[]【】【】)或枚举[]【】表示。例如,0可以表示一个空单元格,1可以表示一个有玩家1的棋子的单元格,2可以表示一个有玩家2的棋子的单元格 游戏树中的节点通常是整个棋盘(因此字节[]【】或枚举[]【】【】) 如果您正在寻找一种更紧凑的电路板表示法,

我已经在这里问了一个关于这个主题的问题:

但让我一步一步地说:

表示状态的最佳方式(或最佳数据结构)是什么(使用7x7网格板)


*状态由游戏树的一个节点表示,但节点中有什么?价值观?一根绳子?另一种数据结构?

整个电路板可以由某种整型的2D数组(即
字节[]【】【】
)或
枚举[]【】
表示。例如,
0
可以表示一个空单元格,
1
可以表示一个有玩家1的棋子的单元格,
2
可以表示一个有玩家2的棋子的单元格

游戏树中的节点通常是整个棋盘(因此
字节[]【】
枚举[]【】【】


如果您正在寻找一种更紧凑的电路板表示法,您也可以使用or(2位,更容易使用)表示法来表示电路板,但这有点复杂(在出现内存/运行时间问题之前,您可能会一直使用2D数组-只要您将其抽象为一个类,转换就应该相当简单,并且易于测试)。

整个电路板可以由某种整型的2D数组(即
字节[][
)或
枚举[][]表示
。例如,
0
可以表示一个空单元格,
1
可以表示有玩家1的棋子的单元格,
2
可以表示有玩家2的棋子的单元格

游戏树中的节点通常是整个棋盘(因此
字节[]【】
枚举[]【】【】


如果您正在寻找一种更紧凑的电路板表示法,您也可以使用or(2位,更容易使用)表示法来表示电路板,但这有点复杂(在出现内存/运行时间问题之前,您可能会一直使用2D数组-只要您将其抽象为一个类,转换就应该相当简单,并且易于测试)。

整个电路板可以由某种整型的2D数组(即
字节[][
)或
枚举[][]表示
。例如,
0
可以表示一个空单元格,
1
可以表示有玩家1的棋子的单元格,
2
可以表示有玩家2的棋子的单元格

游戏树中的节点通常是整个棋盘(因此
字节[]【】
枚举[]【】【】


如果您正在寻找一种更紧凑的电路板表示法,您也可以使用or(2位,更容易使用)表示法来表示电路板,但这有点复杂(在出现内存/运行时间问题之前,您可能会一直使用2D数组-只要您将其抽象为一个类,转换就应该相当简单,并且易于测试)。

整个电路板可以由某种整型的2D数组(即
字节[][
)或
枚举[][]表示
。例如,
0
可以表示一个空单元格,
1
可以表示有玩家1的棋子的单元格,
2
可以表示有玩家2的棋子的单元格

游戏树中的节点通常是整个棋盘(因此
字节[]【】
枚举[]【】【】


如果您正在寻找一种更紧凑的电路板表示法,您也可以使用or(2位,更容易使用)表示法来表示电路板,但这有点复杂(在开始出现内存/运行时间问题之前,您可能会一直使用2D数组-只要将其抽象到类中,转换就应该相当简单,并且易于测试).

我会使用一种从国际象棋和跳棋中提取的非常有效的表示法:。这个概念是用位来表示棋子,因此玩家的棋子集可以用一个位域来表示。我们至少需要49位,所以64位整数可以很好地工作

这是一种内存和计算效率极高的表示法,而且比其他表示法更具表现力。通过按位操作,您可以轻松地同时处理单个片段和整个集合。使用基于数组的表示法,例如
byte[][]
建议,对于可以由带有位板的单个运算符表示的操作(
&
|
^
,等等),您必须循环太多

设置的位给出玩家的棋子。例如,这可能是一个玩家的棋盘。你需要另一个玩家的棋盘

0000000000000000000000000000000010000000001000000
在十进制中,这将是
long bitboard=65600;
。如果我们插入一些新行,它将如下所示:

0000000
0000000
0000000
0000000
0000100
0000000
1000000
为了有效地处理这个问题,我们可以预先计算一些表格。因此,对于第32位/正方形中心的工件,我们可能会有一个
环绕
表格,当用作
环绕[square]
时,它给出:

0000000
0000000
0000000
0001110
0001010
0001110
0000000

然后,我们可以通过按位
&
运算符找到它与对手的位板的交点,或者将其与
|
进行并集,或者与
^
进行差分,等等。您可以使用
将整个位板上移一行,我将采用国际象棋和跳棋中非常有效的表示:pt是用位来表示片段,因此播放器的片段集可以用一个位域来表示。我们至少需要49位,所以64位整数可以很好地工作

这是一种内存和计算效率极高的表示法,而且比其他表示法更具表现力。通过按位操作,您可以轻松地同时处理单个片段和整个集合。使用基于数组的表示法,例如
byte[][]
建议,对于可以由带有位板的单个运算符表示的操作(
&
|
^
,等等),您必须循环太多

设置位给出pl