私は、ゴルフソリティアのゲームの状態ツリーを生成する必要がある宿題プロジェクトに取り組んでいます。これを行うためにMove
、カードの1つのスタックから別のスタックへの移動を表すクラスを作成することにしました。簡単に言えば、1回の移動に関係する2つのスタックへの参照を保持します。私のツリーの各ノードは、それが何を動かしているのかを知っています。
私が現在抱えている問題は、私の木が大きすぎることです-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
ているかにあるのではないかと疑っていますが、私は完全にここで立ち往生しています。誰かが私の疑いを確認したり、おそらく私にいくつかのガイダンスを与えることができますか?