2014-01-23 3 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

Очень хорошая работа Яник. Этот тип вещей сводит меня с ума и ломает мой мозг. Хранение всех расстояний в моем втором примере было довольно глупо, но для тестирования проб и ошибок. Это выглядит ОЧЕНЬ надеясь и чистым тоже :) спасибо. – TomSwoobs

+0

Спасибо. Ну, я должен сказать, я еще не тестировал это, но это выглядит наиболее естественным способом исправить это, для меня ... (Хотя, вероятно, более тонкий подход к построению 'index == -1') –

+2

Чтобы избежать проблемы с индексом = -1, вы можете установить minDistance в качестве некоторого достаточно большого значения в идеале, самый большой поплавок (например, что-то вроде 'std :: numeric_limits :: max();' –

Смежные вопросы