2

私は、ゴルフソリティアのゲームの状態ツリーを生成する必要がある宿題プロジェクトに取り組んでいます。これを行うために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ているかにあるのではないかと疑っていますが、私は完全にここで立ち往生しています。誰かが私の疑いを確認したり、おそらく私にいくつかのガイダンスを与えることができますか?

4

1 に答える 1

1

好奇心旺盛な人にとって、私の問題は課題を正しく読んでいないことでした。具体的には、私のfindAllMoves方法が問題でした。ノードには、ドローパイルからの移動またはプレイパイルからのすべての可能な移動のいずれかが必要ですが、両方は必要ありません。上記の私のコードでは、同じ深さであっても、各子Moveがドローパイルからを作成してパイルを破棄することができます。その結果、大量の重複ノードが発生します。

また、ゲーム終了時の状態をチェックすることもありません。その結果、各リーフノードは負けスコアまたは0のいずれかになりました(プレーヤーがすでに勝っていたとしても、ドローパイルが空になるまでメソッドは繰り返されます)。

于 2012-04-08T15:45:35.123 に答える