游戏AI是对游戏内所有非玩家控制角色的行为进行研究和设计,使得游戏内的单位能够感知周围环境,并做出相应的动作表现的技术。游戏AI作为游戏玩法的一大补充,在各种游戏中都有广泛的应用,比如可以和玩家交互聊天的NPC,按照特定规则寻路的怪物,与玩家进行战斗对抗的机器人等。
有限状态机
AI行为树
还有其他比较少用的规则式AI,甚至神经网络等
基于状态机的游戏AI是实现最简单游戏AI最便捷的方式
状态:系统所处的状态,在运行过程中又可以分为当前状态和下一阶段状态;
事件:也可以理解为每一次运行的输入;
条件:根据输入事件执行的
判定条件,条件是基于状态的,当前所处的每一种状态,都可以有自己对应的一套判定条件,来决定下一步进入哪一种状态;
动作:确定切换路径后,执行的附加操作。
优点:代码简单、实现快读等优点
缺点:灵活性比较一般。每增加一种状态都要考虑与现有的状态间的跳转关系,当系统的状态数过多时,维护各状态之间的跳转关系会变得非常困难。
由于是采用代码扫描AI逻辑,导致每次修改游戏AI逻辑都需要对状态机代码进行调整。
因此,基于状态机的游戏AI仅适合于一些逻辑简单、固定的游戏AI。
如上图,游戏一个NPC具有巡逻、攻击、逃跑三种状态
可以用游戏状态机去是实现NPC的AI功能,很简单实现这三种状态的转换
状态机基类设计如下,根据上面的概念设计如下,有动作、事件、判断、转换等功能
状态的getNextState里面实现判断转换吗,是否进入下一个状态
动作开始enter和结束exit
class State():
name = "状态基类"
def enter(self, entity):
# 动作,开始
pass
def exit(self, entity):
# 动作,结束
pass
def event(self, entity):
# 事件,当前做的事情
pass
def getNextState(self, entity):
# 条件和判定:判断进入下一个状态
pass
伪代码如下:
# coding: utf-8
class State():
name = "状态基类"
def enter(self, entity):
# 动作,开始
pass
def exit(self, entity):
# 动作,结束
pass
def event(self, entity):
# 事件,当前做的事情
pass
def getNextState(self, entity):
# 条件和判定:判断进入下一个状态
pass
class 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 = state
def Manage():
def tick(self, entity):
next_ob = ob.getNextState(entity)
if next_ob:
who.state.exit(entity)
entity.state = ob
ob.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)