如何解决这个游戏问题

时间:2011-04-24 01:57:27

标签: algorithm

我使用A *有一个简单的游戏问题:

我们在树中有几个节点,一个节点包含:

  1. 有力量的怪物和它的元素
  2. 链接到其他节点的方式。
  3. 我们杀死这个怪物后得到的加分。
  4. 有五个要素:金属,木材,水,火,土地。

    如果我们的元素的遭遇分数大于或等于怪物,我们的角色只能杀死怪物。

    杀死怪物后我们必须加上所有奖励指向一个元素的分数,我们不能将它们分成几个元素。

    目标:找到特定节点的最短路径。

    我的解决方案: 我会用A *:

    启发式: Dijkstra

    find(mainCharacter,node,plusPoint) {
      // node here is the node has smallest f
      shortestWay[5] ways;
      foreach(element in elements) {
           mainCharacter->element += plusPoint;
           if (mainCharacter can beat the monster in node) {
               bestNode is node has the smallest f in node->neighbourNodes
               *ways[element] ++ << the steps, we plus point to the first element at very first path. it can be -1 if we can't go.
               find(mainCharacter,bestNode,node->plusPoint)
           }
    }
    Our goal will be the *ways[element] with the smallest step.
    

    我的问题:

    我的解决方案是否正确且足够好?

    这款游戏有更好的解决方案吗?

    先谢谢:)

1 个答案:

答案 0 :(得分:1)

我不确定A *是否允许你这样做。

这里的主要问题是,在探索新节点时,可用节点会发生变化。这意味着有时候回溯可能是值得的。

示例:您在节点A,它打开到B和C. B打开到E. E打开到F,打开到G,打开到D. C打开到D,这是您的目的地。

B由力量2元素保护,C由力量4元素保护。你有力量3. E F和G都有2个元素。

从A你只能去B和C.C太强大所以你去B.你可以继续四处奔走ABEFGD,或者你可以回溯:ABAC D.(你取出B后,C是不再太强大了。)

所以,无论你提出什么算法,你最终都会做很多重新评估。由于潜在的反向追踪,O(n!)甚至没有限制这一点。

我将采取的方法是在没有回溯的情况下查看最短的路线。这是你的上限,应该很容易用A *(我认为...)或类似的东西。然后,您可以找到比此距离短的地理路径(忽略功率级别)。从那里开始,你可以开始消除功率块,直到1)你把它们全部击落,或者2)获得通过块的额外功率所需的地理距离推动上限的距离。