我正在做一个家庭作业项目,我们需要为高尔夫纸牌游戏生成一个状态树。为此,我决定创建一个Move
类,该类表示从一叠纸牌到另一叠纸牌的移动——简单地说,它包含对单个移动所涉及的两个堆栈的引用。我树中的每个节点都知道它在移动什么。
我目前遇到的问题是我的树太大了——就像OutOfMemoryError
太大了。 编辑- 我应该注意,当我为一个非常小的游戏制作一棵树时,我没有收到错误,但我的树仍然比它应该的大得多!
对于那些不熟悉游戏的人:高尔夫纸牌规则。注意- 我们不需要实施在国王之后扮演皇后的限制。
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
但我完全被困在这里。有人可以证实我的怀疑和/或可能给我一些指导吗?