如何返回for循环中的布尔值
问题描述:
第一个函数调用将返回两个对象发生碰撞时的字符串冲突,因此我知道我的逻辑是真实的。然而,布尔检查没有返回,所以我很难过。如何返回for循环中的布尔值
template <typename T, typename U>
void checkCollision(std::vector<T> &vTower, std::vector<U> &vMonster)
{
for (int i = 0; i < vMonster.size(); i++)
{
for (int k = 0; k < vTower.size(); k++)
{
if (vMonster[i].getPositionX() + vMonster[i].getRadius() +
vTower[k].getRadius() > vTower[k].getTowerRangePositionX()
&& vMonster[i].getPositionX() < vTower[k].getTowerRangePositionX() + vMonster[i].getRadius() + vTower[k].getRadius()
&& vMonster[i].getPositionY() + vMonster[i].getRadius() + vTower[k].getRadius() > vTower[k].getTowerRangePositionY()
&& vMonster[i].getPositionY() < vTower[k].getTowerRangePositionY() + vMonster[i].getRadius() + vTower[k].getRadius())
{
std::cout << "Collided"
}
}
}
};
这从主
bool checkCollision(std::vector<T> &vTower, std::vector<U> &vMonster)
{
for (int i = 0; i < vMonster.size(); i++)
{
for (int k = 0; k < vTower.size(); k++)
{
if (vMonster[i].getPositionX() + vMonster[i].getRadius() + vTower[k].getRadius() > vTower[k].getTowerRangePositionX()
&& vMonster[i].getPositionX() < vTower[k].getTowerRangePositionX() + vMonster[i].getRadius() + vTower[k].getRadius()
&& vMonster[i].getPositionY() + vMonster[i].getRadius() + vTower[k].getRadius() > vTower[k].getTowerRangePositionY()
&& vMonster[i].getPositionY() < vTower[k].getTowerRangePositionY() + vMonster[i].getRadius() + vTower[k].getRadius())
{
return true;
}
else
return false;
}
}
}
这是一个无休止的循环窗口调用时没有返回。
if(function.checkCollision(myicetower, mymonsters))
std::cout << "TESTTESTTEST" << std::endl;
答
只要您找到一个不匹配的对象,就会发生您的return false
。它需要waaayyyyy的功能 - 底部。一旦你检查了一切,没有匹配,那么你可以说没有任何匹配。
+0
我在想什么,甚至不能做一个简单的布尔值我应该知道更好。我接受你的修理者 –
答
正如John指出的那样,将return语句移到末尾就足够了。但是你也可以考虑看看标准算法。
使用std::any_of
,你的函数可以被改写为
bool checkCollision(std::vector<T> const& towers, std::vector<U> const& monsters) {
auto const has_collision = [](T const& tower, U const& monster) {
return monster.getPositionX() + monster.getRadius() + tower.getRadius() > tower.getTowerRangePositionX()
&& monster.getPositionX() < tower.getTowerRangePositionX() + monster.getRadius() + tower.getRadius()
&& monster.getPositionY() + monster.getRadius() + tower.getRadius() > tower.getTowerRangePositionY()
&& monster.getPositionY() < tower.getTowerRangePositionY() + monster.getRadius() + tower.getRadius();
};
return std::any_of(monsters.cbegin(), monsters.cend(),
[&towers](auto const& monster) {
return std::any_of(towers.cbegin(), towers.cend(),
[&monster](auto const& tower) {
return has_collision(tower, monster);
});
});
}
这虽然还不够完善,是更可读(它读作“有什么怪物,对此有任何塔与它碰撞“)并且比手写循环更不容易出错。
如果在您的代码库中检查是否有一对元素(第一个来自一个容器并且第二个来自另一个容器)满足某些条件,您还可以考虑编写封装它的自定义any_of
你可以写点类似
bool checkCollision(std::vector<T> const& towers, std::vector<U> const& monsters) {
auto const has_collision = [](T const& tower, U const& monster) {
return monster.getPositionX() + monster.getRadius() + tower.getRadius() > tower.getTowerRangePositionX()
&& monster.getPositionX() < tower.getTowerRangePositionX() + monster.getRadius() + tower.getRadius()
&& monster.getPositionY() + monster.getRadius() + tower.getRadius() > tower.getTowerRangePositionY()
&& monster.getPositionY() < tower.getTowerRangePositionY() + monster.getRadius() + tower.getRadius();
};
return any_of(towers.cbegin(), towers.cend(),
monsters.cbegin(), monsters.cend(),
has_collision);
}
改为。
在第二个例子中,你只比较第一个怪物和第一个塔,因为你总是从那个点返回。 – aschepler
请修复您的问题标题。让它描述这个问题。其他人应该如何找到这个问题呢? –