高尔夫纸牌的比赛状态树

时间:2012-04-07 02:11:41

标签: java recursion tree

我正在做一个家庭作业项目,我们需要为高尔夫纸牌游戏生成一个州树。为此,我决定创建一个Move类,表示从一堆卡片到另一堆卡片的移动 - 简单地说,它包含对单个移动中涉及的两个堆栈的引用。我树中的每个节点都知道它的移动是什么。

我目前遇到的问题是我的树太大了 - 就像OutOfMemoryError太大了。 编辑 - 我应该注意到,当我为一个非常小的游戏制作树时,我没有收到错误,但是我的树仍然比它应该大得多!

对于那些不熟悉游戏的人:Golf Solitaire Rules注意 - 我们不需要在国王之后实施对女王的限制。

public void makeTree()
{
  _root = makeNode( null, null, 0 );
}

private Node makeNode( Node parent, Move m, int depth )
{
  Node node = new Node( parent, m, depth );
  ArrayList<Move> moves = findAllMoves();
  if( moves.size() == 0 )
    node.setScore( getScore() );
  else {
    for( Move mv : moves ) {
      mv.makeMove();
      Node child = makeNode( node, mv, depth++ );
      node.addChild( child );
      mv.undoMove();
    }
  }
  return node;
}

private ArrayList<Move> findAllMoves()
{
  ArrayList<Move> moves = new ArrayList<Move>();

  for( int i = 0; i < numPlayPiles; i++ ) {
    if( _play[i].size() != 0 ) {
       if( Math.abs( _play[i].top().getRank().ordinal() - 
          discard.getRank().ordinal() ) == 1 ) {
          moves.add( new Move( _play[i], _discard ) );
       }
    }
  }

  if( _draw.size() != 0 )
    moves.add( new Move( _draw, _discard ) );

  return moves;
}

_play[i]只是在游戏中引用一堆牌。

我意识到这是在一个问题中发布的一些代码,但我的问题只是关于我的逻辑。我怀疑我的错误在于我如何回归makeNode但我完全被困在这里。有人可以证实我的怀疑和/或可能给我一些指导吗?

1 个答案:

答案 0 :(得分:1)

对于任何好奇的人,我的问题是没有正确阅读作业。具体来说,我的findAllMoves方法就是问题所在。一个节点应该 从绘图堆移动或从游戏堆移动所有可能的移动,但不能同时移动。我上面的代码允许每个孩子,即使在相同的深度,每个孩子都从绘图堆创建一个Move来丢弃堆 - 导致大量的重复节点。

它也永远不会检查最终的比赛条件。结果,每个叶子节点要么是一个失败的分数,要么是0(即使玩家已经赢了,该方法也会递归直到抽签堆为空)。