游戏AI的创造思路-技术基础-决策树(2)
上一篇写了决策树的基础概念和一些简单例子,本篇将着重在实际案例上进行说明
目录
8. 决策树应用的实际例子
8.1. 方法和过程
8.1.1. 定义行为
8.1.2. 确定属性
8.1.3. 构建决策树
8.1.4. 实施行为
8.1.5. 实时更新
8.2. Python代码
8. 决策树应用的实际例子
模拟空战游戏中,AI使用决策树算法,控制多个NPC敌方战机协同攻击玩家。
8.1. 方法和过程
8.1.1. 定义行为
敌方战机可能的行为包括:进攻、防守、掩护、撤退等。
8.1.2. 确定属性
影响决策的属性可能包括:
敌方战机的数量、位置、速度、武器状态
玩家战机的位置、速度、武器状态等
8.1.3. 构建决策树
根据属性构建决策节点,例如:
- 如果敌方战机数量大于玩家,且敌方战机位置靠近玩家,则选择进攻。
- 如果敌方战机数量少于玩家,且敌方战机位置分散,则选择掩护和撤退。
- 如果敌方战机有优势武器,则选择优先使用优势武器进攻。
- 考虑敌机的武器状态和剩余弹药:在决定使用哪种武器进攻时,应该考虑武器的可用性和剩余弹药。
- 考虑盟友和敌人的位置:在决定行动时,应该考虑盟友和敌人的相对位置,以避免友军伤害和优先攻击较弱的敌人。
- 增加撤退逻辑:当敌机健康状态很低时,应该优先考虑撤退而不是进攻。
- 引入随机性:在决策过程中引入一些随机性,使得敌机的行为更加难以预测。
- 优化机动规避逻辑:机动规避时,应该考虑玩家的位置和速度,以便更有效地规避攻击。
- 协同策略:
- 制定敌方战机之间的协同策略,例如:
- 分配攻击目标,确保每架敌方战机都有明确的攻击对象。
- 制定掩护策略,保护处于劣势的战机。
- 制定撤退策略,当战机受损严重时撤退。
8.1.4. 实施行为
根据决策树的结果,敌方战机执行相应的行为。
8.1.5. 实时更新
战场环境是实时变化的,因此需要不断更新属性,并重新进行决策。
8.2. Python代码
在这个实现中,EnemyFighter
类代表敌方战机,具有ID、位置、速度和武器状态等属性。
EnemyFighter
类中的health
属性用来表示敌方战机的健康状态。decide_action
方法现在考虑了更多的因素,包括战机的健康状态、与玩家的距离、敌方和盟友的数量,以及武器的状态。
EnemyFighter
类的position
属性现在是一个三维坐标。distance_to
方法用于计算三维空间中的距离。
EnemyFighter
类的evade
方法,用于进行机动规避、加速,并快速改变自身所在位置。
decide_action
方法现在会在距离目标小于23000时调用evade
方法,并执行相应的规避动作。
EnemyFighter
类用choose_weapon
方法来根据距离选择合适的武器,并且在decide_action
方法中考虑了武器的可用性和剩余弹药。
最后,我们模拟了一个战场环境,并让每架敌方战机做出决策。
以下上代码
import math
import random class EnemyFighter: def __init__(self, id, position, speed, weapon_status, health, ammo): self.id = id self.position = position # (x, y, z) self.speed = speed self.weapon_status = weapon_status # 字典,包含武器名称和状态 self.health = health self.ammo = ammo # 字典,包含武器名称和剩余弹药 def distance_to(self, other_position): return math.sqrt((self.position[0] - other_position[0])**2 + (self.position[1] - other_position[1])**2 + (self.position[2] - other_position[2])**2) def choose_weapon(self, distance_to_player): available_weapons = [weapon for weapon, status in self.weapon_status.items() if status == "可用"] if not available_weapons: return None # 根据距离选择合适的武器 if distance_to_player <= 500: return "机炮" elif 500 < distance_to_player <= 5000: return "近距空空弹" elif 5000 < distance_to_player <= 23000: return "中距空空弹" elif 23000 < distance_to_player <= 100000: return "远程空空弹" return None def evade(self, player_position): max_evade_distance = 500 evade_direction = (random.uniform(-1, 1), random.uniform(-1, 1), random.uniform(-1, 1)) evade_distance = random.uniform(0, max_evade_distance) self.position = ( self.position[0] + evade_direction[0] * evade_distance, self.position[1] + evade_direction[1] * evade_distance, self.position[2] + evade_direction[2] * evade_distance ) self.speed *= 1.5 def decide_action(self, player_position, allies, enemies): if self.health < 30: return "撤退" distance_to_player = self.distance_to(player_position) weapon = self.choose_weapon(distance_to_player) if distance_to_player < 23000: self.evade(player_position) return "机动规避,加速,并快速改变位置" if weapon: if self.ammo[weapon] > 0: return f"使用{weapon}进攻" else: return "武器弹药耗尽,寻找补给或撤退" return "等待时机接近目标或寻找其他敌人" # 模拟战场环境
player_position = (5000, 5000, 0)
enemies = [ EnemyFighter(1, position=(1000, 1000, 0), speed=100, weapon_status="全武器可用", health=100), EnemyFighter(2, position=(1500, 1500, 0), speed=120, weapon_status="全武器可用", health=80), EnemyFighter(3, position=(2000, 2000, 0), speed=110, weapon_status="全武器可用", health=60)
]
allies = [ EnemyFighter(4, position=(3000, 3000, 0), speed=100, weapon_status="全武器可用", health=100), EnemyFighter(5, position=(3500, 3500, 0), speed=100, weapon_status="全武器可用", health=90)
] # 敌方战机做出决策
for enemy in enemies: action = enemy.decide_action(player_position, allies, enemies) print(f"敌方战机{enemy.id}(位置:{enemy.position},健康:{enemy.health})决定:{action}")
相关文章:

游戏AI的创造思路-技术基础-决策树(2)
上一篇写了决策树的基础概念和一些简单例子,本篇将着重在实际案例上进行说明 目录 8. 决策树应用的实际例子 8.1. 方法和过程 8.1.1. 定义行为 8.1.2. 确定属性 8.1.3. 构建决策树 8.1.4. 实施行为 8.1.5. 实时更新 8.2. Python代码 8. 决策树应用的实际例子…...

vue缓存页面,当tab切换时保留原有的查询条件
需求: 切换tab时,查询条件不变 路由页面: 单个页面上加这句话:...
PythonConda系列(亲测有效):【解决方案】Collecting package metadata (current_repodata.json): failed
【解决方案】Collecting package metadata (current_repodata.json): failed 问题描述解决方案小结参考文献 问题描述 在cmd下运行:conda install pylint -y,报错如下: C:\Users\apr> conda install --name apr pylint -y Co…...

web前端开发——标签一(注释、标题、段落、换行、格式、图片)
今天我来针对web前端开发讲解标签一 目录 html标签_标题&段落&换行 注释标签:Ctrl/ 标题标签: h1-h6 段落标签: 换行标签: 格式标签 图片标签_src属性 html标签_标题&段落&换行 注释标签:Ctrl/ Ctrl/ &…...
Django 常见的操作符
在filter() 方法,exclude() 方法中使用大于,小于,模糊匹配等操作符。 常见的操作符如下: 操作符含义示例等于Book.objects.filter(price10)! 或 __ne不等于用于查找字段不等于特定值的记录。但更常用exclude()方法。__gt大于用于…...
AJAX是什么?原生语法格式?jQuery提供分装好的AJAX有什么区别?
ajax 的全称 Asynchronous JavaScript and XML (异步 JavaScript 和 XML)。 AJAX是一种创建交互式网页应用的网页开发技术。其中最核心的依赖是浏览器提供的 XMLHttpRequest 对象,是这个对象使得浏览器可以发出 HTTP 请求与接收 HTTP 响应。实现了在页 面不刷新的…...

docker基础知识以及windows上的docker desktop 安装
记录以供备忘 基础概念: 什么是docker 将程序和环境一起打包,以在不同操作系统上运行的工具软件 什么是基础镜像 选一个基础操作系统和语言后,将对应的文件系统、依赖库、配置等打包为一个类似压缩包的文件,就是基础镜像 什么是…...

【深度学习基础】环境搭建 linux系统下安装pytorch
目录 一、anaconda 安装二、创建pytorch1. 创建pytorch环境:2. 激活环境3. 下载安装pytorch包4. 检查是否安装成功 一、anaconda 安装 具体的安装说明可以参考我的另外一篇文章【环境搭建】Linux报错bash: conda: command not found… 二、创建pytorch 1. 创建py…...

【Sql Server】sql server 2019设置远程访问,外网服务器需要设置好安全组入方向规则
大家好,我是全栈小5,欢迎来到《小5讲堂》。 这是《Sql Server》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 前言1、无法链接…...

idea启动vue项目一直卡死在51%,问题分析及其如何解决
如果你的项目也一直卡在百分之几十,你可以参考下面的方法,试一试能否解决 问题描述: 通过在idea终端中输入命令 npm run serve 启动vue项目,启动进程一直卡在51% 如何解决: 检查 < template > 标签中的html内容…...
基于STM32设计的智能喂养系统(ESP8266+微信小程序)175
基于STM32设计的牛羊喂养系统(微信小程序)(175) 文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】项目硬件模块组成【3】ESP8266工作模式配置【4】上位机开发【5】项目模块划分1.2 项目功能需求1.3 项目开发背景1.4 开发工具的选择1.5 系统框架图1.6 系统原理图1.7 硬件实…...
第三方支付平台如何完美契合游戏行业?
在数字经济的浪潮中,游戏行业以其独特的魅力和创新能力,成为全球文化和经济交流的重要桥梁。然而,海外游戏商在进军中国市场时,常面临一系列难题。本文将通过一个故事案例,揭示第三方支付平台PASSTO PAY如何帮助海外游…...
计算机网络 5.6网桥与交换机
第六节 网桥与交换机 一、认识网桥 1.功能:连接两个具有相同或相似的网络结构的网络,解决网络之间距离太远问题,提高网络可靠性,还可以起过滤帧的作用而提高网络的性能。 2.适用场合:同构网。 3.特点: …...

CDH实操--集群卸载
作者:耀灵 1、停止正在运行的服务 a、控制台停止集群服务 b、控制台停止Cloudera Management Service c、命令行停止cm服务 systemctl stop cloudera-scm-agent #所有节点执行 systemctl stop cloudera-scm-server #cdh01节点执行2、主线并移除Parcles rm -r…...

5G RedCap调查报告
一、5G RedCap技术背景 5G RedCap(Reduced Capability缩写,轻量化5G),是3GPP标准化组织定义下的5G裁剪版本,是5G面向中高速率连接场景的物联网技术,它的能力介于5G NR(含eMBB和uRLLC)和LPWA(如LTE-M和NR-IoT)之间,如图1所示,是5G-A(5G Advanced)的关键技术之一。…...
模型(卷积、fc、attention)计算量 MAC/FLOPs 的手动统计方法
文章目录 简介背景为什么理解神经网络中的MAC和FLOPs很重要?资源效率内存效率能耗功耗效率 模型优化性能基准研究与发展 FLOPs 和 MACs 定义1. 全连接层 FLOPs 计算步骤 1:识别层参数步骤 2:计算 FLOPs 和 MACs步骤 3:总结结果使用…...

Git 删除包含敏感数据的历史记录及敏感文件
环境 Windows 10 Git 2.41.0 首先备份你需要删除的文件(如果还需要的话),因为命令会将本地也删除将项目中修改的内容撤回或直接提交到仓库中(有修改内容无法提交) 会提示Cannot rewrite branches: You have unstaged …...
vue-tabs标签页引入其他页面
tabs页面 <template> <div class"app-container"> <el-tabs v-model"activeName" type"card" tab-click"handleClick"> <el-tab-pane label"套餐用户列表" name"first"> <user-list r…...

U-net和U²-Net网络详解
目录 U-Net: Convolutional Networks for Biomedical Image Segmentation摘要U-net网络结构pixel-wise loss weight U-Net: Going Deeper with Nested U-Structure for Salient Object Detection摘要网络结构详解整体结构RSU-n结构RSU-4F结构saliency map fusion module -- 显著…...

Vue3 引入腾讯地图 包含标注简易操作
1. 引入腾讯地图API JavaScript API | 腾讯位置服务 (qq.com) 首先在官网注册账号 并正确获取并配置key后 找到合适的引入方式 本文不涉及版本操作和附加库 据体引入参数参考如下图 具体以链接中官方参数为准标题 在项目根目录 index.html 中 写入如下代码 <!-- 引入腾…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...

macOS 终端智能代理检测
🧠 终端智能代理检测:自动判断是否需要设置代理访问 GitHub 在开发中,使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新,例如: fatal: unable to access https://github.com/ohmyzsh/oh…...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...