Я работаю над видеоигрой, написанной в C++, и я пытаюсь создать монстров-икру на основе заданного радиуса, допустим, я определяю позицию, подобную этой:
Position ( X, Y, Z ) Amount ( Value )
То, что делает этот код, является начальной точкой, и я хочу разместить (количество) монстров вокруг начальной точки (X = X-Amount, Y = Y-Amount, X = X + Amount, Y = Y + Amount), там максимум 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 позиции впереди.
Это плохо, потому что я использую случайное значение, поэтому почему я внутри цикла из 1000, потому что иногда монстр не может появиться на данной позиции.
Также иногда монстры появляются рядом друг с другом, и я действительно этого не хочу. Мне интересно, могли бы вы, ребята, помочь мне, рассказав мне, какой математический алгоритм я должен использовать для этого типа задач?
Если у вас есть набор дискретных подходящих позиций появления (которые, как я предполагаю, вы делаете, учитывая, что вы добавляете и вычитаете маленькие целые числа из центральной позиции), вы можете использовать такой алгоритм:
A
всех подходящих позиций икры, со списком смежных подходящих мест появления для каждой позиции в этом списке.A
A
(Это предотвратит появление монстров в положениях, смежных с любым ранее созданным монстром)A
равна нулю).Это форма отбора проб коллектора. Это позволяет избежать пробного и ошибочного подхода к поиску позиции появления, сделав сначала предварительные вычисления. Таким образом, использование пробной ошибки и этого метода (или какого-либо другого метода) будет зависеть от того, насколько удовлетворительным или неудовлетворительным является метод проб и ошибок.
sometimes monsters spawn next to each other, and I really don't want that
, вы, похоже, можете определить, какие локации находятсяnext to
другими локациями. Таким образом, список соседних позиций для каждой позиции будет просто списком позиций, которые соответствуютnext to
критерию.