如何在for循环中返回布尔值

时间:2017-04-23 00:14:41

标签: c++ boolean

当两个对象发生碰撞时,第一个函数调用将返回碰撞的字符串,因此我知道我的逻辑是真的。但是检查布尔值什么都不返回,所以我很难过。

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;

2 个答案:

答案 0 :(得分:1)

一旦找到一个不匹配的对象,就会发生return false。它需要在功能上下载 - 在底部。一旦你检查了所有内容并且没有匹配,那么你可以说没有任何匹配。

答案 1 :(得分: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);
                });
         });
}

虽然仍然不完美,但更具可读性(读作&#34;是否有任何怪物,它有任何与之相撞的塔#34;)并且比手写循环更不容易出错

如果代码库中的常见模式是检查一对元素,其中第一个元素来自一个容器而另一个元素来自另一个容器满足某些条件,您还可以考虑编写一个自定义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);
}

代替。