1

私はJavaでゲームを構築しています.Playerオブジェクトの「マップ」があります。プレイヤーがターンを終了したいときに呼び出される endOfTurn というメソッドがあります。これは、「currentPlayerTurn」フィールドをマップ内の次のプレイヤーに設定します。ただし、マップの最後に到達したら、マップ内の最初のプレイヤーに戻って、何度も何度も移動したいと考えています。これを行う方法はありますか?また、プレイヤーのデータ構造はマップである必要があります!

public class Game {

private Map<String,Player> players;
private Player currentPlayerTurn;

public boolean EndOfTurn(Player currentPlayerTurn) {
    //need to set this.currentPlayerTurn to the next player in the Map

}

イテレータの使用を検討しましたが、これにはリセット機能や「ループアラウンド」モードがないようです。何か案は?

4

4 に答える 4

2

通常、このメソッドを呼び出すプレーヤーを反復する外側のループがあります。

while(playingGame) {
   for(Player player: players.values()) {
      player.takeTurn();
      endOfTurn(player);
   }
}
于 2012-11-06T11:32:06.387 に答える
1

最も簡単なオプションは次のとおりだと思います。

while (!done) {
   // iterate once around your list
}

プレーヤーを収容する必要がある場合、Map新しい構造を導入して問題を複雑にすることはありません。

考慮したいのは、プレイヤーが別のターンを取得した場合に何が起こるかです (これは起こりますか? )。TurnManagerもしそうなら、イテレータは自然に適合するものではなく、おそらく次のプレイヤーを選択する何らかのオブジェクトが必要になるでしょう。ゲームの動作をプレイヤーを保持するデータ構造に結びつけるのではなく、これを処理する方法を明示的に知っているコンポーネントに抽象化します。

于 2012-11-06T11:31:45.990 に答える
0

リンク リスト ノードに似た構造を作成できます。endOfTurn() は、ラウンドが終了した場合に true を返し、それ以外の場合は false を返します。

   Player {
    String name;
    boolean dealer;
    Payer nextPlayer;

    // constructor, getters and setters for fields

    }

    public class Game {

    private Map<String,Player> players;
    private Player currentPlayerTurn;

    public boolean endOfTurn(Player currentPlayerTurn) {
       currentPlayerTurn = currentPlayerTurn.getNextPlayer();

       if(currentPlayerTurn.isDealer())
          return true;
        else
          return false;
    }
于 2012-11-06T11:46:26.510 に答える
0

Map からいつでも新しい Iterator を作成できます。つまり、イテレーターを「リセット」する方法は、新しいイテレーターを作成することです。

Iterator<Map.Entry<String,Player>> it = players.entrySet().iterator();

//...

if(!it.hasNext())
    it=players.entrySet().iterator()

私が試してみましょう...

public class Game {

    private Map<String,Player> players;
    private Player currentPlayerTurn;
    private Iterator<Map.Entry<String,Player>> itPlayers;

    public boolean EndOfTurn(Player currentPlayerTurn) {
         if(itPlayers == null || !itPlayers.hasNext()){
           itPlayers=players.entrySet().iterator();   
         }
         currentPlayerTurn=itPlayers.next().getValue();
    }

}
于 2012-11-06T11:35:08.550 に答える