2017-03-14 65 views
1

我在控制檯上做了一個簡單的殭屍島遊戲,我試圖讓殭屍在人類登陸時死亡。在C++中刪除類對象

要創建的殭屍,我用我的殭屍類是這樣的:

Zombies *zombie = new Zombies[4]; 

要檢查人類和殭屍都在同一個地方我用了一個簡單的for循環:

int zombieCount = 4; 
for (int i = 0; i < 4; i++) 
{ 
    if (player.getPosX() == zombie[i].getPosX() && player.getPosY() == zombie[i].getPosY()) 
    { 
     zombieCount--; 

    } 
} 

除了減少zombieCount之外,我擊中的殭屍應該從遊戲中消失。我怎麼做?

+10

如果使用標準容器,則此問題要容易得多。例如,你可以使用'std :: vector ',它可以讓你隨意移除殭屍,並避免使用指針和手動內存管理。 –

+0

我會去std :: vector

+0

難道你不能將殭屍我在網格外的位置設置爲空值,所以它不會再被選中? – FLab

回答

0

使用vector容器:

Zombies zombieModel; 

std::vector<Zombies> zombieVec(10, zombieModel); 

int zombieCount = zombieVec.size(); 
for (int i = 0; i < zombieVec.size(); i++) 
{ 
    if (player.getPosX() == zombieVec[i].getPosX() && player.getPosY() == zombieVec[i].getPosY()) 
    { 
     zombieCount--; 
     zombieVec.erase(zombieVec.begin()+i); 
     i--; 
    } 
} 
+2

不要使用zombieCount,請使用zombieVec.size() –

+1

或者使用帶'remove_if'和lambda的'erase'。 – NathanOliver

+1

你可以簡單地使用'std :: vector :: vector(size_t,Zombie);'來初始化。 –

2

在C++ 11,可以使用std::remove(first, last, value)以除去某些元件在陣列中。該函數返回新的數組結尾,例如使用方法:

auto end = std::remove(std::begin(zombie), std::end(zombie), zombie[i]); 

我建議使用std::vector哪個是哪個更適合您的需求動態數組。

參考文獻:std::removestd::vector

建議的std ::向量例如:

std::vector<Zombies> zombies; 
// init with zombies.push_back(someZombie); 

for (vector<Zombies>::iterator it = zombies.begin(); it != zombies.end(); /*no ++it*/) { 
    if (player.getPosX() == it->getPosX() && player.getPosY() == it->getPosY()) 
     it = zombies.erase(it); 
    else 
     ++it; 
} 

int zombieCount = zombies.size(); 
+2

'std :: remove'返回新的理論迭代器結束,你必須在向量上調用'erase'來完成它放棄了通過該迭代器的元素!因此,'zombie.erase(end,zombie.end());' – Benoit

+0

但它並不是一個矢量,它是新的殭屍[4],所以這與將殭屍換成最後一個並執行--zombieCount並無不同,並且最後缺少一個刪除[]殭屍仍然是一個問題。 –

+0

如果直接刪除循環中的所有元素,則會執行大量不必要的副本 - 如果殭屍應該保留,則優先選擇兩個迭代器並將第二個複製到第一個複製器。然後你可以只擦除矢量的末尾。其實,這就是你用'erase(std:.remove [_if](...),end()'得到的結果。 – Aconcagua

1

您可以使用std ::擦除的remove_if與lambda作爲在下面的一行:

zombies.erase(std::remove_if(zombies.begin(), zombies.end(), 
        [& player](const Zombie& z){return player.getPosX() == z.getPosX() && player.getPosY() == z.getPosY();}), 
       zombies.end()); 

假設你有一個vector<Zombie> zombieslist<Zombie>或另一個可以重新排序的容器。

0

NathanOliver在評論中推薦使用std::remove_if - 在我眼中最好的是迄今爲止提出的解決方案,不幸的是它只是一個評論,所以我在這裏說明它的樣子(通過比較X -coordinate ...):

Person p; 
std::vector<Zombie> zombies(4); 
auto end = std::remove_if 
    (
     zombies.begin(), zombies.end(), 
     [&p](Zombie const& zombie) { return (zombie.getPosX() == p.getPosX()) && (zombie.getPosY() == p.getPosY()); } 
    ); 
zombies.erase(end, zombies.end());