游戏智能是很传统的领域,有限状态机和行为树是两种主要方法。今天这篇博客主要介绍有限状态自动机。
有限状态机 (Finite-state machine,FSM),又称有限状态自动机,是表示有限个状态以及状态之间转移和动作等行为的数学模型。从它的定义,我们可以看到有限状态机的几个重要概念。
1.状态:表示对象的某种形态,在当前形态下可能会拥有不同的行为和属性; 2.转移:表示状态变更,并且必须满足确使转移发生的条件来执行; 3.动作:表示在给定时刻要进行的活动; 4.事件:事件通常会引起状态的变迁,促使状态机从一种状态切换到另一种状态。
下图是一个典型的有限状态机,描述了一个简单的对战逻辑。
这个有限状态机有三个状态,分别是 idle, escape 和 attack; 不同状态之间的转换是通过动作进行的,比如 idle 状态看到哥布林就会进入 attack 状态。
但是在 Clashjs 游戏中,有限状态机需要一些变化。因为 Clashjs 游戏中,一架飞机的状态不仅由它本身采取的动作决定,还由它所处的环境(包括敌机和弹药包)决定。这时候的有限状态机反而简单了,不考虑状态之间的切换,只考虑在每个状态下应该采取什么动作。Clashjs 游戏中的有限状态机的实现代码如下所示。完整的代码已经传到 GitHub 上了(地址)。
if (utils.canKill(playerState, enemiesStates) && playerState.ammo) {
return 'shoot';
}
if (direction2ammo !== playerState.direction && direction2ammo !== null) {
return direction2ammo;
}
if (direction2ammo == playerState.direction){
return 'move';
}
return utils.safeRandomMove();
由于状态转移部分在游戏逻辑中,有限状态机代码退化成什么状态采取什么动作的 if-else 语句了。上图实现的有限状态机的示意图如下。
最近为了写游戏智能系列文章,我了解了一些游戏智能相关知识。我发现和如火如荼的机器学习和虚拟现实一比,游戏智能简直就是南极的冰窟窿。例如,我们很难找到这个领域的好资料和交流圈,特别是有关实操相关的资料。我想原因有两个。第一,游戏智能不 sexy。游戏智能的算法都只是一个框架,具体游戏行为逻辑需要大量人力物力填写,比端到端的深度学习不知道低到哪里去了。第二,游戏智能不容易复现因此比较难学习。机器学习有很多公开的数据集。拿到这些数据集,我们就可以写代码调参数了。但是游戏智能和游戏紧密结合,大部分好的游戏不提供游戏智能的接口,大部分提供接口的游戏质量差强人意。这使得非游戏开发商内部人员很难有机会实践游戏智能,从而很难产生好的实操分享。虽然说了那么多坑,但自己选得路,跪着也要走完。我会努力写完游戏智能系列。