C++ 从矢量阵列中删除敌人

C++ 从矢量阵列中删除敌人,c++,arrays,vector,erase,C++,Arrays,Vector,Erase,这是我在这个网站上的第一个问题。我学了一年编程,我总是能在项目中找到问题的答案。我知道这是一个非常简单的问题,下面是一个代码: #include "stdafx.h" #include "Wave.h" Wave::~Wave() { } void Wave::setEnemyCount(int count) { nemyCount = count; } bool Wave::createWave() { for (int i = 0; i < enemyCount;

这是我在这个网站上的第一个问题。我学了一年编程,我总是能在项目中找到问题的答案。我知道这是一个非常简单的问题,下面是一个代码:

#include "stdafx.h"
#include "Wave.h"

Wave::~Wave()
{
}

void Wave::setEnemyCount(int count) {
    nemyCount = count;
}

bool Wave::createWave() {
    for (int i = 0; i < enemyCount; i++) {
        enemyArray.push_back(Enemy());
    }

    for (int i = 0; i < enemyArray.size(); i++) {
        int randomPositionX = rand() % 150 + 10;
        int randomPositionY = rand() % 50 + 10;

        if (!enemyArray.at(i).init(randomPositionX, randomPositionY)) {
            std::cout << "Create wave(init enemies) - failed\n";
            return false;
        }
    }

    return true;
}

void Wave::drawWave(Window* window) {
    window->setCursor({ 0, 2 });
    window->setColor(Window::Color::RED);
    std::cout << "Enemies: " << enemyArray.size();
    window->setColor(Window::Color::WHITE);

    for (int i = 0; i < enemyArray.size(); i++) {
        enemyArray.at(i).draw(window);
        //std::cout << i;
    }
}

void Wave::update(Bullet* bullet, Player* player) {

    for (int i = 0; i < enemyArray.size(); i++) {
        if (player->checkShoot()) {
            if ((bullet->getPositionX() >= enemyArray.at(i).getPositionX() && bullet->getPositionX() <= enemyArray.at(i).getPositionX() + 5)) {
                if ((bullet->getPositionY() >= enemyArray.at(i).getPositionY() && bullet->getPositionY() <= enemyArray.at(i).getPositionY() + 5)) {
                    player->addScore(10);
                    enemyArray.erase(enemyArray.begin() + i);
                }
            }
        }
    }

    if (enemyArray.size() <= 0) {
        std::cout << "WAVE COMPLETE";
        Sleep(2000);
        enemyCount += 5;
        createWave();
    }
}

int Wave::getEnemyCount() const {
    return enemyCount;
}
#包括“stdafx.h”
#包括“Wave.h”
波浪::~Wave()
{
}
void Wave::setEnemyCount(int计数){
nemyCount=计数;
}
bool Wave::createWave(){
for(int i=0;i设置颜色(窗口::颜色::红色);
std::cout getPositionX()>=enemyArray.at(i).getPositionX()&&bullet->getPositionX()getPositionY()>=enemyArray.at(i).getPositionY()&&bullet->getPositionY()addScore(10);
erase(enemyArray.begin()+i);
}
}
}
}

如果执行
enemyArray.erase(…)
操作时(enemyArray.size()),则不应增加
i
,因为您将跳过一个元素

因此,您应该像这样重写循环:

for (int i = 0; i < enemyArray.size();) {
    if (player->checkShoot()) {
        if ((bullet->getPositionX() >= enemyArray.at(i).getPositionX() && bullet->getPositionX() <= enemyArray.at(i).getPositionX() + 5)) {
            if ((bullet->getPositionY() >= enemyArray.at(i).getPositionY() && bullet->getPositionY() <= enemyArray.at(i).getPositionY() + 5)) {
                player->addScore(10);
                enemyArray.erase(enemyArray.begin() + i);
                continue;
            }
        }
    }
    ++i;
}
for(int i=0;i检查射击()){
如果((bullet->getPositionX()>=enemyArray.at(i).getPositionX()&&bullet->getPositionX()getPositionY()>=enemyArray.at(i).getPositionY()&&bullet->getPositionY()添加分数(10);
erase(enemyArray.begin()+i);
继续;
}
}
}
++一,;
}
或者,用更地道的风格:

for (auto it = enemyArray.begin(), end = enemyArray.end();it!=end;) {
    if (player->checkShoot()) {
        if ((bullet->getPositionX() >= it->getPositionX() && bullet->getPositionX() <= it->getPositionX() + 5)) {
            if ((bullet->getPositionY() >= it->.getPositionY() && bullet->getPositionY() <= it->getPositionY() + 5)) {
                player->addScore(10);
                enemyArray.erase(it);
                continue;
            }
        }
    }
    ++it;
}
for(auto-it=enemyArray.begin(),end=enemyArray.end();it!=end;){
如果(玩家->检查射击()){
如果((bullet->getPositionX()>=it->getPositionX()&&bullet->getPositionX()getPositionX()+5)){
如果((bullet->getPositionY()>=it->.getPositionY()&&bullet->getPositionY()getPositionY()+5)){
玩家->添加分数(10);
enemyArray.擦除(它);
继续;
}
}
}
++它;
}
当然,如果你想一次清除一个敌人,在清除元素后,你应该在循环中
中断
,而不是
继续


为了完整性,你也可以使用
std::remove\u如果你想清除所有被子弹击中的敌人,它比上面的两个循环更为优化,因为当多个元素被移除时,它不会移动元素。

向量的大小不能小于零。事实上,
size
返回的大小是无符号的,so它不能小于零。因此,使用小于进行比较是错误的。只要子弹不碰到具有连续索引的两个敌人,代码看起来就正确。请显示a,包括示例输入/输出。至于您的问题,请在删除元素时考虑向量索引。ve中下一个元素的新索引是什么ctor?删除后的元素?尝试在一张正方形纸上画出向量,其中每个正方形都是单个元素。然后“擦除”创建一个元素,并将其余元素向下移动以填充已擦除元素的洞。我知道,但现在这并不重要。我在循环中遇到了一个问题。这是所有方法,我认为更好的方法是粘贴所有代码:)。请。所有代码都不是最小值。我尝试过使用此代码,当子弹碰到一个敌人时,程序会同时删除几个敌人。不,它不起作用。我无法在编辑器中粘贴所有代码:(,他不知道什么是代码,什么是文本:D.@KewinWoźny我只能鼓励你调试你的游戏,例如打印变量的状态,看看发生了什么,问题在哪里。