所以我正在制作一个僵尸模拟游戏。我所拥有的是一群随机出现的玩家和僵尸。当幸存者与僵尸相撞时,我希望它删除幸存者,然后用僵尸代替,将他变成僵尸。

碰撞检测效果很好(我只是将awt矩形与intersect方法一起使用)。但是我有一个僵尸数组列表和一个幸存者数组列表。发生碰撞时,我会将僵尸添加到僵尸列表中。然后,我从该列表中删除幸存者。它可以工作几次,然后随机将索引抛出异常。

java.lang.IndexOutOfBoundsException: Index: 13, Size: 13
    at java.util.ArrayList.rangeCheck(Unknown Source)
    at java.util.ArrayList.remove(Unknown Source)
    at com.caveragestudios.zombiesim.World.update(World.java:53)
    at com.caveragestudios.zombiesim.Main.update(Main.java:93)
    at com.caveragestudios.zombiesim.Main.run(Main.java:69)
    at java.lang.Thread.run(Unknown Source)


我尝试过使用高级的for循环,常规的for循环和带有while循环的迭代器。似乎没有任何作用。这是我目前的代码。

    for (int i = 0; i < survivors.size(); i++) {
        Survivor s = survivors.get(i);
        for (int ii = 0; ii < zombies.size(); ii++) {
            Zombie z = zombies.get(ii);
            if (z.bounds.intersects(s.bounds)) {
                zombies.add(new Zombie(s.position, this));
                survivors.remove(i);
            }
        }
    }


其他所有内容似乎都正常运行,只是当我尝试修改列表时,它有点混乱,并抛出索引超出范围的异常。有任何想法吗?

最佳答案

您已使用外部列表survivors索引i到内部列表zombies。您的索引变量在zombies.get(i)处错误。

  for (int i = 0; i < survivors.size(); i++) {
    Survivor s = survivors.get(i);
    for (int ii = 0; ii < zombies.size(); ii++) {
        Zombie z = zombies.get(ii);// Here use ii instead of i
      //..............
  }
 }




要从集合中删除元素,请使用Iterator.remove。如下更改代码,以安全地从集合中删除。

 Iterator<Survivor > survIt=survivors.iterator();
 Iterator<Zombie> zombIt=zombies.iterator();
 while(survIt.hasNext()){
       Survivor s=survIt.next();

         while(zombIt.hasNext()){
           Zombie  z=zombIt.next();

            if (z.bounds.intersects(s.bounds)) {
            zombies.add(new Zombie(s.position, this));

            survIt.remove(); //Use Iterator.remove.

            }
        }
  }

07-28 01:19
查看更多