2017-04-23 78 views
0

第一個函數調用將返回兩個對象發生碰撞時的字符串衝突,因此我知道我的邏輯是真實的。然而,布爾檢查沒有返回,所以我很難過。如何返回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; 
+1

在第二個例子中,你只比較第一個怪物和第一個塔,因爲你總是從那個點返回。 – aschepler

+0

請修復您的問題標題。讓它描述這個問題。其他人應該如何找到這個問題呢? –

回答

1

只要您找到一個不匹配的對象,就會發生您的return false。它需要waaayyyyy的功能 - 底部。一旦你檢查了一切,沒有匹配,那麼你可以說沒有任何匹配。

+0

我在想什麼,甚至不能做一個簡單的布爾值我應該知道更好。我接受你的修理者 –

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); 
} 

改爲。