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

0

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

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

Теги:
position
spread

1 ответ

0
Лучший ответ

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

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

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

  • 0
    Теперь я получаю список подходящих позиций для каждого из моих монстров, однако я не знаю, каков самый простой способ получить соседние позиции из данной позиции.
  • 0
    Как лучше всего найти соседние позиции, зависит от вашей геометрии, но, учитывая, что вы говорите, что sometimes monsters spawn next to each other, and I really don't want that , вы, похоже, можете определить, какие локации находятся next to другими локациями. Таким образом, список соседних позиций для каждой позиции будет просто списком позиций, которые соответствуют next to критерию.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню