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<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 回答