gpt4 book ai didi

c++ - 如何在接触时从两个列表中删除元素?

转载 作者:太空宇宙 更新时间:2023-11-04 13:02:49 24 4
gpt4 key购买 nike

我在为一个类(class)编写 Space Invaders 时遇到了非常困难的时间。我应该使用一个列表来存储我的“导弹”和一个列表来存储我的“外星人”。我按空格键加载一个新的外星人,当两者接触时,我试图删除它们,我什至无法删除“外星人”。当发射不止一枚导弹时,我会遇到各种错误,如果注释掉此功能,导弹将正常工作。我被迫将导弹列表传递给另一个已经包含外星人列表的类,然后将两者都删除。

这是有问题的代码:

bool AlienMgr::checkHit(PlayerMgr& playerMgr)
{

bool hit = false; // If the player hits an alien, switches to true and is returned.
list<Missile*>::iterator missileIter;
list<Missile*> missileList = playerMgr.getMissiles();
int missileCount;

FloatRect missileBounds;
FloatRect alienBounds;

iter = myAliens.begin();

while (!myAliens.empty() && iter != myAliens.end())
{
alienBounds = (*iter)->getGlobalBounds();

if (!missileList.empty() && !hit)
{

for (missileIter = missileList.begin(); missileIter != missileList.end() && !hit; missileIter++)
{
missileBounds = (*missileIter)->getMissileBounds();

if (alienBounds.intersects(missileBounds))
{
delete (*iter);
iter = myAliens.erase(iter);
cout << "HIT" << endl;

}
else
{
iter++;
}
}
}
else
{
iter++;
}
}
return hit;
}

最佳答案

您的代码中有几个问题。我试图清理它们。另外,我希望你能使用 c++ 11。

bool AlienMgr::checkHit(PlayerMgr& playerMgr)
{

bool hit = false; // If the player hits an alien, switches to true and is returned.
list<Missile*> missileList = playerMgr.getMissiles();
int missileCount;

FloatRect missileBounds;
FloatRect alienBounds;

// iter == myAliens.end() if it's empty
for (auto iter = myAliens.begin(); iter != myAliens.end();)
{
bool hitDetected = false;
alienBounds = (*iter)->getGlobalBounds();

// remove all missiles intersecting current alien and set flag
missileList.remove_if([&](Missile* missile)
{
if (!alienBounds.intersects(missile->getMissileBounds()))
return false;

hitDetected = true;
delete missile;

return true;
});

if (hitDetected)
{
hit = true;

delete (*iter);
iter = myAliens.erase(iter);
cout << "HIT" << endl;
else
{
iter++;
}
}
return hit;
}

然而,还有更严重的问题。你的代码太 c++98'ish 了。我会建议几项改进:

  • 使用 std::vector 而不是 std::list(真的很难找到 list 更快的情况)<
  • 使用智能指针而不是手动内存管理(代码会简单得多,也更容易理解)

关于c++ - 如何在接触时从两个列表中删除元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43512951/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com