我已经在这里问了一个关于这个问题的问题:
https://stackoverflow.com/questions/19916951/generating-a-tree-form-array-for-ataxx-game-in-java
但让我一步一步走:
表示the Ataxx game状态(使用7x7网格板)的最佳方式(或最佳数据结构)是什么?
*状态由游戏树的节点表示,但节点中有什么?一个值?一串?另一种数据结构?
答案 0 :(得分:2)
整个电路板可以用某种整数类型的二维数组(即byte[][]
)或者enum[][]
来表示。然后,0
可以代表一个空单元格,1
可以代表一个玩家1的棋子,而2
可以代表一个玩家2的棋子。
游戏树中的节点通常是整个棋盘(byte[][]
或enum[][]
)。
如果您正在寻找更紧凑的电路板表示,您还可以使用base-3或base-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
对齐,或者轻松完成任意数量的复杂操作。它具有很强的表达能力,而且大多数这些操作只需一个时钟周期,因此效率也非常高。