我正在学习Java的小游戏。 现在我想计算玩家的数量,我有代码:
Player player1;
player1 = new Player();
player1.name = "Name1";
player1.score = 0;
player1.lives = 100.0;
Player player2;
player2 = new Player();
player2.name = "Name2";
player2.score = 0;
player2.lives = 50.0;
答案 0 :(得分:1)
在玩家中使用static variable计数,该计数在玩家构造函数中递增。
private static int playerCount = 0;
//constructor
Player(){
playerCount++;
}
答案 1 :(得分:0)
将所有玩家列入名单:
List<Player> allPlayers = new ArrayList<Player>();
Player player;
player = new Player();
player.name = "Name1";
player.score = 0;
player.lives = 100.0;
allPlayers.add(player);
player = new Player();
player.name = "Name2";
player.score = 0;
player.lives = 50.0;
allPlayers.add(player);
allPlayers.size(); //Number of players
player = allPlayers.get(0); //Player 1
player = allPlayers.get(1); //Player 2
答案 2 :(得分:0)
最好的方法是使用容器类,这是java.util.Collections
的后代。
添加播放器后,他会被添加到该集合中。当玩家退出游戏时,他将从集合中删除。因此,要确定任何时刻的玩家数量,只需要计算集合的成员(如果使用java.util预先实现的集合,则已经实现了该成员)。
即使这样,也有两种技术。其中一个是有缺陷的,我将首先展示有缺陷的技术(这并不比其他人提供的静态计数器示例好得多)。
private static HashSet<Player> players = new HashSet<Player>();
public Player() {
players.add(this);
}
public static int getPlayerCount() {
return players.size();
}
这导致了一个有趣的问题。播放器计数永远不会下降,因为即使Player
类被取消引用,计数集合也会保存一个防止垃圾收集的引用。这导致java版本的“垃圾泄漏”,但不要将它与C / C ++“垃圾泄漏”混淆,后者更加邪恶。
第二种技术源于解决第一种问题。基本上,它不依赖于建筑登记,因为破坏是一种不安全的取消登记手段。在一段代码中你会有
HashSet<Player> players = new HashSet<Player>();
Player player = new Player("bob");
players.add(player);
... later on ...
players.remove(player);
或类似的东西。基本上,主要想法是让您当前的玩家列表与玩家创建的级别相同。有一百万种变种,取决于始发呼叫的来源;但是,主要思想是相同的:明确取消注册玩家,而不是直接与对象生命周期联系起来。