0

我想实现一个像这样工作的方法攻击:我部队中的每个战士都攻击从另一个部队中随机选择的战士。如果被攻击的战士死亡,则必须将其从部队中移除。使用我尝试的方法,我得到了随机数的错误:

 java.lang.IllegalArgumentException: n must be positive

部队是List<Creature>战士;我认为我没有正确地进行删除,否则我不应该有那个错误。

public void atac(Troop opponentTroop){
        for(Creature f : warriors){
            Creature c = getOpponent(opponentTroop);
            f.atac(c);
            ListIterator<Creature> iterator = opponentTroop.warriors.listIterator();
            while(iterator.hasNext()){
                c = iterator.next();
                if(c.isDead()){
                    iterator.remove();                  
                }
            }   

        }       
    }


private Creature getOpponent(Troop opponent){
        int x = rand.getRandomArrayIndex(opponent.warriors.size());
        return opponent.warriors.get(x);
}
4

1 回答 1

0

删除条目会使迭代器无效。你需要保存它,你可以这样做:

while(iterator.hasNext()) {
    c = iterator.next();
    if(c.isDead()) {
        // Make a temporary iterator
        ListIterator<Creature> toDelete= c;
        // Step the regular one
        c = iterator.next();
        // Remove
        toDelete.remove();                  
    }
}   

此外,请确保int x = rand.getRandomArrayIndex(opponent.warriors.size());永远不会超出最后一个索引(即条目数减去 1 .

于 2013-04-25T11:33:33.603 回答