-4

它是一个简单的 c++ 游戏。

在坐标范围 (0.0f,0.0f) 到 (10.0f,10.0f) 内随机生成 5 个塔。他们有随机的生命值,范围和伤害上限在一定限度内。他们不能动。

现在,地图上添加了 10 个单位,具有固定的移动速度、生命值和伤害。

单元和塔的数量将通过模拟确定。只有他们的初始位置是随机的。将运行 1000 次模拟。

目标是使单位的胜率达到约 90%。

当单位摧毁所有的塔时,游戏获胜。单位可以以预定义的速度向塔移动。每个模拟都需要多轮才能完成。在每一轮中,如果在一定范围内,单位会朝着最佳选择的目标移动并攻击。类似地,塔会选择其攻击范围内的任何单位并继续攻击它,直到它死亡或移出范围。

我需要一些关于我应该投入时间来实现相同算法的指针。

目前,我可以使用与单位的距离、生命值、射程和塔的伤害的一些加权平均值,并选择在这些标准上得分最低的塔,可以达到 84.2% 的胜率。在不考虑其他属性的情况下向与单位距离最小的塔移动,获得大约 72% 的胜率。


从已删除答案的评论中:

还有一个限制。我每次只能选择一个目标。单位将确保朝着那个目标移动。我不应该修改单位向 target 移动的部分。因此,在模拟的每一轮中都必须有一个目标塔,目标单位将朝着哪个目标移动。所以,我无法将我的单位从塔楼移到安全区域,然后将它们组装在一个点上,然后计划我的攻击。

4

2 回答 2

1

我有一个更好的公式来选择要攻击的塔。

对于每个战士使用它来获得每个塔的“分数”。然后选择得分最高的塔

a1*todalDmgFromOtherWarriorsAimedAtThatTower - a2*towerRange - a3*towerDamage - a4*towerHP - a5*distance/speed

a1-a5 应该一次又一次地修改,直到获得最佳结果,使某些参数比其他参数更重要

于 2013-05-10T10:17:12.447 回答
1

如果没有时间限制或时间优势,我会尝试采取分组的方法——让所有单位一起攻击同一个塔,并让所有单位在同一时间进入塔的攻击范围。这实际上可能最终不会花费太多时间,因为你会更快地开火,同时受到更少的伤害,因此不必考虑防止单位死亡的次数,也会产生更高(如果不是完美的话)的胜率。

你可以让一个特定的单位(HP 最高的?)在其他单位之前进入范围,这样它就会引火并且在接近死亡时可以移出范围。如果最强的单位已经移出范围,您可以将下一个被攻击的单位也移出范围(依此类推),或者继续攻击直到塔被摧毁。

你必须先玩哪个塔来攻击。可能是最弱的(最低的 HP + 伤害),但您可能不想派出最强大的单位来引火,因为您可能希望将其保留到最后一个最强的塔上。

移动一个单位以避开所有塔的攻击范围以到达所需的塔可能很困难。一些选项:

  • 将设备留在原处。

  • 战略性地挑选塔以“解开”最强大的单位。

  • 攻击多个塔。

如果所有这些听起来像是一项几乎不可能完成的任务,需要一些非常先进的人工智能,请注意它可能比您想象的要简单得多。只需忽略大多数约束即可开始并一次添加它们,就像从简单开始并从那里构建它一样。但是,是的,这比您的个人方法要困难得多。主要的困难在于几何计算,并尝试寻找塔的最佳攻击顺序和伤害承受者的顺序。

我可能会如何解决这个问题:(测试每一步的效率,当你高兴时停下来)

  • 写一个启发式来确定最好的塔。将所有单位移到那里攻击它(忽略所有其他塔)。重复直到游戏结束。这应该很简单。

  • 修改为等到大多数单位都在那里后再进入塔范围。应该不会太难。

  • 如果你愿意,你可以在这里停下来,在任何困难的事情开始发生之前(也许稍微改进一下),因此它不应该花你太长时间,只需将它与你当前的方法进行比较。

  • 编写一些简单的代码让单位在其他塔周围移动(如果可能的话)。

  • 如果某些单位无法到达那里,请修改您的采摘塔代码以重新确定塔。

  • 逐步使一切变得更加复杂。

旁注 - 由于塔是静态的,您可以提前确定到达塔所需的时间,因此您可以在安全的地方等待(而不是仅仅在塔的范围之外,可能在范围内多个其他塔)如果其他单位需要更长的时间才能到达那里。

附加说明 - 如果单位也可以远程,如果任何单位的攻击范围比任何塔都长,那么让该单位独奏该塔直到它被摧毁(免费杀戮!)是最有效的。

于 2013-05-10T14:36:40.957 回答