当前位置: 首页 > news >正文

体育竞技游戏的团队AI

很多人问游戏AI该怎么做?随着游戏类型的多元化,非 MMO或者卡牌的游戏越来越多,对AI的需求也越来越强了。而市面上关于 AI的书,网上找得到的文章,也都流于一些只言片语的认识,理论化的套路,和一些简单的 DEMO,离真正的项目差距甚远,无法前后衔接成一条线,更无法真正落地到编码。

国内真正做过游戏AI的少之又少,东拉西扯的人很多,真正做过项目的人很少,因为国内主要以MMO为主,RTS比较少,体育竞技类游戏更少,而从AI的难度上来看,应该是:MMO < FPS < RTS < 体育竞技。作为实际开发过AI的人,给大家科普一下,什么叫做硬派AI。

硬派游戏AI,不是虚无缥缈的神经网络,用神经网络其实是一个黑洞,把问题一脚踢给计算机,认为我只要训练它,它就能解决一切问题的懒人想法。更不是遗传算法和模糊逻辑,你想想以前8位机,16位机上就能有比较激烈对抗的足球游戏、篮球游戏,那么差的处理器能做这些计算么?

硬派游戏AI,就是状态机和行为树。状态机是基本功,行为树可选(早年AI没行为树这东西,大家都是hard code的)。大部分人说到这里也就没了,各位读完还是无法写代码。因为没有把最核心的三个问题讲清楚,即:分层状态机、决策支持系统、以及团队角色分配。下面以我之前做的篮球AI为例,简单叙述一下:

何为分层状态机?

每个人物身上,有三层状态机:基础层状态机、行为层状态机、角色层状态机。每一层状态机解决一个层次的复杂度,并对上层提供接口,上层状态机通过设置下层状态机的目标实现更复杂的逻辑。

基础状态机:直接控制角色动画和绘制、提供基础的动作实现,为上层提供支持。
行为状态机:实现分解动作,躲避跑、直线移动、原地站立、要球、传球、射球、追球、打人、跳。
角色状态机:实现更复杂的逻辑,比如防射球、篮板等都是由N次直线运动+跳跃或者打人完成。

image

每一层状态机都是通过为下一层状态机设定目标来实现控制(目标设定后,下层状态机将自动工作,上层不用关心动画到底播到哪了,现在到底是跑是跳),从而为上层提供更加高级拟人化的行为,所有状态机固定频率更新(如每秒10次),用于判断状态变迁和检查底层目标完成情况。最高层的角色状态机的工作由团队AI来掌控,即角色分配的工作。而行为状态机以上的状态抉择,比如回防,到底是跑到哪一点,射球,到底在哪里起跳,路径是怎样的,则由决策支持系统提供支持。

何为决策支持系统?

状态机为角色的大脑,而决策支持系统为角色的眼睛和耳朵,常见的工具有势力图(Influence Map)和白板(相当于不同角色间喊话),其中势力图比较常用,篮球游戏AI势力图可以用下面几张图来表示:

image

势力图1:于防守篮板距离的map,每格分值为最远距离减去该格到篮板所在格子的距离

image

势力图2:进攻篮板距离的map,每个分值为最远距离减去该格到篮板距离,篮板后为0

image

势力图3:同敌人距离,每个敌人有影响范围,范围内,离敌人越近分越低,范围重叠选低的。

image

势力图4:同所有队友目标位置距离map,打分方法类似上图。

image

势力图5:与每个队友目标位置距离的map,标识单个队友目标位置距离的map。

image

势力图6:现实传球可行性的map,分数越高,越容易把球传到该格子上。

image

势力图7:容易把球传出的位置map,越容易直接传球给队友的区域分数越高。

image

势力图8:综合map,把以上map按一定加权求和。球员有合法目标区域,便于实现内线游走和外线游走。

每个球员性格不同,权值也不同,有保守的球员,有喜欢冒险的球员,权值不同而已。这些势力图都是为了给上面的三层状态机和团队状态机提供决策支持的。

何为团队角色分配?

每一层状态机为下一层设定一个目标,让下层自动工作,顶层角色层的目标则由最高层的团队ai进行战术指导。

image

团队状态机跟据当前的游戏情况确定当前首要目标(进攻或者防守),又根据当前的势力图等信息,确定进攻或者防守的具体战略(比如中路突破、盘路包抄、下底传中等),最终为当前己方的所有角色分配一个新的任务,即设定角色层状态机的新目标,确定他是做主攻还是做助攻,还是联防还是策应。具体该怎么联防,怎么策应,那就是角色层状态机的事情了。

话题总结

其实团队AI没那么玄乎,任何问题就是一个编程的建模问题,而最复杂的体育竞技类游戏的AI策略,上文已经给出模型,相信各位略加修改即可使用。写状态机是游戏AI的硬功夫,如果状态机逻辑经常改变或者项目规模大了以后可以考虑引入决策树来控制状态机,程序提供一系列接口,然后用可视化的编辑器进行更改,感兴趣的人可以参考决策树相关文章。

概率统计

如果上面这些逻辑都实现了,这时候才可以辅助与概率统计来让角色具备学习特性,比如统计某个策略对对手的成败情况,用来支撑下一次决策,这样能够逐步发现对手的弱点,还可以统计所有用户的大数据,来确定某种情况下,选择什么策略,能够对付60%的用户。

神经网络

在上面所有逻辑都实现了,你调试好了,玩着比较顺畅的时候,再在团队角色分配处尝试使用神经网络或者模糊逻辑,同样是学习大数据,来引入一些不可控的人性化的成分,让游戏更加有意思。(EA的 FIFA 20XX号称引入神经网络,Call of Duty的AI也号称引入了神经网络和学习机制)。确实让游戏更有趣一点,但仅仅如此而已。

原文发布时间为:2018-07-05
本文作者:韦易笑
本文来自云栖社区合作伙伴“Golang语言社区”,了解相关信息可以关注“Golang语言社区”

相关文章:

  • 1-思科防火墙:搭建防火墙环境
  • 棋盘问题 dfs()基本的
  • URL 编码规则
  • TNS-01106: Listener using listener name LISTENER has already been started
  • C语言学习(三)--语句
  • 细说ASP.NET Forms身份认证
  • zabbix安装思路
  • 【转】checkedlistbox使用办法
  • Release Flutter的最后一公里
  • 关于PredicateT委托
  • Groovy String类型null和empty()判断
  • 使用GitHub进行团队合作
  • 源码阅读:SDWebImage(十八)——UIView+WebCache
  • Visual Studio 2015 介绍
  • ftp的主动模式active mode和被动模式 passive mode的配置和区别
  • CSS3 变换
  • Iterator 和 for...of 循环
  • JS变量作用域
  • Markdown 语法简单说明
  • maya建模与骨骼动画快速实现人工鱼
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • 安卓应用性能调试和优化经验分享
  • 工作中总结前端开发流程--vue项目
  • 力扣(LeetCode)357
  • 前端性能优化——回流与重绘
  • 前端之React实战:创建跨平台的项目架构
  • 试着探索高并发下的系统架构面貌
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 一道面试题引发的“血案”
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • scrapy中间件源码分析及常用中间件大全
  • 昨天1024程序员节,我故意写了个死循环~
  • ​iOS实时查看App运行日志
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • # 数据结构
  • (11)MSP430F5529 定时器B
  • (3)llvm ir转换过程
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (超详细)语音信号处理之特征提取
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (一)基于IDEA的JAVA基础12
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .Net CF下精确的计时器
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET Core跨平台微服务学习资源
  • .NET中的Exception处理(C#)
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @Import注解详解
  • @property括号内属性讲解
  • @Transaction注解失效的几种场景(附有示例代码)
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • []指针
  • [100天算法】-不同路径 III(day 73)