嗨,好吧就这么说吧。 我们有12名球员,我想做的就是找到最接近的球员。
我在下面写了一些代码;我尝试的两个版本(相信我他们的更多,现在可以写圣经)
/*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 :(得分: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;
}