这就是我遇到问题的地方。一旦生物死亡,我需要从数组中删除一个对象。
for each(BaseObject monster in MonsterList)
{
if(MonsterSelect == monster.GetName())
{
Damage = Player.GetATK() - monster.GetDEF();
monster.SetHP(monster.GetHP() - Damage);
cout << monster.GetName() << " has taken " << Damage << "." << endl;
if(monster.GetAliveFlag() == false)
{
cout << monster.GetName() << " has died." << endl;
MonsterList.remove(monster);//This is where the object needs to be removed.
int sdf = 234;
}
}
}
答案 0 :(得分:0)
您应该使用带迭代器的普通for循环并对列表应用方法擦除。
像这样的东西
for ( auto it = MonsterList.begin(); it != MonsterList.end(); )
{
//...
if( MonsterSelect == it->GetName())
{
//,,,
if( it->GetAliveFlag() == false)
{
it = MonsterList.erase( it );
//...
}
else
{
++it;
}
}
else
{
++it;
}
}
您可以重新格式化循环,使其更具可读性。
我想每当当前怪物满足某些条件时,你必须只删除列表中的这一个怪物。
对于方法删除,它会删除列表中与给定怪物相等的所有元素。
答案 1 :(得分:0)
我将把它解释为询问你如何用体面的C ++完成这个基本任务。
首先,我要摆脱for
循环。其次,我将大部分逻辑移到一个类或另一个类中。现在,这些对我来说看起来像是准类 - 也就是说,所有真正的逻辑都是在一些基本上是愚蠢的数据对象的单独代码中运行,通过使用访问器来获取原始数据伪装成类。
所以,如果你在实际的C ++中这样做,你最终可能会得到一个地图(或多图)来让你按名字找到怪物。所以,你会有这样的事情:
auto monster = monsters.find(monsterSelect);
if (monster == monsters.end())
// Not found
if (monster.kill(player.attack())) {
cout << monsterSelect << " has died.\n";
monsters.erase(monster);
}
目前,我假设任何一个名字中只有一个怪物。如果这可能真的是对多个怪物的攻击,你有几个选择。
首选(至少是IMO)是将“与怪物战斗”部分与“从列表中移除死亡怪物”部分分离。我可能会使用Boost filter-iterator来迭代所有怪物的给定名称,然后使用remove / erase习惯用法从列表中删除所有死怪物。 (但请注意,删除/擦除习惯用法特定于顺序集合,不适用于关联容器)。