需要一种围绕Map连续循环/迭代的方法

时间:2012-11-06 11:29:07

标签: java loops continuous

我正在使用java构建游戏,并且我有一个Player对象的“Map”。我有一个名为endOfTurn的方法,当玩家想完成他们的回合时调用它,它将'currentPlayerTurn'字段设置为Map中的下一个玩家。然而,一旦我到达我的地图的末尾,我希望它回到地图中的第一个玩家并一次又一次地回合。有办法做到这一点吗?同样是,玩家数据结构确实需要是地图!

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 个答案:

答案 0 :(得分:2)

通常情况下,你会有一个外部循环遍历调用此方法的玩家。

while(playingGame) {
   for(Player player: players.values()) {
      player.takeTurn();
      endOfTurn(player);
   }
}

答案 1 :(得分:1)

我认为你最简单的选择是:

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

如果您的球员需要被关注Map,那么我不会通过引入新结构来使问题复杂化。

你可能想要考虑的是如果玩家再次转弯会发生什么(会发生这种情况吗?)。如果是这样,迭代器不会自然适合,也许你想要某种TurnManager对象来选择下一个玩家。我不会试图将游戏的行为与持有玩家的数据结构联系起来,而是将其抽象为一个明确知道如何处理它的组件。

答案 2 :(得分:0)

您始终可以从地图创建新的迭代器。我的意思是,“重置”迭代器的方法是创建一个新的。

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();
    }

}

答案 3 :(得分: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;
    }