С ++ Сортировка врагов по жизни - PullRequest
0 голосов
/ 17 января 2019

У меня проблема с моей маленькой игрой, которую я запрограммировал, с помощью книги на С ++.

Итак, сначала у меня есть класс PlayerObject и массив, в котором хранятся все игровые объекты. Когда игра начинается, я перебираю все объекты внутри массива.

while (true) {
  for (auto i = 0; i < 100; i++) {
    auto object = FuncObjectId(i);

    if (PlayerObject.IsEnemy(object) &&
        PlayerObject.Player.Position.Distance(object.Position) < 1000) {
      // enemies found in range
      FuncMoveTo(object)
    }
  }
}

Но что, если в данном диапазоне есть несколько врагов? Как я могу их заказать?

сортировка по жизни или расстоянию, например. Чтобы мой игрок двигался к ближайшей цели или к самой низкой цели здоровья.

Кроме того, все это должно как-то сбрасываться. Игрок не должен останавливаться после убийства цели, он должен автоматически перейти к следующему врагу с самой низкой жизненной / ближайшей позицией.

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Для вашей задачи я бы предположил, что у вас есть сравнительно короткий список врагов, например, менее тысячи. Если это так, вам не нужна настоящая сортировка, просто найдите самую маленькую запись:

minimal health found = health of first enemy
corresponding index of enemy = index of first enemy
for all enemies:
    if health enemy < minimal health found:
        minimal health found = health enemy
        corresponding index of enemy = index enemy

Если, однако, по каким-то причинам вам все же нужно их отсортировать, самый простой способ - сохранить их в сортируемом контейнере (вы можете написать один, но просто используйте std::vector или std::list). Определите метод в классе врага, который определяет отношение «меньше чем» (bool health_lower(const PlayerObject& a, const PlayerObject& b)), а затем используйте std::sort с этим методом в качестве компаратора.

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

0 голосов
/ 17 января 2019

Прежде всего измените цикл на

for (auto i = 0; i < FuncObjectId.size(); i++)

Зачем искать только 100 врагов?

Если игрок должен все время двигаться, не ищите врагов, которые ближе, чем 1000, но вы должны отсортировать их по расстоянию до игрока. Для этого вы должны использовать std :: sort http://www.cplusplus.com/reference/algorithm/sort/ Вы можете использовать эту функцию для сортировки врагов по желаемому параметру.

...