游戏中AI的行为树(Behaviour Tree in Game AI)

行为树已经成为游戏AI中重要流行的实现方式,相比其他种类的ai(如神经网络,遗传算法,机器学习)更适合策划配置和控制,相比fsm更易扩展,在arpg中的怪物ai中比较流行。这里对行为树的概念做个总结。

                行为树是一个树状结构,没给节点都是一个行为节点,ai的执行过程就是从树根按照一定规则开始遍历整个树的过程,通常实现上会在没帧从树根处tick一遍整棵树。这棵树完整执行完一次的过程中可能对树遍历过很多次,因为每次整个树遍历完之后,如果还有节点还在running状态,就要在从根处tick一下再遍历,当run后没有任何节点在running就是执行完了一次,这时一般会进行新的一次执行,

                节点有不同的功能,有的控制遍历的顺序,有的执行确切的游戏逻辑。

                节点通常包括这样几个函数 init() 第一次遍历到该节点  run()每次执行到该节点(每次tick这颗树的时候tick到) exit()离开这个节点(整棵树执行完一次)有的实现还会加一个update(),被run()调用来表示那些多帧操作的行为每次tick到的时候的操作

                节点的run通常返回三种状态 success 完成 fail 失败 running 仍然在运行中(一些需要多帧完成的动作)

                节点一般要存储上一次run之后的返回值状态

                每次遍历到一个节点的时候可以根据节点上次的返回值状态来决定本次run的情况

                节点可能还需要有中止运行的功能

                

               根据节点的run行为主要有以下几种类型的节点:

               ConditionNode:判断一个逻辑,返回T 或 F,T和F分别连接着下一个要遍历的节点,在run里面一般不管上次的返回值状态都会重新做一次判断,以让ai能够实时反馈最新的环境情况。如果本次判断和前次判断有差,则要中止前次分支下的所有节点。

               ActionNode:这通常是一个叶子节点,执行一个程序逻辑。对于一个需要多帧完成的逻辑,在run里面可以根据上次的状态执行每帧操作。

       SequenceNode:他的所有子节点要按顺序完成,即逐个遍历每个子节点,只有当每个节点都返回success自己才能返回success,否则自己返回running,只有前一个自节点返回成功或失败才进行下一个自节点的探测

       SelectorNode:和sequeNode的and操作相反,它是or,它的所有自节点,只要有一个返回success,他自己就返回success,否则自己返回running,只有前一个自节点返回成功或失败才进行下一个自节点的探测

               RandomNode:随机挑一个子节点遍历,run后就返回success,只有一次执行的第一次遍历才会进行判断要遍历的子节点,并记住这个节点,对于后面的遍历直接找到这个子节点遍历。

               Invertor:将子节点的success或fail的返回值取反作为自己的返回值。子节点running自己就running

               Succeeder:子节点无论返回什么,自己都返回succe

               Repeator:重复执行自节点,直到达到指定条件(如执行次数之前)自己都处于running

                当然这些都是常见的一些设计上的模式,我们还可以根据我们的需要定义你需要的节点,还有最重要的一点,你必须有一个好用的图形化的行为树编辑器给策划

               

时间: 2025-01-30 05:26:29

游戏中AI的行为树(Behaviour Tree in Game AI)的相关文章

AI说人“画” | Heart Broken, 游戏中被AI碾压的我们都中了哪些套路?

hello大家好我是vicky,今天呢咱们来说说AI玩游戏的事儿(准确来说,是游戏中的人类是如何被AI碾压的)-- 不久前alphago赢了围棋,openai又赢了dota,太拽了简直!虽然我本人除了狼人杀以外,几本大脑一片空白(别问为啥,那还不是前半生都奉献给了学习?我爱学习,学习是我本命!)-- 咳咳,跑偏了,今天不是讨论小姐姐我是怎么玩游戏的,而是分析一下我们是怎么被AI套路的! 以下将以围棋为主题展开!不知道围棋的小伙伴别着急,你就记着--咱们俩依次放棋子,一直到最后无处可下了,谁占的地

2017年AI在游戏中完胜人类,2060年通吃一切人类任务

2017年,AI在游戏中大获全胜.在过去的12个月里,从古老的围棋到德州扑克,AI越过了一系列新的门槛,最终在各种不同的游戏中击败人类玩家. 围棋 在20世纪90年代后期,一台机器终于击败了国际象棋特级大师.面对挑战,计算机科学家把注意力转移到围棋这个古老的中国游戏上.围棋看起来简单易玩,但却非常复杂. 2015年10月,AlphaGo击败樊麾,成为第一个无需让子即可在19路棋盘上击败围棋职业棋手的电脑围棋程序,写下了历史,相关成果在2016年1月发表于Nature. 2016年的倒数第三天,一

较真你就OVER了!游戏中5大不合常理之处

电视游戏并不是完全地反映了真实生活.在现实生活中,你并不能在树洞里找到钱,你也遇不到一个存档点.但是你拿现实生活中的标准去衡量电视游戏的话,往往都会找到.以下是玩家们经常在游戏里面遇到的5个不可思议之处,我们一起来看下吧. 1.草丛里面能找到钱 身为玩家的你肯定有过只差几个金币就能买到一块新盾牌的经历.这时候玩家脑子里首先想到的一定是去打劫路上的怪物让它们给你掏这个钱,当然了,你还可以作为一个和平人士去剁草砍大树,当你从这些现实中根本不可能掉钱的地方凑齐需要的金币时,相信"靠山吃山靠水吃水&qu

【田渊栋报告】游戏中的人工智能:成就与挑战 | ICML WorkShop(46PPT)

[田渊栋]这次有幸成为了首届VGML(Video Games and Machine Learning)的workshop的受邀演讲嘉宾.以下是流水帐. 我第一个演讲,因为Gabriel的开场白只花了十分钟,所以我有五十分钟,占了点小小的便宜.主要讲了DarkForest,Doom还有最近的ELF的框架.ELF是一个游戏之上的框架,任何游戏或者虚拟环境,只要带有C++接口都可以往里装(现在有Python接口也可以了),而ELF会自动处理并行的问题.ELF收集完了一个batch的游戏数据,就可以交

jquery中EasyUI实现异步树

 前面我们分享了使用jquery中EasyUI实现同步树的代码,本文我们就来看下使用EasyUI实现异步树的方法和示例,希望小伙伴们能够喜欢.     前台使用EasyUI实现 . EasyUI向后台传递一个id参数 . 第一次加载 , 向后台传递的id为null . 之后每次将树节点展开 , 会向后台传递一个当前节点的 id . Control层 :   代码如下: /** * tree */ @RequestMapping(value = "/tree.do") public vo

深入理解游戏中寻路算法

如果你玩过MMOARPG游戏,比如魔兽,你会发现人物行走会很有趣,为了模仿人物行走的真实体验,他们会选择最近路线达到目的地,期间会避开高山或者湖水,绕过箱子或者树林,直到走到你所选定的目的地. 这种看似寻常的寻路在程序实现起来就需要一定的寻路算法来解决,如何在最短时间内找到一条路径最短的路线,这是寻路算法首先要考虑的问题. 在这篇文章中我们会循序渐进来讲解寻路算法是如何演进的,你会看到一种算法从简单到高效所遇到的问题,以及精进的过程,带着问题来阅读,理解更快. 本篇主要包含以下内容: 1.图 2

Docker在英雄联盟游戏中的实践探索(二)

本文讲的是Docker在英雄联盟游戏中的实践探索(二),[编者的话]这篇博客是Riot的Docker实践系列博客的第二篇,主要内容是:基于Cloudbees镜像创建新的Dockerfile,设置了一个日志目录,并介绍了如何使用docker exec命令查看日志文件. 当我一年前开始学习Docker的时候,发现很难找到好的文档和实例,即使是今天,也只能找到一些简单的用例,完全不能用作真正的产品.使用Docker容器来产品化应用,需要适应容器的短暂性和单一进程的特性.这对于需要数据持久化和多进程的应

《Lua游戏AI开发指南》一1.1 AI沙箱简介

1.1 AI沙箱简介 AI沙箱是一个特别设计的软件框架,它摆脱了应用管理.资源处置.内存管理.Lua绑定这些无聊的工作,让你能够立即着手应用Lua进行AI编程.虽然这个沙箱承担了一个小型游戏引擎的工作,但是它的内部结构是完全开放的.本章会详尽描述和解析它的内部代码,以便你在必要时对其进行扩展来获得更多的功能. 我们在设计AI沙箱时使用了一组预先编译好的开放源代码库,用以支持Lua代码实现的AI的快速原型开发和调试.C++代码维护和管理AI数据,而Lua脚本则管理AI的决策逻辑.数据和逻辑的分离使

纸上谈兵: 伸展树 (splay tree)[转]

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!    我们讨论过,树的搜索效率与树的深度有关.二叉搜索树的深度可能为n,这种情况下,每次搜索的复杂度为n的量级.AVL树通过动态平衡树的深度,单次搜索的复杂度为log(n) (以上参考纸上谈兵 AVL树).我们下面看伸展树(splay tree),它对于m次连续搜索操作有很好的效率.   伸展树会在一次搜索后,对树进行一些特殊的操作.这些操作的理念与AVL树有些类似,即通过旋转,