在删除和插入的同时通过for循环

Syc*_*ren -1 algorithm simulation logic

我正在写一个捕食者/猎物模拟,其中物体可以出生或被杀死.当被杀死时,它们会从arraylist中删除,当它们出生时会被添加.列表中的每个对象都可以杀死另一个对象或复制.我浏览列表模拟每个对象的移动和与周围环境的交互,包括决定复制或杀死另一个对象(如果它关闭).

正常的循环中断就好像删除或出生时,它当前所在的索引是倾斜的.什么是更好的解决方案?虽然有一个计数器和条件,大小> 0或其他一些方式?

Kev*_*vin 5

您可以等到迭代完成后添加/删除项目:

entities_to_add = new Array;
entities_to_remove = new Array;

function tick():
    for each entity in world:
        //general entity behavior goes here
        if entity.wants_to_reproduce:
            entities_to_add.append(entity.make_baby())
        if entity.wants_to_die:
            entities_to_remove.append(entity)

function cleanup():
    for each entity in entities_to_remove:
        world.remove(entity)
    for each entity in entities_to_add:
        world.add(entity)
    entities_to_remove.clear()
    entities_to_add.clear()

function main():
    while(True):
        tick()
        cleanup()
Run Code Online (Sandbox Code Playgroud)

这样做的缺点是,一个死亡的实体看起来会一直存在,直到滴答结束.这可能是坏的,例如,如果捕食者杀死猎物,并且第二捕食者也在相同的滴答声中杀死该猎物.如果这不合适,你可以让掠夺者在攻击之前检查entities_to_remove数组,以确保它们的猎物仍然存活.