游戏算法-游戏AI状态机,python实现

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):
		# 动作,开始
        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)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python玩转飞大战小游戏是一个非常有趣的毕业设计项目。下面是一些可能用到的方法和技术: 1. 游戏引擎:可以使用Pygame或者Pyglet等Python游戏开发库来创建游戏窗口、处理用户输入、绘制图形等。 2. 游戏循环:使用游戏循环来控制游戏的进行,包括更新游戏状态、处理碰撞检测、绘制游戏画面等。 3. 精灵和动画:使用精灵来表示游戏中的各个角色和物体,通过更新精灵的位置和状态实现动画效果。 4. 碰撞检测:使用碰撞检测算法来判断游戏中的角色和物体是否发生碰撞,例如矩形碰撞检测或者像素级碰撞检测。 5. 音效和音乐:通过使用Pygame的音频模块来添加游戏音效和背景音乐,增强游戏的娱乐性。 6. 关卡设计:设计多个关卡,每个关卡的难度逐渐增加,包括敌人数量、速度、攻击方式等的变化。 7. 计分系统:设计一个计分系统来记录玩家的得分,例如击败敌人、收集道具等可以增加得分。 8. 用户界面:设计一个简洁美观的用户界面,包括开始菜单、游戏设置、游戏结束等。 9. 存档和排行榜:可以添加存档和排行榜功能,让玩家可以保存游戏进度或者比较自己的成绩。 10. AI敌人:如果想增加游戏的难度,可以设计一些具有智能行为的AI敌人,例如追踪玩家、躲避子弹等。 希望以上方法对你的毕业设计有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值