借助一本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)
}
}
}
但是如果在给定范围内有几个敌人怎么办?我该如何订购?
例如,按寿命或距离排序。 这样我的玩家就可以移到最近的目标或最低的健康目标。
此外,整个事情必须以某种方式重新设置。 杀死目标后,玩家不应停止, 他应该自动前往生命/最近位置最低的下一个敌人。
答案 0 :(得分:1)
首先将循环更改为
for (auto i = 0; i < FuncObjectId.size(); i++)
为什么只寻找100个敌人?
如果玩家要一直移动,就不要寻找比1000更近的敌人,但是您必须按照与玩家的距离对其进行排序。 为此,您应该使用std :: sort http://www.cplusplus.com/reference/algorithm/sort/ 您可以使用此功能按所需参数对敌人进行排序。
答案 1 :(得分:1)
对于您给定的问题,我假设您的敌人列表比较短,例如少于一千。在这种情况下,您实际上不需要真正的排序,只需搜索最小的条目即可:
foreach($group as $item){
$insert = array(
'activity' => $item[0],
'person' => $item[1],
'startdate' => $item[2],
'finishdate' => $item[3]
);
DB::table('test_tbl')->insert($insert);
}
但是,如果由于某些原因仍需要对它们进行实际排序,则最简单的方法是将它们存储在可排序的容器中(您可以编写一个容器,但只需使用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)
与该方法一起用作比较器。
另一种方法是编写一个存储敌人列表的类,每当一个敌人被创建或一个人的生命值发生变化时,该类就会冒泡该特定敌人,就像其他敌人对每个人的顺序一样其他不变。