我有两个玩家,我想模拟他们之间的一场游戏。两人都拥有一些属性(力量、智力……)以及不同的动作。某些动作的结果基于属性值和一些运气因素。
算法:
- 构建一个包含双方所有可能移动的游戏树
- 游戏树的深度可能会受到限制
- 每个层级都属于不同的玩家
- 在叶子节点使用一些启发式方法来找出必须进行移动的玩家获胜的概率
- 向上传播概率(就像极小化极大算法一样)
- 选择概率最高的移动
- 从算法的开始处继续
所以,基本上这就是极小化极大算法。但我有一些问题:
- 如何将运气因素考虑在内?
- 当我完成一个移动后,我是否需要重新运行整个算法?(构建深度+1且具有新根节点的树,计算新的概率……)
- 模拟战斗还有其他想法吗?
谢谢。
回答:
虽然总体来说你的算法是有意义的,但我们无法保证该算法就是最佳算法。例如,让我们设想两个游戏:
- 在第一个游戏中,每个玩家都有两个动作:用枪射击和用剑攻击。 在这个游戏中,每一步都不会影响其他步骤,因此构建移动树在这里没有任何意义。 每个玩家只需选择武器并不断射击/攻击并大喊“要么用盾牌防御,要么死在盾牌上!”直到死亡或胜利。
- 第二个游戏还有第三个动作 – 偷走对手的盾牌。 在这种情况下,移动树更有意义,因为很明显,如果你决定无论如何都要偷走敌人的盾牌,那么在用剑攻击之前偷走它更有意义。
因此,你是否需要此移动树高度取决于你的游戏规则。
关于运气因素的主要选项,正如我所看到的,是是否将其影响包括在移动树中。 这取决于运气因素是否以相同的方式影响每个动作。 如果是这样,则可以在计算移动树时省略运气因素,然后在你计算所选动作的结果时应用它。 否则,如果运气因素以不同的方式影响不同的动作(例如,即使是彻底的失败者也能够用枪射击敌人,但用勺子杀死技能需要好运),那么在移动树中计算概率时应考虑运气因素。
你是否需要在每个节点之后重新计算整个树,取决于你是否可以 100% 预测所选动作的结果。 例如,在国际象棋中,你可以预测如果你决定移动一个棋子,那么该棋子肯定会移动到你决定移动到的位置。 这允许你每次都选择移动树中选定的分支,并为其中的每个场景计算多一个移动,而不是从头开始重新计算整个树。 但如果玩家可以决定用枪射击,但由于他今天运气不好,他会射伤自己的腿,那么这是不适用的。