Математическая область Номер позиции Радиус распространения

Я работаю над видеоигрой, написанной на 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, потому что иногда монстр не может появиться в данной позиции.

Также иногда монстры появляются рядом друг с другом, и я действительно не хочу этого. Я задаюсь вопросом, могли бы вы, ребята, помочь мне, рассказав, какой математический алгоритм я должен использовать для этого типа задач?

0

Решение

Если у вас есть набор дискретных подходящих позиций спавна (что, я думаю, вы делаете, учитывая, что вы добавляете и вычитаете маленькие целые числа из центральной позиции), то вы можете использовать алгоритм, подобный следующему:

  1. Сделай список A из всех подходящих позиций возрождения, со списком смежных допустимых позиций возрождения для каждой позиции в этом списке.
  2. Выберите место появления случайным образом из списка A,
  3. Удалить выбранную позицию появления и все смежные позиции из списка A, (Это предотвратит появление монстров в позициях рядом с любым ранее порожденным монстром)
  4. Повторяйте с шага 2 до тех пор, пока не появятся все монстры или пока не останется подходящих позиций появления (т.е. длина списка A это ноль).

Это форма отбор проб из пласта. Это позволяет избежать метода проб и ошибок при поиске позиции появления, выполняя предварительные вычисления. Таким образом, будет ли использоваться метод проб и ошибок или этот метод (или какой-либо другой метод), будет зависеть от того, насколько удовлетворительным или неудовлетворительным является метод проб и ошибок.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]