0

大家好,我正在为 Bukkit 创建一个游戏模式,并且遇到了一个目前似乎让我感到困惑的问题。也许我只是在看一些东西,所以如果我能用另一双眼睛看这段代码,我将非常感激。这是我的情况,我有一个创建游戏的命令。这是一个类类型。每次使用 /newgame 命令时,都会将其添加到 ArrayList。现在它应该检查是否已经存在同名的游戏。它仅适用于第一个游戏名称。因此,如果我制作了一个名为“game1”的游戏,然后尝试再次制作“game1”,它会返回“无法创建名称为 game1 的游戏”,但是当我制作另一个游戏时,例如,如果我添加游戏“game2”然后我再次制作“game2”,它允许创建它。它似乎只适用于制作的第一款游戏。如果有人可以提供帮助,那将有很大帮助,因此在此先感谢。

注意: Main.games.size() 总是上升,所以游戏正在被创建,但只有第一个游戏不能被创建超过一次,之后的任何游戏都可以有相同的名称,出于某种原因。

这是我的 CommandExecuter 中的代码片段

if (cmd.equalsIgnoreCase("newgame")){
        Player player = sender.getServer().getPlayer(sender.getName());
            if (Main.games.size() == 0){
                Main.games.add(new Game(args[0]));
                player.sendMessage(ChatColor.GREEN + "Game Created. To join Type " + ChatColor.ITALIC + "/join " + args[0]);
                return true;
            }else{
                //Loop and Check
                Game game;
                for (int i = 0; i < Main.games.size(); i++){
                    game = Main.games.get(i);
                    if (game.getName().equalsIgnoreCase(args[0]) == false){
                        Main.games.add(new Game(args[0]));
                        player.sendMessage(ChatColor.GREEN + "Game Created. To join Type " + ChatColor.ITALIC + "/join " + args[0]);
                        //debug
                        player.sendMessage(Main.games.size() + ""); // + "" id
                        return true;
                    }else{
                        //Tells that a game already exists with that name.
                        player.sendMessage(ChatColor.RED + "Can not create game with the name of " + args[0]);
                        return true;
                    }
                }   
            }
4

2 回答 2

0

您的代码仅检查列表中第一个游戏的名称。如果第一个游戏匹配,则返回的代码是正确的,因为它已经知道名称是重复的。但是,如果第一个游戏的名称不匹配,则代码不应返回。我们只知道新游戏不是第一款游戏的复制品,但我们不知道它是否是列表中其他游戏的复制品。代码应该继续检查列表中的其余游戏。只有在所有游戏名称都不匹配后,此代码才会返回。

将您的 else 子句更改为以下内容。

Game game;
for (int i = 0; i < Main.games.size(); i++){
    game = Main.games.get(i);
    if (game.getName().equalsIgnoreCase(args[0]) == false){
        // Do not return here. Instead, continue to check the rest of the list
        continue;
    }else{
        //Tells that a game already exists with that name.
        player.sendMessage(ChatColor.RED + "Can not create game with the name of " + args[0]);
        return true;
    }
}
// We have reached the end of the loop so we now know that none of the 
// games in the list match. Now we can return.
Main.games.add(new Game(args[0]));
player.sendMessage(ChatColor.GREEN + "Game Created. To join Type " + ChatColor.ITALIC + "/join " + args[0]);
//debug
player.sendMessage(Main.games.size() + "");
return true;
于 2013-08-21T04:52:41.010 回答
0

好像你还在学Java,所以我不想给你完整的代码解决方案,只是一个解释。

遍历循环以查看数组中是否有某些内容时,在检查所有项目之前不能返回错误结果。

您在这里出错 - 您将新名称与第一项进行比较。如果它不是同名 - 你创建一个新游戏。

你应该做什么 - 你应该添加一个布尔变量 isFound 并将其设置为 false。遍历所有游戏并检查名称是否存在。如果是这样 - 将 isFound 更改为 true 并打破循环。循环结束后,您应该检查 isFound 状态。

于 2013-08-21T04:53:05.690 回答