Удаление иностранцев из списка при выстреле - выяснение петель; «Выражение: не может увеличить итератор конечного списка» - PullRequest
0 голосов
/ 14 апреля 2019

Я задал вопрос об этом проекте ранее (это не та же проблема), но я работаю над имитацией Space Invaders для задания.У меня почти все работает, но у меня проблемы с пулей-инопланетным взаимодействием.Я новичок в списках, поэтому я прошу прощения, если это очевидная проблема.:)

У меня есть функция, заставляющая инопланетян исчезать, когда они пересекаются с пулями, но когда пуля убивает двух из них, или если пуля пролетает мимо них и исчезает, программа застревает в бесконечностиloop (внешний цикл).

Эта функция задействована:

(если вам нужно что-то увидеть в других классах, я тоже могу добавить их)

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 раз, используя счетчик.Он работает половину времени, а другую половину - ошибку «Выражение: невозможно увеличить итератор конечного списка».

Буду очень признателен за совет!Спасибо.

1 Ответ

0 голосов
/ 14 апреля 2019

Кажется странным, что у вас есть строка iter ++ во внутреннем цикле.

Например, подумайте о случае, когда ни одна пуля не пересекается с каким-либо инопланетянином. Тогда, я думаю, вы хотите, чтобы код прошел все комбинации, но этого не произойдет, потому что у вас есть строка iter ++, возникающая каждый раз, когда пересечения не было.

Я бы посоветовал вместо удаления из theGang во внутреннем цикле использовать переменную bool, которая имеет значение false перед внутренним циклом и для которой вы установите значение true, если вы обнаружите пересечение с любым маркером. Затем, после внутреннего цикла, вы проверяете переменную bool, чтобы увидеть, следует ли удалять инопланетянина. Тогда становится легче увидеть, что делает код: сначала проверьте, не поражен ли инопланетянин какой-либо пулей, а затем удалите инопланетянина, если он был поражен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...