【问题标题】:C++ Sort enemies by lifeC++ 按生命排序敌人
【发布时间】:2019-01-17 09:30:05
【问题描述】:

在一本 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)
    }
  }
}

但是如果给定范围内有多个敌人怎么办?我如何订购它们?

例如,按寿命或距离排序。 这样我的玩家就会移动到最近的目标,或最低的生命值目标。

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

【问题讨论】:

  • 你可以看看std::sort ?
  • 还有可能std::copy_if
  • 给猫剥皮的方法不止一种。例如,您可以将所有“有趣”的 object_id 复制到一个临时容器中,并按对象的健康状况对其进行排序。您必须对主循环的每次迭代进行排序,所以它不太有效。另一种方法是使用更有效的数据结构来存储对象,按距离和/或健康状况进行索引。

标签: c++ sorting game-engine


【解决方案1】:

首先将for循环改为

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

为什么只寻找 100 个敌人?

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

【讨论】:

    【解决方案2】:

    对于您给定的问题,我假设您的敌人名单相对较短,例如不到一千。如果是这样的话,你真的不需要真正的排序,只需搜索最小的条目:

    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&amp; a, const PlayerObject&amp; b)),然后将该方法用作比较器的 std::sort

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-10
      • 2017-10-04
      • 2023-03-21
      相关资源
      最近更新 更多