在Ataxx游戏中代表一个州

时间:2013-11-13 16:10:12

标签: java algorithm tree minimax

我已经在这里问了一个关于这个问题的问题:
https://stackoverflow.com/questions/19916951/generating-a-tree-form-array-for-ataxx-game-in-java

但让我一步一步走:

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

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

2 个答案:

答案 0 :(得分:2)

整个电路板可以用某种整数类型的二维数组(即byte[][])或者enum[][]来表示。然后,0可以代表一个空单元格,1可以代表一个玩家1的棋子,而2可以代表一个玩家2的棋子。

游戏树中的节点通常是整个棋盘(byte[][]enum[][])。

如果您正在寻找更紧凑的电路板表示,您还可以使用base-3base-4(2位,更易于使用)表示法来表示电路板,但这有点复杂(你可能会坚持使用2D数组,直到你开始有内存/运行时问题 - 只要你把它抽象成一个类,转换应该相当简单,并且易于测试)。

答案 1 :(得分:1)

我将采用国际象棋和西洋棋棋子的非常有效的表现形式:bitboards。该概念是用比特来表示棋子,因此玩家的棋子组可以用比特字段来表示。我们需要至少49位,因此64位整数可以很好地工作。

这是一种极其记忆和计算效率的表示,并且它比其他表示更具表现力。通过按位操作,您可以轻松地同时处理单个部分以及整个集合。使用基于数组的表示(例如建议的byte[][]),您必须为可由具有位板的单个运算符(&|,{{1}表示的操作循环太多},^<<等)。

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

>>>

在十进制中,这将是0000000000000000000000000000000010000000001000000 。如果我们插入一些新行,它看起来像这样:

long bitboard = 65600;

为了有效地使用它,我们可以预先计算一些表。因此,对于位于第32位/平方中心的部分,我们可能会有一个0000000 0000000 0000000 0000000 0000100 0000000 1000000 表,当用作surrounding时会给出:

surrounding[square]

然后我们可以通过按位0000000 0000000 0000000 0001110 0001010 0001110 0000000 运算符找到它与对手的位板的交点,或者使用&|结合,或与^等结合。您可以转换将整个位板与<< 7对齐,或者轻松完成任意数量的复杂操作。它具有很强的表达能力,而且大多数这些操作只需一个时钟周期,因此效率也非常高。