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

news2025/7/8 1:45:18

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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/396528.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用户体验设计—影响定制化设计的因素

0 前言最近在上信息构建这门课(名为信息构建,但感觉叫用户体验设计更好。。。)老师是研究信息行为、人智交互这块的,所以实验课要求我们先学习一个实际的设计案例,让我们搞懂影响定制化设计的因素。所以这篇文章讲讲我…

七色电子标签

机种名 电子会议桌牌 型号 ESL_7color_7.3_D 外观尺寸 176.2x137.15x80mm 产品重量 268g 可视区域 163.297.92mm 外观颜色 银色 供电方式 锂电池供电2300mAh(Type-C 接口可充电) 显示技术 E-INK电子纸,双屏 像素 800x480 像…

ByteTrack: Multi-Object Tracking by Associating Every Detection Box 论文详细解读

ByteTrack: Multi-Object Tracking by Associating Every Detection Box 论文详细解读 文章目录ByteTrack: Multi-Object Tracking by Associating Every Detection Box 论文详细解读ByteTrackByteTrack算法简介ByteTrack算法流程ByteTrack算法描述一:对检测框进行分…

SOA架构的理解

1. SOA概述 SOA(Service-Oriented Architecture,面向服务的架构)是一种在计算机环境中设计、开发、部署和管理离散模型的方法。SOA不是一种新鲜事物,它是在企业内部IT系统重复构建以及效率低下的背景下提出的。在SOA模型中&#x…

Nexus 3 清理docker镜像

该文章提供了一种清理nexus3中存储的docker镜像的一种新思路 查看docker repo 比如你的docker repo名字叫做test-repo,然后在nexus3首页的seatch下面找到docker,点进去随便查看一个已经上传的镜像 记住上面的Name选项,之后要用到 设定清理…

centos7 oracle19c安装||新建用户|| ORA-01012: not logged on

总共分三步 1.下载安装包:里面有一份详细的安装教程 链接:https://pan.baidu.com/s/1Of2a72pNLZ-DDIWKrTQfLw?pwd8NAx 提取码:8NAx 2.安装后,执行初始化:时间较长 /etc/init.d/oracledb_ORCLCDB-19c configure 3.配置环境变量,不配置环境变量,sq…

【Linux快速入门】文件目录操作

文章目录概念1. Linux文件系统概述2. Linux文件目录结构3. Linux文件和目录操作3.1 文件操作3.1.1 创建文件3.1.2 复制文件3.1.3 移动文件3.1.4 删除文件3.1.5 查看文件3.1.6 输出指令3.1.7 >和>>指令3.2 目录操作3.2.1 创建目录3.2.2 复制目录3.2.3 移动目录3.2.4 删…

Lesson 8.3 ID3、C4.5 决策树的建模流程 Lesson 8.4 CART 回归树的建模流程与 sklearn 参数详解

文章目录一、ID3 决策树的基本建模流程二、C4.5 决策树的基本建模流程1. 信息值(information value)2. C4.5 的连续变量处理方法三、CART 回归树的基本建模流程1. 数据准备2. 生成备选规则3. 挑选规则4. 进行多轮迭代5. 回归树的预测过程四、CART 回归树…

关于推荐系统的详细介绍

简介推荐系统是一种信息过滤系统,能够自动预测用户对特定产品或服务的偏好,并向其提供个性化的推荐。它通常基于用户的历史行为、个人喜好、兴趣和偏好等,通过数据挖掘和机器学习算法,在大数据的支持下生成个性化的推荐内容&#…

智云通CRM:与权力者沟通的策略有哪些?

权力者通常具备两个特点:忙和目标导向 1.忙 权力者都很忙(不忙也会装出很忙的样子),时间精力有限,销售人员眼里的大项目在权力者看来很有可能只是他诸多工作中的一项。因此,即使有不满者的引荐,…

ChatGPT露馅了,它明明就是人

让人工智能理解句子成分和语义,这看起来是件不可能的事,看过流浪地球的都知道,那里面的人工智能哪怕发展到2057年,也听不懂比喻和反问。 那最近大火的chatGPT能不能听懂冷笑话呢?它不仅能写代码、论文,居然…

Spring学习——拦截器

拦截器概念 拦截器(Interceptor )是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行作用: 在指定的方法调用前后执行预先设定的代码阻止原始方法的执行 拦截器与过滤器区别 归属不同:Filter属于Servlet技术&#xff0…

[oeasy]python0101_尾声_PC_wintel_8080_诸神的黄昏_arm_riscv

尾声 回忆上次内容 回顾了 ibm 使用开放架构 用 pc兼容机 战胜了 dec 小型机apple 个人电脑 触击牺牲打 也破掉了 自己 软硬一体全自主的 金身 借助了 各种 软硬件厂商的 力量 最终完成了 pc架构上 的 大一统 操作系统层面 IBM 计划让 msdos和cp/m 分庭抗礼为什么 最后微软…

NC xml配置文件不能生产java文件

在NC开发过程中,新增、或修改了xml文件,在开发工具eclipse中生成或重新生成Java文件,发现生成不了相对应的Java文件。如下图,选中xml文件后,右键点击SpringXml to Java 这种情况其实一般都是xml配置文件有问题&#…

敏捷项目管理的概念,以及与传统项目管理的区别

较之瀑布等传统项目管理模式,敏捷是“适应性的”,而非“预设性的”。团队采用敏捷项目管理可以提高交付速度、协作效率、以及响应市场变化的能力。在这里向大家详细介绍敏捷项目管理的定义、与传统项目管理的区别,以及一些主流的敏捷项目框架…

下一代ERP系统是什么样的呢?什么是智能化ERP系统?AI能改变ERP系统吗?

下一代ERP系统是什么样的呢?什么是智能化ERP系统?AI能改变ERP系统吗?导读1. 用户体验:2. 作业、分析和智能一体化2.1 ERP之采购管理:2.2 ERP之零售商品管理:2.3 ERP之会计和财务管理3. 系统处理大数据导读 …

嵌入式Linux从入门到精通之第十六节:U-boot分析

简介 u-boot最初是由PPCBoot发展而来的,可以引导多种操作系统、支持多种架构的CPU,它对PowerPC系列处理器的支持最为完善,而操作系统则对Linux系统的支持最好目前已成为Armboot和PPCboot的替代品。 特点: 主要支持操作系统:Linux、NetBSD、 VxWorks、QNX、RTEMS、ARTOS、L…

Vue3分页器(Pagination)

自定义传入: 当前页数(current),默认为1每页条数(pageSize),默认为10只有一页时是否隐藏分页器(hideOnSinglePage),默认为false数据总数(total&a…

Java进阶(下篇2)

Java进阶(下篇2)一、IO流01.File类的使用1.1、File类的实例化1.2、File类的常用方法11.3、File类的常用方法21.4、课后练习02、IO流原理及流的分类2.1、IO流原理2.2、流的分类2.3、IO 流体系03、节点流(或文件流)3.1、FileReader读入数据的基本操作3.2、…

Linux应用学习——多线程

多线程 PART1——线程相关概念 ​ 线程时参与系统调度的最小单位。被包含在进程之中,是进程中的实际运行单位。一个进程可以创建多个线程,多个线程实现并发运行,每个线程执行不同的任务。 线程时最基本的运行单位,而进程不能运行…