我正在控制台做一个简单的僵尸岛游戏,我试图让僵尸在人类登陆时死亡。
为了创建僵尸,我使用了我的Zombie类:
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之外,我击中的僵尸应该从游戏中消失。我该怎么做?
答案 0 :(得分:2)
在C ++ 11中,您可以使用std::remove(first, last, value)
删除数组中的某些元素。该函数返回新的数组结尾,例如使用方法:
auto end = std::remove(std::begin(zombie), std::end(zombie), zombie[i]);
我建议使用std::vector
这是一个适合您需求的动态数组。
参考文献:std::remove和std::vector。
建议的std :: vector示例:
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();
答案 1 :(得分:1)
您可以将std :: erase-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> zombies
或list<Zombie>
或其他可以重新排序的容器。
答案 2 :(得分: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--;
}
}
答案 3 :(得分:0)
NathanOliver在评论中建议使用NaN
- 在我眼中最好的是迄今为止提出的解决方案,不幸的是它只是一个评论,所以我在这里说明它是什么样的(稍微缩短一下,比较X-坐标...):
std::remove_if