2014-01-23 137 views
0

嗨,好吧,就這樣吧。 我們有12名球員,我想要做的就是找到最接近的球員。找到xyz之間的最小距離

我已經在下面寫了一些代碼;我嘗試的兩個版本(相信我,他們已經多了很多,可以寫一本聖經現在)

/*int client::closestEnemy() 
{ 
    for(u32 i = 0; i<12; i++) 
    { 
     DbgPrint("i: %i\n", i); 
     u32 index = 0; 
     if(!p[i].exist() || !p[i].alive() || p[i].team() == 3 || i == s.index) 
       continue; 

     for(u32 o = 0; o<12; o++) 
       if(vec.distance(*pos(), *p[i].pos()) <= vec.distance(*pos(), *p[o].pos()) || vec.distance(*pos(), *p[i].pos()) == vec.distance(*pos(), *p[o].pos())) 
         index++; 
     DbgPrint("PLAYER %s INDEX = %i\n", p[i].readName(), index); 

     if(index>10) 
      return i; 

     index = 0; 
    } 
    return -1; 
}*/ 


int client::closestEnemy() 
{ 
    float distacnes[11] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 
    u32 index = 0; 
    for(u32 i = 0; i<12; i++) 
     if(p[i].exist() || p[i].alive() || p[i].team() != 3 || i != s.index) 
      distacnes[i] = vec.distance(*pos(), *p[i].pos()); 
     else 
      continue; 

    for(u32 i = 0; i<12; i++) 
     if(distacnes[i]<distacnes[i+1]) 
      index++; 

    DbgPrint("Score = %i\n", index); 

    if(index>11) 
     return index; 

    return -1; 
} 

什麼我做的是簡單地增加1指數當過另一個客戶距離較大然後我的。

現在第一個是最好的選擇,但有時不會創建足夠高的索引,這使得零感,因爲至少有一個客戶端必須有一個較小的距離,然後其他人。

+0

是否已確認在第一循環(任一版本)這個漫長的條件,做你想要它做什麼?從你對這個問題的描述中,我不知道爲什麼有一半的這些條件存在,也許我只是缺乏背景。 – delnan

+0

當你通過時,'距離'是否包含正確的值?如果是這樣,只需遍歷存儲最小值(從無窮遠處開始,因此第一個始終最小)和它對應的索引的列表。對不起,如果我錯過了一些什麼 –

+0

是的抱歉,我在這裏很沉悶。我的聲明好,距離也是。 – TomSwoobs

回答

3

首先,一些縮進會幫助,我猜。 然後,沒有必要存儲所有的距離。您可以跟蹤的最小距離的,到目前爲止,遇到像這樣:

int client::closestEnemy() 
{ 
    int index = -1; 
    float minDistance; 
    for(u32 i = 0; i<12; i++) { 
     if(p[i].exist() || p[i].alive() || p[i].team() != 3 || i != s.index) { 
      float distance = vec.distance(*pos(), *p[i].pos()); 
      if (index == -1 || distance < minDistance) { 
       index = i; 
       minDistance = distance; 
      } 
     } 
    } 

    return index; 
} 
+0

Yannick非常好的工作。這些類型的東西讓我發瘋,打破了我的大腦。在我的第二個例子中存儲所有的距離是相當愚蠢的,但是用於試錯測試。這看起來非常希望和乾淨:)謝謝。 – TomSwoobs

+0

謝謝。嗯,我必須說,我還沒有測試過,但這看起來是修復它的最自然的方法,對我來說...(雖然可能有更微妙的方法來構建索引== -1) –

+2

爲了避免索引= -1的問題,你可以設置minDistance是理想的一些足夠大的值,最大的浮點數(例如像'std :: numeric_limits :: max();' –