2014-01-23 82 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();' –