游戏算法-游戏AI状态机,python实现
创始人
2024-05-30 21:50:10
0

AI概述

        游戏AI是对游戏内所有非玩家控制角色的行为进行研究和设计,使得游戏内的单位能够感知周围环境,并做出相应的动作表现的技术。游戏AI作为游戏玩法的一大补充,在各种游戏中都有广泛的应用,比如可以和玩家交互聊天的NPC,按照特定规则寻路的怪物,与玩家进行战斗对抗的机器人等。

目前实现游戏AI的算法有


有限状态机

AI行为树

还有其他比较少用的规则式AI,甚至神经网络等

状态机

基于状态机的游戏AI是实现最简单游戏AI最便捷的方式

基本规则:

  • 状态总数(state)是有限的。
  • 任一时刻,只处在一种状态之中。
  • 某种条件下,会从一种状态转变(transition)到另一种状态。

基本概念:

状态:系统所处的状态,在运行过程中又可以分为当前状态和下一阶段状态;

事件:也可以理解为每一次运行的输入;

条件:根据输入事件执行的

判定条件,条件是基于状态的,当前所处的每一种状态,都可以有自己对应的一套判定条件,来决定下一步进入哪一种状态;

动作:确定切换路径后,执行的附加操作。

用状态机实现游戏AI优缺点:

优点:代码简单、实现快读等优点

缺点:灵活性比较一般。每增加一种状态都要考虑与现有的状态间的跳转关系,当系统的状态数过多时,维护各状态之间的跳转关系会变得非常困难。

由于是采用代码扫描AI逻辑,导致每次修改游戏AI逻辑都需要对状态机代码进行调整。

因此,基于状态机的游戏AI仅适合于一些逻辑简单、固定的游戏AI。

例子:

如上图,游戏一个NPC具有巡逻、攻击、逃跑三种状态

可以用游戏状态机去是实现NPC的AI功能,很简单实现这三种状态的转换

代码设计

状态机基类设计如下,根据上面的概念设计如下,有动作、事件、判断、转换等功能

状态的getNextState里面实现判断转换吗,是否进入下一个状态

动作开始enter和结束exit

class State():name = "状态基类"def enter(self, entity):# 动作,开始passdef exit(self, entity):# 动作,结束passdef event(self, entity):# 事件,当前做的事情passdef getNextState(self, entity):# 条件和判定:判断进入下一个状态pass

伪代码如下:

# coding: utf-8class State():name = "状态基类"def enter(self, entity):# 动作,开始passdef exit(self, entity):# 动作,结束passdef event(self, entity):# 事件,当前做的事情passdef getNextState(self, entity):# 条件和判定:判断进入下一个状态passclass StateRun(State):name = "逃跑"def enter(self, entity):print("开始逃跑")def exit(self, entity):print("结束逃跑")def event(self, entity):print("正在逃跑")def getNextState(self, entity):if "玩家消失":return StatePatrol()elif "玩家挂机":return StateAttack()class StatePatrol(State):name = "巡逻"def enter(self, entity):print("开始巡逻")def exit(self, entity):print("结束巡逻")def event(self, entity):print("正在巡逻")def getNextState(self, entity):if "玩家靠近":return StateAttack()class StateAttack(State):name = "攻击"def enter(self, entity):print("开始攻击")def exit(self, entity):print("结束攻击")def event(self, entity):print("正在攻击"def getNextState(self, entity):if "玩家消失":return StateRun()elif "玩家攻击":return StatePatrol()class Entity():def __init__(self, state):self.state = statedef Manage():def tick(self, entity):next_ob = ob.getNextState(entity)if next_ob:who.state.exit(entity)entity.state = obob.enter(entity)else:ob.event(entity)enity = Entity(StatePatrol())
manage = Manage()manage.tick(entity)
time.sleep(1)
manage.tick(entity)
time.sleep(1)
manage.tick(entity)
time.sleep(1)

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...