前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >游戏智能系列之三:有限状态自动机

游戏智能系列之三:有限状态自动机

作者头像
AlgorithmDog
发布2017-12-29 10:26:29
1.6K0
发布2017-12-29 10:26:29
举报
文章被收录于专栏:AlgorithmDog的专栏

游戏智能是很传统的领域,有限状态机和行为树是两种主要方法。今天这篇博客主要介绍有限状态自动机。

game_ai
game_ai

1. 有限状态机

有限状态机 (Finite-state machine,FSM),又称有限状态自动机,是表示有限个状态以及状态之间转移和动作等行为的数学模型。从它的定义,我们可以看到有限状态机的几个重要概念。

1.状态:表示对象的某种形态,在当前形态下可能会拥有不同的行为和属性; 2.转移:表示状态变更,并且必须满足确使转移发生的条件来执行; 3.动作:表示在给定时刻要进行的活动; 4.事件:事件通常会引起状态的变迁,促使状态机从一种状态切换到另一种状态。

下图是一个典型的有限状态机,描述了一个简单的对战逻辑。

fsm
fsm

这个有限状态机有三个状态,分别是 idle, escape 和 attack; 不同状态之间的转换是通过动作进行的,比如 idle 状态看到哥布林就会进入 attack 状态。

2. Clashjs 游戏中的有限状态机

但是在 Clashjs 游戏中,有限状态机需要一些变化。因为 Clashjs 游戏中,一架飞机的状态不仅由它本身采取的动作决定,还由它所处的环境(包括敌机和弹药包)决定。这时候的有限状态机反而简单了,不考虑状态之间的切换,只考虑在每个状态下应该采取什么动作。Clashjs 游戏中的有限状态机的实现代码如下所示。完整的代码已经传到 GitHub 上了(地址)。

代码语言:javascript
复制
    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 语句了。上图实现的有限状态机的示意图如下。

clashjs_fsm
clashjs_fsm

3. 总结

最近为了写游戏智能系列文章,我了解了一些游戏智能相关知识。我发现和如火如荼的机器学习和虚拟现实一比,游戏智能简直就是南极的冰窟窿。例如,我们很难找到这个领域的好资料和交流圈,特别是有关实操相关的资料。我想原因有两个。第一,游戏智能不 sexy。游戏智能的算法都只是一个框架,具体游戏行为逻辑需要大量人力物力填写,比端到端的深度学习不知道低到哪里去了。第二,游戏智能不容易复现因此比较难学习。机器学习有很多公开的数据集。拿到这些数据集,我们就可以写代码调参数了。但是游戏智能和游戏紧密结合,大部分好的游戏不提供游戏智能的接口,大部分提供接口的游戏质量差强人意。这使得非游戏开发商内部人员很难有机会实践游戏智能,从而很难产生好的实操分享。虽然说了那么多坑,但自己选得路,跪着也要走完。我会努力写完游戏智能系列。

游戏人工智能系列系列文章

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年11月1日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 有限状态机
  • 2. Clashjs 游戏中的有限状态机
  • 3. 总结
  • 游戏人工智能系列系列文章
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档