C++ 按生命对敌人进行分类

C++ Sort enemies by life

本文关键字:分类 敌人 生命 C++      更新时间:2023-10-16

我在一本 c++ 书的帮助下编写的小游戏有问题。

因此,首先我有一个名为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)
    }
  }
}

但是,如果在给定范围内有几个敌人怎么办?如何订购?

例如,按生活或距离排序。以便我的玩家移动到最近的目标,或最低的生命值目标。

此外,整个事情必须以某种方式重置。玩家在杀死目标后不应停止,他应该自动去下一个生命值最低/位置最近的敌人。

首先将循环更改为

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

为什么只寻找100个敌人?

如果玩家应该一直移动,只是不要寻找比 1000 更近的敌人,但您必须按与玩家的距离对它们进行排序。为此,您应该使用 std::sorthttp://www.cplusplus.com/reference/algorithm/sort/您可以使用此功能按所需的参数对敌人进行排序。

对于你给出的问题,我假设你有一个相对较短的敌人列表,例如不到一千个。如果是这种情况,你真的不需要真正的排序,只需搜索最小的条目:

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::vectorstd::list )。在敌人类中定义一个定义"小于"关系(bool health_lower(const PlayerObject& a, const PlayerObject& b))的方法,然后将std::sort与该方法一起使用作为比较器。

另一种方法是你编写一个存储敌人列表的类,每次创建一个敌人或一个敌人的生命值发生变化时,该类都会冒泡该特定敌人,因为其他敌人之间的顺序不会改变。