当前位置: 首页 > news >正文

简单3步,OpenHarmony上跑起ArkUI分布式小游戏

标准系统新增支持了方舟开发框架(ArkUI)、分布式组网和 FA 跨设备迁移能力等新特性,因此我们结合了这三种特性使用 ets 开发了一款如下动图所示传炸弹应用。

打开应用在通过邀请用户进行设备认证后,用户须根据提示完成相应操作,然后通过分布式流转实现随机传递炸弹给下一位用户的效果。那么这样一款传炸弹应用如何进行开发呢?

完整的项目结构目录如下:

├─entry
│  └─src
│      └─main
│          │  config.json // 应用配置
│          │
│          ├─ets
│          │  └─MainAbility
│          │      │  app.ets //ets应用程序主入口
│          │      │
│          │      └─pages
│          │              CommonLog.ets // 日志类
│          │              game.ets // 游戏首页
│          │              RemoteDeviceManager.ets // 设备管理类
│          │
│          └─resources // 静态资源目录
│              ├─base
│              │  ├─element
│              │  │
│              │  ├─graphic
│              │  ├─layout
│              │  ├─media // 存放媒体资源
│              │  │
│              │  └─profile
│              └─rawfile

我们可以分为如下 3 步:编写声明式 UI 界面、添加分布式能力和编写游戏逻辑。

一、编写声明式UI界面

1. 新增工程

在 DevEco Studio 中点击 File -> New Project ->Standard Empty Ability->Next,Language 选择 ETS 语言,最后点击 Finish 即创建成功。

图1 新建工程

2. 编写游戏页面

图2 游戏界面效果图

效果图如上可以分为两部分:

  • 顶部状态提示栏

首先在 @entry 组件入口 build() 中使用 Stack 作为容器,达到图片和文字堆叠的效果;

接着依次写入 Image 包裹的两个 Text 组件;

Stack() {Image($r(<span class="hljs-string">"app.media.title"</span>)).objectFit(ImageFit.Contain).height(<span class="hljs-number">120</span>)Column() {Text(<span class="hljs-keyword">this</span>.duration.toString() + <span class="hljs-string">'ms'</span>).fontColor(Color.White)Text(<span class="hljs-keyword">this</span>.touchText).fontColor(Color.White)}}
  • 中间游戏炸弹九宫格区域

使用 Grid 网格容器来编写九宫格区域;
在 GridItem 中 Stack (容器依次添加方块背景图片和炸弹图片;
在 visibility 属性中用 bombIndex 变量值来决定炸弹显示的位置;
通过 onClick 点击事件和 GestureGroup 组合手势加入单击、双击和长按的监听事件;

Stack() {Image($r(<span class="hljs-string">"app.media.title"</span>)).objectFit(ImageFit.Contain).height(<span class="hljs-number">120</span>)Column() {Text(<span class="hljs-keyword">this</span>.duration.toString() + <span class="hljs-string">'ms'</span>).fontColor(Color.White)Text(<span class="hljs-keyword">this</span>.touchText).fontColor(Color.White)}}

3. 添加弹窗

  • 创建规则游戏弹窗

1)通过 @CustomDialog 装饰器来创建自定义弹窗,使用方式可参考:

自定义弹窗文档:https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-ts/ts-methods-custom-dialog-box.md

2)规则弹窗效果如下,弹窗组成由两个 Text 和两个 Image 竖向排列组成,所以我们可以在 build()下使用 Column 容器来包裹,组件代码如下;

图3 游戏规则

@CustomDialogstruct RuleDialog {controller: CustomDialogControllerconfirm: () => <span class="hljs-keyword">void</span>invite: () => <span class="hljs-keyword">void</span>@Consume deviceList: RemoteDevice[]build() {Column() {Text(<span class="hljs-string">'游戏规则'</span>).fontSize(<span class="hljs-number">30</span>).margin(<span class="hljs-number">20</span>)Text(<span class="hljs-string">'炸弹会随机出现在9个方块内,需要在规定时间内完成指定操作(点击、双击或长按),即可将炸弹传递给下一个人,小心炸弹可是会越来越快的喔!'</span>).fontSize(<span class="hljs-number">24</span>).margin({ bottom: <span class="hljs-number">10</span> })Image($r(<span class="hljs-string">"app.media.btn_start"</span>)).objectFit(ImageFit.Contain).height(<span class="hljs-number">80</span>).margin(<span class="hljs-number">10</span>).onClick(() => {console.info(TAG + <span class="hljs-string">'Click start game'</span>)<span class="hljs-keyword">if</span> (checkTrustedDevice(<span class="hljs-keyword">this</span>.remoteDeviceModel)) {<span class="hljs-keyword">this</span>.controller.close()<span class="hljs-keyword">this</span>.confirm()}})Image($r(<span class="hljs-string">"app.media.btn_Invite"</span>)).objectFit(ImageFit.Contain).height(<span class="hljs-number">80</span>).margin(<span class="hljs-number">10</span>).onClick(() => {<span class="hljs-keyword">this</span>.invite()})}.width(<span class="hljs-string">'90%'</span>).margin(<span class="hljs-number">20</span>).backgroundColor(Color.White)}}

3)在 @entry 创建 CustomDialogController 对象并传入弹窗所需参数,后面可通过该对象 open() 和 close() 方法进行打开和关闭弹窗;

@Provide deviceList: RemoteDevice[] = []
private ruleDialog: CustomDialogController = <span class="hljs-keyword">new</span> CustomDialogController({builder: RuleDialog({invite: () => <span class="hljs-keyword">this</span>.InvitePlayer(),confirm: () => <span class="hljs-keyword">this</span>.startGame(),deviceList: <span class="hljs-keyword">this</span>.deviceList}),autoCancel: <span class="hljs-literal">false</span>
})
  • 创建游戏失败弹窗,并添加动画效果

图4 游戏失败弹窗动画

1)编写弹窗布局:将游戏失败文本、炸弹图片和再来一局按钮图片放置于 Column 容器中;

2)用变量来控制动画起始和结束的位置:用 Flex 容器包裹炸弹图片,并用 @State 装饰变量 toggle,通过变量来动态修改 [Flex]的direction 属性;

@State toggle: boolean = <span class="hljs-literal">true</span>
private controller: CustomDialogController
@Consume deviceList: RemoteDevice[]
private confirm: () => <span class="hljs-keyword">void</span>
private interval = <span class="hljs-literal">null</span>build() {Column() {Text(<span class="hljs-string">'游戏失败'</span>).fontSize(<span class="hljs-number">30</span>).margin(<span class="hljs-number">20</span>)Flex({direction: <span class="hljs-keyword">this</span>.toggle ? FlexDirection.Column : FlexDirection.ColumnReverse,alignItems: ItemAlign.Center}){Image($r(<span class="hljs-string">"app.media.bomb"</span>)).objectFit(ImageFit.Contain).height(<span class="hljs-number">80</span>)}.height(<span class="hljs-number">200</span>)Image($r(<span class="hljs-string">"app.media.btn_restart"</span>)).objectFit(ImageFit.Contain).height(<span class="hljs-number">120</span>).margin(<span class="hljs-number">10</span>).onClick(() => {<span class="hljs-keyword">this</span>.controller.close()<span class="hljs-keyword">this</span>.confirm()})}.width(<span class="hljs-string">'80%'</span>).margin(<span class="hljs-number">50</span>).backgroundColor(Color.White)
}

3)设置动画效果:使用 animateTo 显式动画接口炸弹位置切换时添加动画,并且设置定时器定时执行动画;

aboutToAppear() {<span class="hljs-keyword">this</span>.setBombAnimate()
}setBombAnimate() {<span class="hljs-keyword">let</span> fun = () => {<span class="hljs-keyword">this</span>.toggle = !<span class="hljs-keyword">this</span>.toggle;}<span class="hljs-keyword">this</span>.interval = setInterval(() => {animateTo({ duration: <span class="hljs-number">1500</span>, curve: Curve.Sharp }, fun)}, <span class="hljs-number">1600</span>)
}

二、添加分布式流转

分布式流转需要在同一网络下通过  DeviceManager 组件进行设备间发现和认证,获取到可信设备的 deviceId 调用 FeatureAbility.startAbility(parameter),即可把应用程序流转到另一设备。

原本分布式流转应用流程如下:

  • 创建 DeviceManager 实例;
  • 调用实例的 startDeviceDiscovery(),开始设备发现未信任设备;
  • 设置设备状态监听 on(‘deviceStateChange’,callback),监听设备上下线状态;
  • 设置设备状态监听 on(‘deviceFound’,callback),监听设备发现;
  • 传入未信任设备参数,调用实例 authenticateDevice 方法,对设备进行 PIN 码认证;
  • 若是已信任设备,可通过实例的 getTrustedDeviceListSync() 方法来获取设备信息;
  • 将设备信息中的 deviceId 传入featureAbility.startAbility 方法,实现流转;
  • 流转接收方可通过featureAbility.getWant() 获取到发送方携带的数据;
  • 注销设备发现监听 off(‘deviceFound’);
  • 注销设备状态监听 off(‘deviceStateChange’);

项目中将上面设备管理封装至 RemoteDeviceManager,通过 RemoteDeviceManager 的四个方法来动态维护 deviceList 设备信息列表。

图5 分布式流转

项目实现分布式流转只需如下流程:

1. 创建RemoteDeviceManager实例

1)导入 RemoteDeviceManager

import {RemoteDeviceManager} from <span class="hljs-string">'./RemoteDeviceManager'</span>

2)声明 @Provide 装饰的设备列表变量 deviceList,和创建 RemoteDeviceManager 实例。

@Provide deviceList: RemoteDevice[] = []
private remoteDm: RemoteDeviceManager = <span class="hljs-keyword">new</span> RemoteDeviceManager(<span class="hljs-keyword">this</span>.deviceList)

2. 刷新设备列表

在生命周期 aboutToAppear 中,调用刷新设备列表和开始发现设备。

aboutToAppear 定义:函数在创建自定义组件的新实例后,在执行其 build 函数之前执行。

aboutToAppear() {<span class="hljs-keyword">this</span>.remoteDm.refreshRemoteDeviceList() <span class="hljs-comment">// 刷新设备列表</span><span class="hljs-keyword">this</span>.remoteDm.startDeviceDiscovery() <span class="hljs-comment">// 开始发现设备</span>
}

3. 设备认证

invitePlayer(remoteDevice:RemoteDevice) {<span class="hljs-keyword">if</span> (remoteDevice.status == RemoteDeviceStatus.ONLINE) {prompt.showToast({ message: <span class="hljs-string">"Already invited!"</span> })<span class="hljs-keyword">return</span>}<span class="hljs-keyword">this</span>.remoteDm.authDevice(remoteDevice).then(() => {prompt.showToast({ message: <span class="hljs-string">"Invite success! deviceName="</span> + remoteDevice.deviceName })}).catch(() => {prompt.showToast({ message: <span class="hljs-string">"Invite fail!"</span> })})
}

4. 跨设备流转

从 deviceList 中获取设备列表在线的设备 Id,通过 featureAbility.startAbility 进行流转。

async startAbilityRandom() {<span class="hljs-keyword">let</span> deviceId = <span class="hljs-keyword">this</span>.getRandomDeviceId() <span class="hljs-comment">// 随机获取设备id</span>CommonLog.info(<span class="hljs-string">'featureAbility.startAbility deviceId='</span> + deviceId);<span class="hljs-keyword">let</span> bundleName = await getBundleName()<span class="hljs-keyword">let</span> wantValue = {bundleName: bundleName,abilityName: <span class="hljs-string">'com.sample.bombgame.MainAbility'</span>,deviceId: deviceId,parameters: {ongoing: <span class="hljs-literal">true</span>,transferNumber: <span class="hljs-keyword">this</span>.transferNumber + <span class="hljs-number">1</span>}};featureAbility.startAbility({want: wantValue}).then((data) => {CommonLog.info(<span class="hljs-string">' featureAbility.startAbility finished, '</span> + <span class="hljs-built_in">JSON</span>.stringify(data));featureAbility.terminateSelf((error) => {CommonLog.info(<span class="hljs-string">'terminateSelf finished, error='</span> + error);});});
}

5. 注销监听

在声明周期 aboutToDisappear 进行注销监听。

aboutToDisappear 定义:函数在自定义组件析构消耗之前执行。

aboutToDisappear() {<span class="hljs-keyword">this</span>.remoteDm.stopDeviceDiscovery() <span class="hljs-comment">// 注销监听</span>
}

三、编写游戏逻辑

1. 开始游戏

startGame() {CommonLog.info(<span class="hljs-string">'startGame'</span>);<span class="hljs-keyword">this</span>.randomTouchRule() <span class="hljs-comment">// 随机游戏点击规则</span><span class="hljs-keyword">this</span>.setRandomBomb() <span class="hljs-comment">// 随机生成炸弹位置</span><span class="hljs-keyword">this</span>.stopCountDown() <span class="hljs-comment">// 停止倒计时</span><span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.transferNumber < <span class="hljs-number">10</span>) {<span class="hljs-keyword">this</span>.duration = <span class="hljs-number">3000</span> - <span class="hljs-keyword">this</span>.transferNumber * <span class="hljs-number">100</span>} <span class="hljs-keyword">else</span> {<span class="hljs-keyword">this</span>.duration = <span class="hljs-number">2000</span>}<span class="hljs-keyword">const</span> interval: number = <span class="hljs-number">500</span><span class="hljs-comment">// 开始倒计时</span><span class="hljs-keyword">this</span>.timer = setInterval(() => {<span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.duration <= interval) {<span class="hljs-keyword">this</span>.duration = <span class="hljs-number">0</span>clearInterval(<span class="hljs-keyword">this</span>.timer)<span class="hljs-keyword">this</span>.timer = <span class="hljs-literal">null</span><span class="hljs-keyword">this</span>.gameFail()} <span class="hljs-keyword">else</span> {<span class="hljs-keyword">this</span>.duration -= interval}}, interval)
}

2. 判断输赢

编写判断逻辑,用于不同的点击事件中调用。

/*** 判断游戏输赢* @param operation 点击类型*/
judgeGame(operation:RuleType) {this.stopCountDown()if (operation != this.ruleText) {this.gameFail()} else {prompt.showToast({ message: "finish" })this.bombIndex = -1this.startAbilityRandom()}
}

3. 游戏失败

游戏失败,弹出游戏失败弹框。

gameFail() {prompt.showToast({message: <span class="hljs-string">'Game Fail'</span>})CommonLog.info(<span class="hljs-string">'gameFail'</span>);<span class="hljs-keyword">this</span>.gameFailDialog.open()
}

四、项目下载和导入

项目仓库地址:

https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/FA/Entertainment/BombGame

1)git下载

git clone https:<span class="hljs-comment">//gitee.com/openharmony-sig/knowledge_demo_temp.git</span>

2)项目导入

打开 DevEco Studio,点击 File->Open->下载路径/FA/Entertainment/BombGame

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

相关文章:

简单3步,OpenHarmony上跑起ArkUI分布式小游戏

标准系统新增支持了方舟开发框架&#xff08;ArkUI&#xff09;、分布式组网和 FA 跨设备迁移能力等新特性&#xff0c;因此我们结合了这三种特性使用 ets 开发了一款如下动图所示传炸弹应用。 打开应用在通过邀请用户进行设备认证后&#xff0c;用户须根据提示完成相应操作&am…...

GPT-3和自然语言处理的前沿:思考AI大模型的发展

引言 自然语言处理&#xff08;NLP&#xff09;是人工智能&#xff08;AI&#xff09;领域中最富有挑战性和活跃的研究领域之一。近年来&#xff0c;随着深度学习技术的发展和计算能力的提高&#xff0c;大型语言模型&#xff0c;尤其是OpenAI的GPT-3&#xff0c;已成为推动该…...

傅里叶变换例题

目录 傅里叶转化例题: 时移 频移 尺度 时域卷积性质:卷积==乘机...

基于Docker构建CI/CD工具链(六)使用Apifox进行自动化测试

添加测试接口 在Spring Boot Demo项目里实现一个简单的用户管理系统的后端功能。具体需求如下&#xff1a; 实现了一个RESTful API&#xff0c;提供了以下两个接口 &#xff1a; POST请求 /users&#xff1a;用于创建新的用户。GET请求 /users&#xff1a;用于获取所有用户的列…...

Java 中建造者模式,请用代码具体举例

建造者模式是一种创建型设计模式&#xff0c;它允许你创建一个复杂对象的不同部分并将它们组装在一起&#xff0c;以产生最终的对象。以下是一个简单的 Java 示例&#xff0c;演示了建造者模式的用法&#xff1a; // 产品类 class Computer {private String cpu;private String…...

Tomcat 启动闪退问题解决方法

总体思路 解决Tomcat闪退问题&#xff0c;您可以尝试以下几种方法&#xff1a; 检查安装过程&#xff1a;确保您的Tomcat安装过程没有遗漏任何步骤。如果是zip包形式的Tomcat&#xff0c;解压后通常不需要额外配置环境变量。编辑启动脚本&#xff1a;打开Tomcat安装目录下的bi…...

使用docker部署数据可视化平台Metabase

目前公司没有人力开发数据可视化看板&#xff0c;因此考虑自己搭建开源可视化平台MetaBase。在此记录下部署过程~ 一、镜像下载 docker pull metabase/metabase:latest 运行结果如下&#xff1a; 二、创建容器 docker run -dit --name matebase -p 3000:3000\ -v /home/loc…...

数图智慧零售解决方案,赋能零售行业空间资源价值最大化

数图智慧零售解决方案 赋能零售行业空间资源价值最大 在激烈的市场竞争中&#xff0c;如何更好地提升空间资源价值&#xff0c;提高销售额&#xff0c;成为行业关注的焦点。近日&#xff0c;NIQ发布的《2024年中国饮料行业趋势与展望》称&#xff0c;“在传统零售业态店内&…...

Django中的实时通信:WebSockets与异步视图的结合【第167篇—实时通信】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在现代Web应用程序中&#xff0c;实时通信已经成为了必不可少的功能之一。无论是在线聊天、…...

R 格式(蓝桥杯)

文章目录 R 格式【问题描述】解题思路高精度乘法高精度加法 R 格式 【问题描述】 小蓝最近在研究一种浮点数的表示方法&#xff1a;R 格式。对于一个大于 0 的浮点数 d&#xff0c;可以用 R 格式的整数来表示。给定一个转换参数 n&#xff0c;将浮点数转换为 R格式整数的做法…...

Intellij idea的快速配置详细使用

IntelliJ IDEA是一款强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;支持多种编程语言&#xff0c;包括Java、Kotlin、Scala等。以下是关于IntelliJ IDEA的快速配置和使用的详细步骤&#xff1a; 一、安装 前往IntelliJ IDEA的官方网站或可靠的软件下载平台&…...

JavaEE:JVM

基本介绍 JVM&#xff1a;Java虚拟机&#xff0c;用于解释执行Java字节码 jdk&#xff1a;Java开发工具包 jre&#xff1a;Java运行时环境 C语言将写入的程序直接编译成二进制的机器语言&#xff0c;而java不想重新编译&#xff0c;希望能直接执行。Java先通过javac把.java…...

Linux基础|线程池Part.1|线程池的定义和运行逻辑

线程池的定义和运行逻辑 多线程的问题&#xff1a; 如果并发的线程数量很多&#xff0c;并且每个线程都是执行一个时间很短的任务就结束了&#xff0c;这样频繁创建线程就会大大降低系统的效率&#xff0c;因为频繁创建线程和销毁线程需要时间。 那么一个很自然的想法就出现了…...

蓝队面试经验总结

Sql注入 1、sql注入漏洞原理 开发者没有在网页传参点做好过滤&#xff0c;导致恶意 sql 语句拼接到数据库进行执行 2、sql注入分类 联合注入 、布尔盲注 、时间盲注 、堆叠注入 、宽字节注入 、报错注入 3、堆叠注入原理 在 mysql 中&#xff0c;分号 代表一个查询语句的…...

MySQL命令分类与大纲

一、数据库管理 创建与删除数据库 CREATE DATABASE&#xff1a;创建新数据库DROP DATABASE&#xff1a;删除已存在的数据库ALTER DATABASE&#xff1a;修改数据库属性 切换与查看数据库 USE&#xff1a;选择当前工作数据库SHOW DATABASES&#xff1a;列出所有可用数据库 二、…...

windows编译xlnt,获取Excel表里的数据

用git拉取项目 这个文件是空的 要用git拉下来&#xff0c;使用终端编译xlnt库 点击解决方案 运行生成 然后新建项目&#xff0c;配置好库&#xff0c; #include <iostream> #include <xlnt/xlnt.hpp>int main() {// 打开 Excel 文件xlnt::workbook workbook;workb…...

c#字段和属性的区别

在C#中&#xff0c;字段&#xff08;fields&#xff09;和属性&#xff08;properties&#xff09;都是类的成员&#xff0c;它们提供了类存储数据的方式&#xff0c;但它们在用途和功能上有着明显的区别。 字段 字段通常用来存储类或结构的状态信息。字段是类的数据成员&…...

微软正式发布Copilot for Security

微软公司近日宣布&#xff0c;其备受期待的安全自动化解决方案——Copilot for Security现已全面上市&#xff0c;面向全球用户开放。这一创新工具的推出标志着微软在提升企业安全防护能力方面迈出了重要一步&#xff0c;同时也为安全专业人士提供了强大的支持。 Copilot for …...

AI大模型日报#0416:李飞飞《2024年人工智能指数报告》、Sora加入Adobe、李彦宏聊百度大模型之路

​导读&#xff1a; 欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。标题: 刚刚&#xff0c;李飞飞团队发布《2024年人工智能指数报告》&#xff1a;10大趋势&#xff0c;揭示AI大模型的“喜”与“忧” 摘…...

OpenCV轻松入门(八)——图片卷积

对图像和滤波矩阵进行逐个元素相乘再求和的操作就相当于将一个二维的函数移动到另一个二维函数的所有位置&#xff0c;这个操作就叫卷积。 卷积需要4个嵌套循环&#xff0c;所以它并不快&#xff0c;除非我们使用很小的卷积核。这里一般使用3x3或者5x5 图像滤波 图像滤波是尽…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码&#xff1a;HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...