【问题标题】:Game State Tree for Golf Solitaire高尔夫纸牌游戏状态树
【发布时间】:2012-04-07 02:11:40
【问题描述】:

我正在做一个家庭作业项目,我们需要为高尔夫纸牌游戏生成一个状态树。为此,我决定创建一个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,但我完全被困在这里。有人可以证实我的怀疑和/或可能给我一些指导吗?

【问题讨论】:

  • 您是否必须生成所有可能的移动组合,因为我认为这就是这样做的?如果你只需要生成一个移动组合,只需选择你得到的第一个。如果你必须制定一个获胜策略,它会更复杂,但你可以做一些类似于深度优先搜索获胜策略的事情(基本上沿着给定的路径继续,直到你无法获胜,然后回溯到最后做出的决定和选择另一条路径并继续此操作,直到找到一条成功的路径)。主要思想是您必须删除未使用的动作以避免内存不足。
  • 我们应该为每个可能的移动组合生成一棵树,然后我们报告节点总数、叶节点数(游戏结束)以及可能的最高和最低分数。虽然我从问题中删除了一些代码,但每个内部节点的分数都设置为其子节点的最高分数,因此我们可以沿着树向下找到可能的最佳分数。
  • 好的,我建议的一件事是确保没有循环。使用调试器并查看是否可以生成树中存在循环的案例。如果有,那就意味着出了点问题。

标签: java recursion tree


【解决方案1】:

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

它也从不检查游戏结束条件。结果,每个叶节点要么是一个失败的分数,要么是 0(即使玩家已经赢了,该方法也会递归直到平局为空)。

【讨论】:

    猜你喜欢
    • 2015-04-12
    • 2013-12-08
    • 2011-01-15
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    相关资源
    最近更新 更多