В вашем вопросе нет подробного описания требований о том, как ловкость влияет на ваш порядок атаки, но я предполагаю, что вы имели в виду одно из этих двух:
- Если один юнит обладает более высокой ловкостью, чемдругой, он всегда атакует первым.
- Если один юнит обладает большей ловкостью, чем другой, он обычно атакует первым.
Есливо-первых, это правда (юниты с более высокой ловкостью всегда атакуют первыми), а затем вы ищете способ перестановки массива с учетом ограничения, заключающегося в том, что юниты с более высокой ловкостью всегда оказываются перед юнитами с меньшей ловкостью, но со всеминаче сделано случайно.Один из способов сделать это заключается в следующем:
- Если у вас N единиц, присвойте номерам 1 ... N единицы случайным образом.Не назначайте один и тот же номер дважды.
- Сортируйте юниты в порядке возрастания следующим образом:
- Любой юнит с более высокой ловкостью, чем другой юнит, идет первым.
- Из двух единицкоторые привязаны, в зависимости от того, какое из случайных чисел будет на первом месте.
Вы можете показать, что этот подход упорядочит единицы так, что все единицы определенной ловкости случайным образом переставляются относительнодруг другу, но всегда предшествуют юнитам с меньшей ловкостью.Это занимает время O (n log n) и может быть выполнено с использованием Collections.sort
, Collections.shuffle
и соответствующего Comparator
.
Если, с другой стороны, вы хотите, чтобы порядок был случайным, но Под влиянием ловкости вы можете подумать об использовании некоторого рода случайного распределения, которым можно управлять с помощью какого-либо параметра.Например, вы можете назначить каждому юниту приоритет, полученный из нормального распределения, чье среднее значение - ловкость, а стандартное отклонение - некоторое достаточно большое число (скажем, 20).Это будет означать, что юниты с большей ловкостью с большей вероятностью будут двигаться раньше юнитов с меньшей ловкостью, хотя существует большое количество случайностей.Преимущество этого подхода заключается в том, что, настраивая базовое распределение и его параметры (среднее значение и дисперсию в случае нормального распределения), вы можете точно настроить степень, в которой учитывается показатель гибкости.
КакВ качестве примера очень простого подхода вы можете смоделировать единичную скорость как
priority = e (agility / 100) + random (1, 2)
Здесь, чем выше ловкость, тем выше приоритет.Увеличение количества случайности меняет степень, в которой ловкость имеет значение.Конечно, это может быть немного искажено, потому что каждое предельное увеличение ловкости имеет большее значение, поэтому вы можете заменить экспоненту чем-то вроде логистической функции .
Надеюсь, это поможет!