我正在使用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
}
我已经研究过使用迭代器,但这似乎没有重置函数或'循环'模式。有什么想法吗?
答案 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;
}