Я работаю над видеоигрой, написанной на C ++, и пытаюсь создать монстров, основанных на заданном радиусе, скажем, я определяю позицию следующим образом:
Position ( X, Y, Z ) Amount ( Value )
То, что этот код делает, является начальной точкой, это позиция, и я хочу разместить (количество) монстров вокруг начальной точки (X = X-сумма, Y = Y-сумма, X = X + сумма, Y = Y + сумма), там максимум 9 монстров за спавна.
Код, который я сейчас использую, довольно нобистский:
// 1000 tries because I'm using random numbers
for (int i = 0; i < 1000; i++)
{
toPlace = centerPos;
toPlace.x = uniform_random(centerPos.x-monsterAmount, centerPos.x+monsterAmount);
toPlace.y = uniform_random(centerPos.y-monsterAmount, centerPos.y+monsterAmount);
if (Monster->CanSpawnAt(toPlace))
{
Monster->Spawn();
break;
}
}
Расчет позиции использует monsterAmount
(количество монстров, определенных пользователем), поэтому, если есть 3 монстра, то это -3 позади и +3 позиции впереди.
Это плохо, потому что я использую случайное значение, поэтому я нахожусь внутри цикла for 1000, потому что иногда монстр не может появиться в данной позиции.
Также иногда монстры появляются рядом друг с другом, и я действительно не хочу этого. Я задаюсь вопросом, могли бы вы, ребята, помочь мне, рассказав, какой математический алгоритм я должен использовать для этого типа задач?
Если у вас есть набор дискретных подходящих позиций спавна (что, я думаю, вы делаете, учитывая, что вы добавляете и вычитаете маленькие целые числа из центральной позиции), то вы можете использовать алгоритм, подобный следующему:
A
из всех подходящих позиций возрождения, со списком смежных допустимых позиций возрождения для каждой позиции в этом списке.A
,A
, (Это предотвратит появление монстров в позициях рядом с любым ранее порожденным монстром)A
это ноль).Это форма отбор проб из пласта. Это позволяет избежать метода проб и ошибок при поиске позиции появления, выполняя предварительные вычисления. Таким образом, будет ли использоваться метод проб и ошибок или этот метод (или какой-либо другой метод), будет зависеть от того, насколько удовлетворительным или неудовлетворительным является метод проб и ошибок.
Других решений пока нет …