如何递归填充Java中每个节点下面有4个子节点的树

时间:2016-05-31 03:12:10

标签: java recursion tree minimax

我用Java构建了自己的树数据类,用于minimax算法。树中的每个节点都将保存一个Board对象(我创建的其他东西)代表一个独特的游戏状态,并且树中的边(整数代表移动方向 - 游戏是Tron)将表示由用户达到边缘所导致的状态。我想创建一个函数,它接收一个树并递归填充到深度' DEPTH' (在其他地方保持不变,而不是参数)具有修改的游戏状态,给出每个玩家在每个级别进行的四个可能的整数移动中的每一个。我不太确定如何做到最好......

此外,由于它用于minimax,树结构必须如下:

  • 表示当前未更改的游戏状态的根
  • 代表用户的4个可能动作的第1级儿童代表改变的游戏状态
  • 代表对手4个可能动作的二级儿童代表改变的比赛状态
  • 给定对手移动的用户4次移动的第3级游戏状态,依此类推......延伸至DEPTH级别数

以下是我必须使用的基本方法:

  • 树的构造函数以及通向董事会的整数方向
  • 一个名为produceChildren()的方法,它接受一个Tree和boolean' userMove'并且在Tree的内部儿童列表中添加了4个新的Board,它们代表了给予每个用户或对手4个可能移动的改变的游戏状态。 ' userMove'参数指定作为孩子生成的董事会是否应该是用户4次移动或对手4次移动的结果。
  • 一种名为getDepth()的Tree方法,它返回由父类和子代组成的较大树中的节点深度(如果有的话) - >如果是根
  • ,则返回0

有没有人可能会为我提供一些伪代码(使用我提供的方法,除非需要其他方法),我将如何以这种交替的,最小化的方式填充树?

1 个答案:

答案 0 :(得分:1)

在继续实施逻辑之前,我对您的数据结构有一些评论。

没有必要在树的每个节点中存储完整的电路板副本。鉴于它被用于极小极大,你在每个点上唯一需要知道的是到达那里的动作以及该位置的价值。您需要知道叶子中的板的状态以计算值,但即使这样,一旦计算完成,也不需要保留它的副本。

为了更进一步,minimax甚至不要求你保留树的永久副本。如果使用递归完成,则每个节点的最大值或最小值可以保存在局部变量中并返回 - 不需要在树中保留永久副本。

关于minimax的维基百科文章有一些伪代码可以帮助你入门。