如何模拟两个玩家之间的战斗?

时间:2011-03-26 20:23:02

标签: algorithm search artificial-intelligence minimax

我有两名球员,我想模拟他们之间的比赛。两者都有一些属性(权力,智力......)和不同的行为。某些行动的结果是基于属性值和一些运气因素。

算法:

  • 为两位玩家构建一个包含所有可能动作的游戏树
    • 游戏树的深度可能有限
    • 每个级别都属于不同的玩家
  • 在叶子节点使用一些启发式方法来找出必须移动的玩家获胜的可能性
  • 向上传播概率(如minimax算法那样)
  • 选择概率最高的行动
  • 在此算法的开头继续

所以,基本上这是minimax算法。我有几个问题:

  1. 如何考虑运气因素?
  2. 当我做一个动作时,我是否必须再次运行整个算法? (构建具有+1深度和新根节点的树,计算新概率......)
  3. 模拟战斗的其他任何想法?
  4. 感谢。

3 个答案:

答案 0 :(得分:3)

你应该查看蒙特卡罗树搜索,听起来如果你的问题很适合。

它不是使用启发式,而是在扩展树之前使用每个分支处的随机玩家运行完整游戏。关于这一点的好处是,你实际上正在构建一个概率树,并且你不必将树扩展到最后或者使用像MinMax这样的启发式进行一些截断。

MCTS也是GO游戏中目前最好的方法,目前最擅长玩未知规则的游戏。为了获得额外的效果,您可以使用一些有限状态机代理而不是随机播放器来使概率更准确。并且您还可以通过使用机器学习派生启发式跳过某些分支的决策器来减少分支因子。 (但这是你最后要做的事情,以提高技术的速度)

如果你可以做MinMax,你可以毫不费力地做MCTS :)而且MCTS可以玩比MinMax更复杂的游戏,因为它的复杂性大大降低了。 (如果你打算不断扩大游戏规则,那就太好了)

如果你有兴趣,请看看这里:

http://www.aaai.org/Papers/AIIDE/2008/AIIDE08-036.pdf

是的,你必须为每个玩家的每一步都这样做。所以MinMax和MCTS都会很慢;所有基于游戏树的技术都很慢。

使用MinMax,您可以保留一些树;移动到您的新状态的分支,并删除其父级和连接到它的子树。然后在剩下的子树中进一步扩展一个深度。但这是猜测;我之前没有时间这样做:)(但你会在概率计算中保留错误)

这些技术的好处是,当你构建它们时,它们起作用。机器学习技术的运行速度要快得多,但在使用之前需要数小时甚至数天的培训;)

答案 1 :(得分:2)

虽然通常你的算法有意义但我们无法保证这个算法是最好的算法。例如,让我们想象两场比赛:

  1. 在第一场比赛中,每位选手都有2个动作:用枪开火用剑击打。在这个游戏中,每个步骤都不会影响其他步骤,因此构建移动树在这里没有任何意义。每个玩家只需选择武器并继续射击/打击并用盾牌或其上喊“!”'直到死亡或获胜。
  2. 第二场比赛也有第三个动作 - 偷走对手的盾牌。在这种情况下,移动树会更有意义,因为很明显,如果你决定偷走敌人的盾牌,那么在用剑击剑之前偷它会更有意义。
  3. 因此,您是否需要此移动树,这取决于您的游戏规则。

    我所看到的关于运气因素的主要选项是,是否将其影响纳入移动树。这取决于运气因素是否以同样的方式影响每个动作。如果确实如此,那么在计算移动树时可以省略运气因子,然后在计算所选操作的结果时应用运气因子。否则,如果运气因素以不同的方式影响不同的行为(例如,即使完全失败者能够用枪射击敌人但用勺子杀死技能需要好运)那么应该考虑运气因素在计算移动树中的概率时。

    在每个节点之后是否需要重新计算整个树取决于您是否可以100%预测所选操作的结果。例如,在国际象棋中你可以预测,如果你决定移动一个棋子,那么这个棋子肯定会移动到你决定的地方。这允许您在每个步骤中选择移动树中的所选分支,并为其中的每个场景计算一个以上的移动,而不是从零开始重新计算完整的树。但是如果玩家可以决定用枪射击,这是不适用的,但由于他不幸的一天,他会用腿射击自己。

答案 2 :(得分:1)

你所要求的是非常“巨大”......但许多开发者已经完成了这项工作。

我建议你开始阅读一本关于游戏设计的书,就像这样: http://www.amazon.com/Game-Design-Practice-Wordware-Developers/dp/1556229127/ref=cm_cr_pr_product_top

...还可以在www.CodeProject.comwww.codeplex.com中搜索游戏实施示例。

祝你好运,