【问题标题】:C++ finding n points as close as possible to given xyC++ 找到尽可能接近给定 xy 的 n 个点
【发布时间】:2023-03-30 16:35:01
【问题描述】:

在 RTS 游戏中,当您移动某些单位时,它们会找到路径并前往距离所选地点最近的地点。我不知道如何选择那些地方,我的意思是每个单元的目标点。

例如,当我派出 9 个部队时,我希望他们有这样的目标:

. - empty, 
T - targets for units, 
O - the place that I've choosen to move them, target for unit too
.....
.TTT.
.TOT.
.TTT.
.....

寻路算法已经准备好,我只需要生成目标点的列表(或向量),每个单元一个。我不想要完整的代码,只需要一些建议和想法……好吧,我必须记住,并非所有地方都适合步行……

感谢您的任何回复,并为我的英语不好感到抱歉...

【问题讨论】:

    标签: c++ algorithm points


    【解决方案1】:

    您可以从分配的点使用BFS。如果选定的图块是可以容纳一个单位的图块 [不是障碍物],则用一个单位“填充”选定的图块。继续这样做,直到您“用尽”单位数量。

    在伪代码中:

    selectTargetLocation(point,units):
      currUnit <- 0
      queue<- new queue
      visited <- {}
      map<unit,point> <- empty map
      queue.push(point)
      while (queue.empty() == false): 
         current <- queue.takeFirst()
         visited.add(current)
         for each p such that p and current are neighbors: //insert neighbors to queue
              if p is not in visited: 
                    queue.push(p)
         if current is not an obstacle: 
             map.put(unit[currUnit++],current) 
         if (currUnit == units.length) break //break when exhausted all units
      return map
    

    【讨论】:

      【解决方案2】:

      我的想法是这样的:首先,测试目的地是否被占用,或者一个单元是否已经拥有该目的地。如果是这种情况,那么您需要找到一个免费的关闭点。您可以将所有近点推送到队列,当前点等等......类似于填充算法),直到找到一个未被占用的点。然后,找到该位置的路径。

      【讨论】:

      • 这完全是一个 BFS,除了你不维护一个 visted 集,这可能导致 (1) 过度计算 [你将计算太多次相同的点]。 (2) 您最终可能会在同一个图块中放置 2 个单位
      • @amit Hm,在阅读了一些关于 BFS 的文章后,我理解你的正确:D 维基百科文章很复杂(有图表,而不是地图)所以我想,它不一样 :D
      • Fill 是一种 BFS 算法,所以是的,它是 BFS...但是,我更喜欢将 BFS 考虑在图形中,而不是多维网格中。有一种叫做 Lee 的算法,它也非常类似于 BFS,用于网格中的最短路径搜索。
      • 等等,有个主意。如果我只是把他们送到一个地方,如果这个地方被占用了,就停在你所在的地方?
      • @kittyPL:这会导致过度计算,您将不得不计算相同的东西n 次 [其中n 是发送的单元数]。通常在 RTS 游戏中 [AFAIK] 性能是一个问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-09
      • 1970-01-01
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      相关资源
      最近更新 更多