射击时从列表中删除外星人 - 找出循环; '表达式:不能增加结束列表迭代器'

Posted

技术标签:

【中文标题】射击时从列表中删除外星人 - 找出循环; \'表达式:不能增加结束列表迭代器\'【英文标题】:Deleting Aliens from a List When Shot - figuring out loops; 'Expression : cannot increment end list iterator'射击时从列表中删除外星人 - 找出循环; '表达式:不能增加结束列表迭代器' 【发布时间】:2019-04-14 07:45:41 【问题描述】:

我问了一个关于这个项目的问题previously(这不是同一个问题),但我正在模仿 Space Invaders 来完成一项任务。我几乎一切正常,但我遇到了子弹外星人交互的问题。我是列表的新手,所以如果这是一个明显的问题,我深表歉意。 :)

我有一个功能可以让外星人在与子弹相交时消失,但是当子弹杀死其中两个时,或者如果子弹飞过他们并消失,程序就会陷入无限循环(外循环) .

这是涉及的功能:

(如果您需要查看其他课程的任何内容,我也可以添加)

void alienGroupMgr::disappear(shotMgr m)

    // shotMgr is just a class that manages the bullet data (vector of ptrs to bullets)  
    // getSprite returns data about individual sprites               

    for (list<alien*>::iterator iter = theGang.begin();iter != theGang.end();) // each alien
    
        alien* ptrShot = *iter;
        FloatRect alienBound = ptrShot->getSprite().getGlobalBounds();

        // theGang is a list of ptrs to aliens from the alien group mgr class
        // alien is a class for each alien

        for (int i = 0; i < m.getAmountFilled(); i++) // each bullet
           // getlist returns an index from the vector of bullet ptrs
            FloatRect bulletBound = m.getList(i)->getSprite().getGlobalBounds();

            if (alienBound.intersects(bulletBound))
            
                iter = theGang.erase(iter);
            
            else
            
                iter++;
            

        
    


我测试了一个版本的函数,我通过使用计数器将外循环限制为 9 次。它在一半的时间工作,另一半,它给出一个错误,说“表达式:不能增加结束列表迭代器”。

我真的很感激一些建议!谢谢。

【问题讨论】:

我认为您应该在第二个循环中测试结束,例如条件中的iter != theGang.end()iter 似乎超出了结尾,因为您没有在第二个循环中检查它。 【参考方案1】:

您在内部循环中有那条 iter++ 行似乎很奇怪。

例如,想想没有子弹与任何外星人相交的情况。然后我猜您希望代码遍历所有组合,但这不会发生,因为每次没有交集时都会发生 iter++ 行。

我建议不要在内部循环中从 theGang 中删除,而是在内部循环之前使用一个为 false 的 bool 变量,如果你发现与任何项目符号的交集,则将其设置为 true。然后,在内循环之后,检查 bool 变量,看看是否应该删除外星人。然后更容易看到代码在做什么:首先检查外星人是否被任何子弹击中,如果被击中则移除外星人。

【讨论】:

以上是关于射击时从列表中删除外星人 - 找出循环; '表达式:不能增加结束列表迭代器'的主要内容,如果未能解决你的问题,请参考以下文章

在运行时从列表中添加和删除

迭代时从Python列表中删除项目[重复]

练手项目:利用pygame库编写射击游戏

pygame应用---射击外星人游戏

Python:如何在迭代列表时从列表中删除元素而不跳过未来的迭代

Unity3D FPS射击游戏