我使用A *有一个简单的游戏问题:
我们在树中有几个节点,一个节点包含:
有五个要素:金属,木材,水,火,土地。
如果我们的元素的遭遇分数大于或等于怪物,我们的角色只能杀死怪物。
杀死怪物后我们必须加上所有奖励指向一个元素的分数,我们不能将它们分成几个元素。
目标:找到特定节点的最短路径。
我的解决方案: 我会用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.
我的问题:
我的解决方案是否正确且足够好?
这款游戏有更好的解决方案吗?
先谢谢:)
答案 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)获得通过块的额外功率所需的地理距离推动上限的距离。