Godot游戏开发实践之四

一、前言

在之前的几篇文章里我简单地介绍了 AI 寻路方式以及 Resource 的相关应用,那其实都是为这篇文章做铺垫的,本篇的内容是基于油管上一个比较老的 Unity AI 系列教程: Unity tutorial: Pluggable AI With Scriptable Objects ,教程详细介绍了 Unity 中如何实现可插拨式 AI 的功能,在我的一番苦苦研究下,硬生生地把它给搬运到了 Godot 中,搬运过程可谓是费了九牛二虎之力,这其中一部分原因是由于自己对 Godot API 的熟练程度不够,另一方面则是 Godot 本身的一些缺陷,这些我都会在本文中提出来。

Unity tutorial: Pluggable AI With Scriptable Objects

因为 Unity 中的 ScriptObject 在 Godot 中相当于 Resource ,如果不是很熟悉,推荐大家阅读我的上一篇文章: Godot游戏开发实践之三:容易被忽视的Resource 。另外,搬用并等于照抄,本 Demo 实现的部分 AI 功能使用的是我自己的方式,这也在我之前的文章里有详细介绍: Godot游戏开发实践之二:AI之寻路新方式。

说明:我不会很详细的讲述如何实现某些特定功能,所以推荐大家观看原 Unity 视频,如果上油管不方便,也请放心,视频教程我已经搬运到我的网盘,分享链接请关注我的公众号,回复 AI教程 即可(友情提示:套路……),哈哈。

主要内容: 无
阅读时间: 12 分钟
永久链接: http://liuqingwen.me/2020/09/08/godot-game-devLog-4-translate-pluggable-AI-tutorial-from-unity-to-godot/
系列主页: http://liuqingwen.me/introduction-of-godot-series/

二、正文

除了参考原视频教程,也可以克隆本 Demo 的源码,我已经上传到 Github ,供有兴趣的同学参考。

Godot Pluggable AI

什么是可插拨AI

所谓可插拨其实和安装插件、热插拨等概念类似,就是可以随意添加或者删除某个功能,通过直接拖拽就能组成复杂的 AI 体系而无须手动重复编写代码,在 Unity 中使用的是 ScriptableObject 而 Godot 中即 Resource :

拖拽赋值

其实在编辑器方面, Unity 使用起来比 Godot 舒服多了。 😂

先说Godot的问题

搬运这个 AI 教程的时候,我反反复复、仔仔细细研究了很多次,在按步照搬的过程中出现了一个非常奇怪且头疼的问题:游戏无症状、无征兆地闪退

代码看上去没问题,按下 F5 运行游戏,窗口还没显示就马上停止运行,连错误提示都没有。曾经因为这个错误我一度想着放弃算了,但是转念一想, Godot 开发者岂能低头?! 所以我继续尝试,寻找错误原因,探索可行的解决方案,从至少能正常运行开始一步一步添加相关功能,最终发现了闪退的罪魁祸首: Circular reference to resource循环引用报错,这在我之前的文章中已经聊过,也有朋友遇到过类似的问题,错误信息大概是:

“scene/resources/resource_format_text.cpp:1387 - Circular reference to resource being saved found: ‘res://src/Resources/States/???.tres’ will be null next time it’s loaded.”

哪来的循环引用呢?熟悉游戏结构你就会感觉到这是很显然的:在我的游戏中有很多 Resource 资源类,比如 Action/Decision/State/Transitions 等,而这些资源相互之间或多或少发生了一些引用,就像 PatrolChaser 中引用了 ChaseChaser ,反过来 ChaseChaser 又引用 PatrolChaser 从而造成循环引用链,甚至还有更加复杂的、难以发觉的、千丝万缕的引用关系蕴含其中:

Alert Scanner -> Patrol Scanner -> Chase Scanner -> Alert Scanner -> Chase Scanner -> Alert Scanner -> …

在编程语言里这些引用再正常不过,但是 Godot 3 还不能正常处理循环引用,这会在 4.0 中进行修复,我可不想等到明年春天了,最终解决方式是放弃部分插拨功能,对一些参数不采用推拽赋值的方式,取而代之的是在运行时判断对应资源是否为 null 再决定动态加载进行赋值,这就造成了需要额外的一个变量用来指向对应 Resource 文件的路径:

使用路径动态赋值

主要代码如下:

# trueState 和 falseState 可以为 null
# 如果为 null 则使用对应的文件路径进行动态加载
func _checkTransitions(controller : StateController) -> void:for transition in transitions:var decisionSucceeded : bool = transition.decision.decide(controller)if decisionSucceeded:var trueState = transition.trueStateif trueState == null:  # 如果置空则动态加载一次trueState = load(transition.trueStateResource)transition.trueState = trueStatecontroller.transitionToState(trueState)else:var falseState = transition.falseStateif falseState == null:  # 如果置空则动态加载一次falseState = load(transition.falseStateResource)transition.falseState = falseStatecontroller.transitionToState(falseState)

除此之外,还有一个不忍直视的问题是在编辑器中显示资源值的视图,一旦涉及多个参数、多种类型、多个级别的资源混合在一起,那么他们之间的层级关系在属性面板中变得极其难以辨别,感同身受一下这张慢动图所带来的崩溃心情吧:

复杂的变量关系属性图

嗯,此刻的我心中万马奔腾,无限次奔溃闪退并自动重启中……

AI结构分析

如果你看完了整个视频教程,你会发现这个 AI 系统的几个重要部件:

  • Action 表示动作,比如巡逻、射击等动作的控制实现
  • Decision 表示策略行为的决定,即状态之间进行切换的依据
  • State 表示状态,一个状态即一种 AI 行为,不同状态之间根据决定进行切换
  • Transition 包装了两个状态(正反状态),以及状态发生转换的决定

他们之间的关系图,以及主要的行为类:

AI关系图

Action 父类代码:

extends Resource
class_name AbstractAction, 'res://assets/icons/action-icon.svg'export var debugDrawColor := Color.black # 颜色显示,Debug用
export var resourceName := 'Action'      # 名字,Debug用# 动作的行为方法,每帧都会调用
func act(controller : StateController) -> void:pass

Decision 父类代码:

extends Resource
class_name AbstractDecision, 'res://assets/icons/decision-icon.svg'export var debugDrawColor := Color.white # 颜色显示,Debug用
export var resourceName := 'Decision'    # 名字,Debug用# 决定的方法,包装在 Transition 中,每帧都会调用
# 返回结果决定了切换到的状态
func decide(controller : StateController) -> bool:return false

State 状态类代码:

extends Resource
class_name State, 'res://assets/icons/state-icon.svg'export(Array, Resource) var actions = []       # 当前状态下所有动作集合
export(Array, Resource) var transitions = []   # 所有的状态转换机制集合
export var debugStateColor := Color.green      # 颜色显示,Debug用# 每帧执行状态更新
func updateState(controller : StateController) -> void:_doActions(controller)_checkTransitions(controller)# 循环执行所有动作
func _doActions(controller : StateController) -> void:for action in actions:action.act(controller)# 检查每一个转换机制,是否可以进行状态转换
func _checkTransitions(controller : StateController) -> void:# 代码参考上文# 省略……

控制器 Controller 和过渡机制 Transition 的代码就不贴了,控制器中代码都是一些基本状态和控制操作的实现。这里我把视频中介绍的所有 AI 类型例举如下:

Chase Chaser: {Actions: [ChaseAction, AttackAction],Transitions: {Decision: ActiveStateDecision, TrueState: Remain State, FalseState: Patrol Chaser}
}
Patrol Chaser: {Actions: [PatrolAction],Transitions: {Decision: LookDecision, TrueState: Chase Chaser, FalseState: Remain State}
}
Chase Scanner: {Actions: [ChaseAction, AttackAction],Transitions: {Decision: LookDecision, TrueState: Remain State, FalseState: Alert Scanner}
}
Patrol Scanner: {Actions: [PatrolAction],Transitions: {Decision: LookDecision, TrueState: Chase Scanner, FalseState: Remain State}
}
Alert Scanner: {Actions: [],Transitions: [{Decision: ScanDecision, TrueState: Patrol Scanner, FalseState: Remain State}, {Decision: LookDecision, TrueState: Chase Scanner, FalseState: Remain State}]
}

当然,这个 AI 系统绝不局限于此,你完全可以组合出更多 AI 状态,也可以添加你心目中所要实现的其他动作、决定、过渡和状态类,丰富这个强大的 AI 系统。

其他小功能简介

最后,游戏中使用的一些小技巧我也在本篇中简单介绍一下,包括:炸弹的范围伤害、相机自动跟踪、子弹高度模拟等。

炸弹范围伤害

炸弹范围伤害

从图中可以看出,我使用了指数级的衰减函数,也就是说距离炸弹爆炸中心越远,伤害衰减的越厉害,个人认为要符合现实一些,当然你完全可以使用简单的线性函数,伤害和距离成反比,这取决于你自己以及游戏机制的设计:

# 伤害最大范围
onready var damageRange : float = $CollisionShape2D.shape.radiusfunc _on_Explosion_body_entered(body: Node) -> void:if body.has_method('damaged'):var vector : Vector2 = body.global_position - self.global_position# 指数系数var ratio : float = 1.0 - pow(vector.length() / damageRange, 0.6)# 伤害和冲击力var damage := ceil(maxDamage * ratio)var force : Vector2 = maxForce * ratio * vector.normalized()body.damaged(damage, force)

相机自动跟踪

在本示例中我使用了相机自动跟踪的效果。

因为类似于多人游戏,使用相机进行跟踪是有必要的,这样可以保证所有的坦克、玩家都在当前视野中。实现起来不难,根据当前玩家数量以及玩家的位置计算最大边距以及中心点,然后移动并设置相机的缩放即可:

# 窗口大小
onready var _windowSize := self.get_viewport_rect().size
# 跟踪的目标
var targets := []func _process(delta: float) -> void:if targets.size() <= 1:_camera.zoom = lerp(_camera.zoom, Vector2.ONE, 2.0 * delta)returnvar minPos := _windowSize  # 最小位置点var maxPos := Vector2.ZERO # 最大位置点for target in targets:if ! is_instance_valid(target):continueif target.global_position.x < minPos.x:minPos.x = target.global_position.xif target.global_position.x > maxPos.x:maxPos.x = target.global_position.xif target.global_position.y < minPos.y:minPos.y = target.global_position.yif target.global_position.y > maxPos.y:maxPos.y = target.global_position.y# 移动到中心点self.global_position = lerp(self.global_position, (maxPos + minPos) / 2, 2.0 * delta)# 计算缩放比例,相对于游戏主窗口var zoom = 2.0 * max((maxPos.x - minPos.x) / _windowSize.x, (maxPos.y - minPos.y) / _windowSize.y)zoom = clamp(zoom, 0.5, 1.0)_camera.zoom = lerp(_camera.zoom, Vector2.ONE * zoom, 2.0 * delta)

子弹高度模拟

原 Unity 视频中的 Tank 是一个 3D 游戏,所以子弹也就有射程(落地)和高度之分,如果在 2D 场景中不设置高度,炸弹只要碰上其他炸弹或者静态物体都会直接爆炸,那么游戏中的发射力(射程)也就毫无意义了,所以我使用代码简单地实现了子弹高度的模拟。

子弹高度模拟

思路大概是这样的:给子弹添加一个阴影,阴影大小和透明度随子弹高度发生变化,飞行中的子弹在垂直方向上偏移一定位置表示高度,最后把碰撞体设置在阴影上。这里的变化都使用了线性比例,实现方式也相对简单,从上图也可以看出来:

export var missileBodyMaxOffset := 60.0            # 最高时子弹视觉偏移
export(float, 1.0, 10.0) var shadowMaxScale := 1.5 # 阴影最大缩放,即子弹离地最低点
export(float, 0.0, 1.0) var shadowMinScale := 0.5  # 阴影最小缩放,即子弹离地最高点
export(float, 0.0, 1.0) var shadowMinAlpha := 0.25 # 阴影最小透明度,最高点
export(float, 1.0, 2.0) var shadowMaxAlpha := 2.5  # 阴影最大透明度,最低点func init(force : float, maxSpeed : int, resistance : int, dir : Vector2) -> void:_direction = dir_fullSpeed = maxSpeed_moveResistance = resistance # 阻力,即重力加速度# 计算能达到的最大高度_maxFlyHeight = 0.5 * maxSpeed * maxSpeed / resistance# 计算线性关系系数a和b:y=ax+b_paramScaleA = (shadowMinScale - shadowMaxScale) / _maxFlyHeight_paramScaleB = shadowMaxScale_paramAlphaA = (shadowMaxAlpha - shadowMinAlpha) / (shadowMinScale - shadowMaxScale)_paramAlphaB = shadowMaxAlpha - shadowMinScale * _paramAlphaA# 保证炸弹总是往上方偏移,不然看起来奇怪var angle = fmod(dir.angle(), 2 * PI)if angle > PI * 0.5 || angle < - PI * 0.5:missileBodyMaxOffset = -missileBodyMaxOffset# 水平和垂直初始速度一样,模拟45度发射导弹_velocityX = force * maxSpeed_velocityY = force * maxSpeed# 计算水平和垂直位移
func _physics_process(delta: float) -> void:self.position += _direction * _velocityX * delta_velocityY -= _moveResistance * deltacurrentHeight += _velocityY * delta_adjustHeight(currentHeight)if currentHeight <= 0.0:explode()# 根据高度调整阴影大小、透明度、子弹垂直偏移
func _adjustHeight(height : float) -> void:_body.position.y = - height / _maxFlyHeight * missileBodyMaxOffsetvar shadowScale = _paramScaleA * height + _paramScaleB_shadow.scale = Vector2.ONE * shadowScalevar shadowAlpha = _paramAlphaA * shadowScale + _paramAlphaB_shadow.modulate.a = shadowAlpha

嗯,我就想弱弱问一句:现实生活中物体越高其阴影是越大还是越小呢?……

三、总结

这种 AI 系统具有比较强的扩展性和易用性,有点复杂问题简单模块化的思维,用起来应该会相当爽,当然我也没有具体项目案例,另外也有一些不足之,个人经验主要概括为这两点:

  1. Pluggable AI 确实比较强大,使用非常方便,因为是可插拨,即使配置复杂的 AI 都只要轻轻一拖一拽一松手就完成了
  2. 但是这种方式也有令人不爽的地方,比如耦合还是比较厉害的,代码中需要访问、修改很多玩家相关数据,依然需要一番精心的设计

好在 Unity 中具有更加成熟的碰撞检测相关 API ,比如 SphereCast 还有 Navigator 都是极好用的 AI 辅助工具, Godot 中就只能手动实现了。 😂

最后,务必关注我的公众号,回复 AI教程 我会送上本套视频以及非常棒的一套 AStar 讲解视频(毫无疑问也是在 Unity 中实现,但是原理通用)。本篇的 Demo 以及相关代码已经上传到 Github ,地址: https://github.com/spkingr/Godot-Pluggable-AI , 后续继续更新,原创不易,希望大家喜欢! 😄

我的博客地址: http://liuqingwen.me ,我的博客即将同步至腾讯云+社区,邀请大家一同入驻: https://cloud.tencent.com/developer/support-plan?invite_code=3sg12o13bvwgc ,欢迎关注我的微信公众号(第一时间更新+游戏开发资源+相关资讯):IT自学不成才

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 活动相关EV、PV、AC、CPI、SPI、ETC、EAC解析及考点

    网络图:参考:https://blog.csdn.net/u010588262/article/details/80110134?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-1-80110134.nonecase&utm_term=%E6%B4%BB%E5%8A%A8%E7%9A%84%E8%87%AA%E7%94%B1%E6%B5%AE%E5%8…...

    2024/4/8 19:56:58
  2. 大数据介绍

    目录1、大数据概览1.1 大数据概览 —— 大数据定义1.2 大数据概览 —— 大数据来源1.3 大数据概览 —— 大数据的数据类型2、大数据处理及意义3、大数据应用场景 1、大数据概览 1.1 大数据概览 —— 大数据定义 大数据常用定义 —— 4个V:Volume:数据规模 - 海量的数据规模,…...

    2024/5/3 14:31:18
  3. writefile lasterror 5

    windows api writefile写磁盘数据的时候lasterror返回错误码5的情况,该问题是由于windows format格式化fat32或者ntfs之后无法写(可能被磁盘保护),有两种方法可以执行writefile,一种是磁盘变成RAW格式,表示没有格式化的状态,另外一种是磁盘未配置(执行diskpart clean)…...

    2024/4/24 15:48:16
  4. 4K Video Downloader注册码

    最近一直有人问4K Video Downloader注册码的问题,在这里有必要说明一下:4K Video Downloader是一款共享软件,无需注册码也可以免费使用4K Video Downloader英文版才需要注册码,中文版只要登陆账号就可以使用 中文版下载地址:https://www.4kvideodownloader.com/英文版下载…...

    2024/5/7 21:09:40
  5. 计算机网络(上)

    一、计算机网络基础知识1、什么是计算机网络把分布在不同地理位置的计算机与专门的网络设备用通信线路互相连成一个规模大、功能强的系统,从而使众多计算机可以方便地互相传递信息、共享软件、硬件、数据信息等。 计算机网络就是由通信线路互相连接的许多自主工作的计算机构成…...

    2024/3/28 23:16:09
  6. layUI使用table.reload时出现了两次请求问题

    解决方式:其实把button标签改为a标签就可以了,原因未知...

    2024/5/6 1:53:12
  7. Geomesa(二)开发环境搭建

    开发环境搭建 创建项目 前文说过的基础软件比如 java scala等等都先安装好再继续1: 打开Idea,新建项目,选择Maven下一步2: 填写名称,完成即可3: 打开Pom 文件先把提前定义好的属性加进去<properties><project.build.sourceEncoding>UTF-8</project.build.so…...

    2024/4/23 1:48:11
  8. springboot整合mybatis使用redis缓存自定义序列化器

    写在前面:各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!在整合redis做缓存前先看一下我们之前缓存的时候用的是什么呢,spring默认匹配的是SimpleCacheConfiguration缓存,它的底层用了一个key-value的Map,不能像r…...

    2024/5/7 14:34:43
  9. 【游戏客户端】应届入职半年有感

    【游戏客户端】入职半年有感大家好,我是Lampard~~时光苒在如白驹过隙,眨眼间半年的青葱已经流去。今天我刚好入职半年,我认为很有必要记录下来,和大家分享一下我这半年的经历。温故之余希望给怀着游戏梦,准备进入游戏行业的同学一些参考,也希望有一些大佬指出学习方向,不…...

    2024/5/8 0:00:20
  10. HashMap笔记

    有道云链接...

    2024/5/7 17:35:50
  11. JZ2440 v3.0 linux-3.4.2 busybox1.20.0内核 和 文件系统移植 修改分区大小 yaffs2文件系统补丁 开源资源查找

    文章目录零、平台 + 软件版本 + 烧写平台 和 版本烧写一、编译系统的一堆命令1. 编译uboot2. 编译内核3. 文件系统 yaffs2额外的,自启动脚本配置 + 自动配置网卡二、修改默认分区大小1. 修改uboot的宏2. 修改内核的mtd分区大小和偏移三、在源码中修改uboot的tftp ip四、报错1.…...

    2024/3/31 3:09:30
  12. 程序员,职场上请远离这种人!

    对有些职场人来讲,甩锅就是一种生存手段。01.从大学打篮球说起上大学的时候喜欢打篮球,然后我又特别喜欢抢篮板,经常是跳起来的时候没事,落下来的时候偶尔会踩到别人的脚上,于是左脚经常性崴脚,这是背景。我们班上有一个同学也喜欢打篮球,我俩水平都差不多因此也算能玩在…...

    2024/5/7 11:30:36
  13. UNIX环境高级编程(第三版)--开发环境搭建和第一个案例

    环境搭建unbuntu vmware 15 unix环境高级编程第三版(书)转载内容来源:https://www.cnblogs.com/lesroad/p/9738020.html 转载内容如下: 1)下载源代码,可以去官网下载:http://apuebook.com/code3e.html (2)解压缩源代码文件:tar -zxvf src.3e.tar.gz (3) 安装静态链…...

    2024/3/31 3:43:18
  14. 一文理解计量产品的校表

    什么是校表 校表一般是指电能计量表的产品校准,通过对整机进行offset校正,增益校正等,可以提高产品的精度使整机能够达到非常高的精度,并达到国家规范标准。 电表是用于千家万户的计费产品,一切涉及到计费的产品需要通过质量监督局的检测标准。常用电表分为0.5级,1级和2级…...

    2024/4/23 8:14:30
  15. Docker下载速度慢,配置阿里云镜像加速器

    阿里云镜像加速登录阿里云 访问这个地址:阿里云链接 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-36q80XG7-1599796183959)(C:\Users\A~玮\Desktop\java相关图片\阿里云镜像加速页面.png)]寻找阿里云镜像加速命令 [外链图片转存失败,源站可能有防盗…...

    2024/5/7 10:49:46
  16. Kotlin 使用DSL构建语法结构 看这一篇就够了~

    前言DSL并不是单独为Kotlin语言提供的,可能你并知道DSL是什么,但是我敢说,只要你是Android开发者,你就一定使用过并且一直在使用DSL,那么到底什么是DSL?使用DSL又可以实现怎么样的功能呢?DSL是什么DSL的全程是Domain Specific Language 即 领域特定语言,我们可以通过DS…...

    2024/4/3 2:22:32
  17. 关于POE的知识都在这里了

    一、什么是POE 1、POE的由来 2003年6月,IEEE批准了802.3af标准,该标准是基于以太网供电系统POE的新标准,它在IEEE 802.3的基础上增加了通过网线直接供电的相关标准,是现有以太网标准的扩展,也是第一个关于电源分配的国际标准。它明确规定了远程系统中的电力检测和控制事项…...

    2024/3/30 23:14:04
  18. 安装VMware,出现Microsoft Runtime DLL 安装程序未能完成安装,解决方法

    安装VMware,出现Microsoft Runtime DLL 安装程序未能完成安装,解决方法参考文章: (1)安装VMware,出现Microsoft Runtime DLL 安装程序未能完成安装,解决方法 (2)https://www.cnblogs.com/wxdblog/p/7091496.html 备忘一下。...

    2024/4/1 4:35:17
  19. 深入剖析Promise对象

    内容偏长,建议先马再看概述单线程模式工作的原因同步模式(Synchronous)异步模式(Asynchronous)回调函数PromisePromise的基本用法Promise使用案例Promise常见误区Promise链式调用Promise 异常处理Promise的静态方法Promise并行处理Promise.all()Promise.race()Promise执行…...

    2024/5/2 20:41:06
  20. 英伟达 Jetson TX2介绍

    Jetson TX2介绍Jetson TX2是NIVDIA瞄准人工智能在Jetson TK1和TX1推出后的升级TX2的GPU和CPU都进行了升级,内存增加到了8GB、存储增加到了32GB,支持Wifi和蓝牙,编解码支持H.265,体型同样小巧。据NVIDIA官方介绍,Jetson TX2提供两种运行模态:一种是MAX Q,能效比能达到最高…...

    2024/4/1 3:55:00

最新文章

  1. 智能电视遇险?海信、TCL、小米“上下求索”

    众所周知&#xff0c;智能化已经成为各行各业的发展新方向&#xff0c;家电行业更是早早掀起了智能化浪潮&#xff0c;越来越多的智能家电产品涌现出来。在客厅场景&#xff0c;电视毫无疑问是众多家电中的C位&#xff0c;而在智能化浪潮的助推下&#xff0c;电视这一产品同样开…...

    2024/5/8 4:44:26
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/7 10:36:02
  3. 零基础 HTML 入门(详细)

    目录 1.简介 1.1 HTML是什么? 1.2 HTML 版本 1.3 通用声明 2.HTML 编辑器 3.标签的语法 4.HTML属性 5.常用标签 5.1 head 元素 5.1.1 title 标签 5.1.2 base 标签 5.1.3 link 标签 5.1.4 style 标签 5.1.5 meta 标签 5.1.6 script 5.2 HTML 注释 5.3 段落标签…...

    2024/5/5 8:40:44
  4. Golang Gin框架

    1、这篇文章我们简要讨论一些Gin框架 主要是给大家一个基本概念 1、Gin主要是分为路由和中间件部分。 Gin底层使用的是net/http的逻辑&#xff0c;net/http主要是说&#xff0c;当来一个网络请求时&#xff0c;go func开启另一个协程去处理后续(类似epoll)。 然后主协程持续…...

    2024/5/5 8:48:03
  5. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/5/7 19:05:20
  6. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/5/7 22:31:36
  7. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/5/8 1:37:40
  8. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/5/7 14:19:30
  9. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/5/8 1:37:39
  10. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/5/7 16:57:02
  11. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/5/7 14:58:59
  12. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/5/7 1:54:46
  13. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/5/7 21:15:55
  14. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/5/8 1:37:35
  15. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/5/7 16:05:05
  16. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/5/7 16:04:58
  17. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/5/8 1:37:32
  18. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/5/7 16:05:05
  19. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/5/8 1:37:31
  20. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/5/8 1:37:31
  21. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/5/7 11:08:22
  22. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/5/7 7:26:29
  23. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/5/8 1:37:29
  24. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/5/7 17:09:45
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57