gpt4 book ai didi

java - 防止多次添加 HashMap 键条目?

转载 作者:行者123 更新时间:2023-12-01 12:26:01 26 4
gpt4 key购买 nike

我正在使用 Bukkit 为 Minecraft 创建迷你游戏引擎,但在游戏中添加玩家似乎存在问题。玩家添加成功后,可以再次加入,从而参与多次。

这确实很奇怪,因为在我的 if 语句中,我确实检查了参与者的 HashMap 是否包含玩家 key 。如果是的话,就不应该允许他再次加入游戏。

这是我的方法。

public void addPlayer(Client client) {

// Checks if the game is waiting, and the slots are sufficient.

if (game.isWaiting() && !game.isFull() && !game.getClients().containsKey(client)) {

Random random = new Random();

int teamChance = random.nextInt(game.getTeams().size());

// Adding the player to the match and assigning the default kit.

game.getClients().put(client, game.getDefaultKit());

// Adding the player to a team.

game.getTeams().get(teamChance).add(client);

// Checking if the slots are now maximum, prepare the game.

if (game.isFull()) {
prepareGame();
}

// If the player was added.

if (game.getClients().containsKey(client))
{
Main.log("Added " + client.getName() + " (" + game.getCurrentSlots() + "/" + game.getSlots() + ")" + " to " + game.getType().getName() + " (" + game.getWorld().getName() + ").", Level.INFO);

game.broadcast("Join", client.getName() + " (" + game.getCurrentSlots() + "/" + game.getSlots() + ")");

client.getPlayer().teleport(game.getWorld().getSpawnLocation());

client.reset();

// Adding lobby items to the player's inventory.

new LobbyManager(game);
}
}

来自 Game 类。

private HashMap<Client, Kit> clients;

// ...

public HashMap<Client, Kit> getClients() {
return this.clients;
}

如何修改此方法以防止玩家被多次添加到游戏中?

非常感谢您的帮助。

<小时/>

客户:http://pastebin.com/Fmgc0T3C

最佳答案

如果两个线程可能添加同一个客户端,则应该 lock将它们添加到游戏中的操作!当每次玩家想要加入时创建一个新的客户端对象时,您必须覆盖 equals() and hashCode() ,因为当您在不同客户端对象中比较同一客户端时,conainsKey 将返回 false。

关于java - 防止多次添加 HashMap 键条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26325544/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com