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我只能鼓励你调试你的游戏,例如打印变量的状态,看看发生了什么,问题在哪里。