两个公司的网站建设,建设工程合同管理的主要内容,主机屋vps网站助手,wordpress 添加js引用参考文章#xff1a;Behavior trees for AI: How they work (gamedeveloper.com) 本文主要参考上述weizProject Zomboid 的开发者 Chris Simpson文章的概念#xff0c;用伪代码实现代码例子 AI概述 游戏AI是对游戏内所有非玩家控制角色的行为进行研究和设计#xff0c;使得游…参考文章Behavior trees for AI: How they work (gamedeveloper.com) 本文主要参考上述weizProject Zomboid 的开发者 Chris Simpson文章的概念用伪代码实现代码例子 AI概述 游戏AI是对游戏内所有非玩家控制角色的行为进行研究和设计使得游戏内的单位能够感知周围环境并做出相应的动作表现的技术。游戏AI作为游戏玩法的一大补充在各种游戏中都有广泛的应用比如可以和玩家交互聊天的NPC按照特定规则寻路的怪物与玩家进行战斗对抗的机器人等。 目前实现游戏AI的算法有
有限状态机
AI行为树
还有其他比较少用的规则式AI甚至神经网络等 行为树AI基本概念 游戏行为树Behavior Trees, BT是一种用于游戏AI的设计模式。它通过模拟行为树来描述AI的行为和决策过程以实现更加智能和自然的游戏AI。
游戏行为树由多个节点组成每个节点代表一个行为或决策。它们按照特定的方式连接在一起形成一个树状结构。在行为树中根节点是AI的起点通过遍历子节点来决策AI的行为。 节点有以下三种状态
成功 success
失败 failure
运行 running 行为树节点有三种主要原型
组合控制节点 -Composite
一种将多个子节点组合在一起的节点用于实现复杂的行为和决策逻辑
主要包括
次序节点-Sequences并行执行多个子节点直到所有子节点都返回True或者任意一个子节点返回False为止
选择节点-Selector按照顺序执行子节点当某个子节点返回success时停止执行并返回success 修饰节点-Decorator
一种特殊的节点它不执行具体的行为或决策而是修饰其它节点的行为或决策
主要包括
逆变节点-Inverter它可以将子节点的结果倒转比如子节点返回了 Failure则这个修饰节点会向上返回 Success以此类推。
重复节点-Repeater重复执行其子节点指定的次数或者一直重复执行直到其子节点返success或者failure 叶节点-Leaf
树的最末端——叶子就是这些 AI 实际上去做事情的命令或者是做一些判断
主要包括
条件节点-Condition判断条件是否满足如果满足则返回success否则返回failure
行为节点-Action执行某个具体的动作或行为例如移动、攻击、使用技能等 节点表示 次序节点 -Walk to Door (Success) -次序节点Running -Open Door (Success) -次序节点运行中 -Walk through Door (Success) -次序节点Running -Close Door (Success) -次序节点Running - 向次序节点的父节点返回 Success。
例如考虑上一节中提到的逆变器装饰器 在功能上与前面的示例相同这里我们展示了如何使用逆变器来否定任何测试从而为您提供一个 NOT 门。这意味着你可以大幅减少测试角色或游戏世界条件所需的节点数量。 三、伪代码实现
节点基类
# 行为树节点基类
class BaseNode(object):def __init__(self):self.status None # 节点的执行结果: 成功 success 失败 failure 运行 runningdef execute(self, who):# 执行pass 叶子节点行为节点
# 叶子节点-行为节点吃食物
class EatFoodNode(BaseNode):def __init__(self, target):super(EatFoodNode).__init__()self.target target # 食物目标def execute(self, who):# 吃食物# who.eat_foot(self.target)self.status success# 叶子节点-行为节点打开门
class OpenDoorNode(BaseNode):def __init__(self, target):super(OpenDoorNode).__init__()self.target target # 打开目标def execute(self, who):# 执行打开门动作# who.open_door(self.target)self.status success
叶子节点条件节点 # 叶子节点-条件节点检查是否饥饿
class CheckHungryNode(BaseNode):def __init__(self, hungry_val):super(CheckHungryNode).__init__()self.hungry_val hungry_val # 生命值阈值def execute(self, who):# 检查生命值是否小于阈值if self.hungry_val who.hungry_val:self.status successelse:self.status failure# 叶子节点-条件节点检查是否有食物
class CheckHasFoodNode(BaseNode):def __init__(self, food):super(CheckHasFoodNode).__init__()self.food food # 目标食物def execute(self, who):# 检查目标距离是否小于最大距离if who.has_food(self.food):self.status successelse:self.status failure# 叶子节点-条件节点敌人是否在周围
class CheckEnemiesAroundNode(BaseNode):def __init__(self, enemies):super(CheckEnemiesAroundNode).__init__()self.enemies enemies # 敌人def execute(self, who):# 敌人是否在周围if who.AroundHasEnemies(self.enemies):self.status successelse:self.status failure 组合控制节点序列节点
# 组合控制节点序列节点
class SequenceNode(BaseNode):def __init__(self, children):super(SequenceNode).__init__()self.children children # 子节点列表def execute(self, who):for child in self.children:child.execute(who)if child.status failure:self.status failurereturnself.status success
组合控制节点选择节点
# 组合控制节点选择节点
class SelectorNode(BaseNode):def __init__(self, children):super(SelectorNode).__init__()self.children childrendef execute(self, who):for child in self.children:child.execute(who)if child.status success:self.status successreturnself.status failure 装饰节点逆变节点
# 装饰节点逆变节点
class NOT_DecoratorNode(BaseNode):def __init__(self, child):super(DecoratorNOT).__init__()self.child childdef execute(self, who): status self.child.execute(who)if status successself.status failureelif status failure:self.status success 例子一 饥饿的时候且有食物的时候没有敌人在周围就吃食物
# 角色对象
class Player(object):def __init__(self):self.hungry_val 0 # 饥饿度self.food fish # 食物def main():# 首先定义行为树的结构root SequenceNode([# 饥饿的时候CheckHungryNode(50),# 有鱼时候CheckHasFoodNode(fish),# 敌人不在周围NOT_DecoratorNode(CheckEnemiesAroundNode(李宏伟)),# 老墨吃鱼EatFoodNode(fish),])who Player()# 然后在主循环中执行行为树while True:# 执行行为树root.execute(who)# 根据行为执行结果更新状态if root.status success:who.hungry_val random.randint(1, 100)who.food random.randint(1, 100)# 等待一段时间后再次执行行为树time.sleep(1) 例子二 # 行为树的结构如下root SequenceNode([WalkToDoor(),SelectorNode([OpenDoor(),SequenceNode([UnlockDoor(),OpenDoor(self),]),SmashDoor(),]),WalkThroughDoor(),CloseDoor(), ])