Sui 链游戏开发实战:用 Move 写一个链上剪刀石头布游戏!
系列文章目录
Task1:hello move🚪
Task2:move coin🚪
Task3:move nft🚪
Task4:move game🚪
更多精彩内容,敬请期待!✌️
文章目录
- 系列文章目录
- 前言
- 什么是 Sui 链?
- 什么是 Move 编程语言?
- Move 共学活动:快速上手 Move 开发
- 一、创建项目
- 1.1 新建 Move 项目
- 1.2 导入依赖
- 二、编写合约代码
- 2.1 资金池管理
- 2.2 游戏逻辑
- 2.3 主网部署
- 三、测试与验证
- 3.1 调用 deposit 函数
- 3.2 调用 withdraw 函数
- 3.3 调用 play 函数
- 总结
前言
在上一篇文章《Task3:move nft》中,我们深入探讨了如何通过 Move 编程语言 创建一个简单的 NFT 合约,学习了如何利用 Move 的资源管理和模块化设计来实现非同质化代币的存储和转移。在此过程中,我们掌握了 NFT 的创建与管理、链上资产的唯一性保障 等关键技术,为后续的更复杂应用打下了坚实的基础。
本篇文章将延续之前的学习路径,完成 Move 共学活动 中的 Task4:move game 任务。在这一任务中,我们将挑战创建一个链上互动游戏——剪刀石头布。通过编写智能合约来实现游戏的存款、取款、胜负判断等逻辑,你将进一步了解如何利用 Move 构建链上游戏,探索更多 Move 的应用场景。通过这个任务,你将能够掌握以下技术要点:
- 如何在 Move 合约中实现资金池的管理;
- 如何通过随机数生成游戏结果;
- 以及如何实现链上游戏的公平性与交互性。
让我们一起开启 Move 链上游戏的开发之旅,进一步挖掘 Move 编程语言在区块链应用中的巨大潜力!
什么是 Sui 链?
Sui 是一个高性能的区块链平台,旨在为去中心化应用提供快速、安全且可扩展的基础设施。它由 Aptos Labs 团队开发,基于新型的共识协议——Narwhal & Tusk。Sui 的设计目标是解决区块链性能瓶颈,提供极高的交易吞吐量和低延迟,适应复杂应用场景的需求。
Sui 链的主要特点:
-
高吞吐量与低延迟: Sui 的共识机制允许并行处理大量交易,而无需等待整个网络的全局共识。这种并行化的设计能够实现每秒处理成千上万的交易,极大提高了区块链的吞吐量,并减少交易确认的延迟。
-
面向对象的资源管理: Sui 将区块链中的资源视为对象进行管理。这些资源(例如代币、NFT)有独立的标识符,能够被直接跟踪和操作。通过这种方式,Sui 可以在多个节点之间高效并行地处理资源,而不需要处理全局状态,进一步提升性能。
-
灵活的交易模型: Sui 提供了灵活且高效的交易模型,支持在多个资源对象之间并行执行交易。这意味着不同用户的交易可以独立且高效地进行,避免了传统区块链的性能瓶颈。
-
高效的账户和权限管理: Sui 提供了多样化的账户管理机制,可以应对去中心化应用中复杂的权限需求。无论是个人账户、智能合约账户,还是多签账户,都能灵活配置和管理。
什么是 Move 编程语言?
Move 是专为区块链开发设计的编程语言,最初由 MetaLibra(后来的 Diem)团队开发,后被 Sui 区块链采用。Move 的设计重点是资源的管理、所有权的控制以及类型安全,它特别适用于处理去中心化应用中的资产和数字资源。
Move 语言的主要特点:
-
资源类型系统: Move 语言将所有的资源(如代币、NFT、智能合约中的数据等)视为“资源类型”。这些资源在系统中不能被复制或销毁,只能转移或借用。这确保了每个资源的唯一性和安全性,从根本上避免了传统智能合约中的资源丢失和重复转移问题。
-
所有权与借用机制: Move 通过严格的所有权和借用机制管理资源。每个资源都有一个唯一的所有者,资源的借用必须显式声明,这种机制避免了“共享资源”时的安全隐患。资源的借用可以确保开发者在不修改资源所有权的前提下共享和操作资源。
-
模块化编程: Move 支持模块化的编程结构,每个模块可以包含不同的资源类型和函数。模块化设计使得代码更加清晰、可复用,并有助于提高开发效率和降低代码出错的概率。
-
类型安全与可验证性: Move 是一门强类型语言,这意味着开发者必须在编译时明确地定义每个变量和资源的类型。Move 的类型系统能够确保合约中的大部分错误在编译阶段就被发现,从而避免了运行时错误,提高了智能合约的安全性。
Move 语言的示例代码:
以下是一个简单的 Move 合约示例,展示了如何创建和转移一个名为 Coin
的资源:
address 0x1 {module CoinModule {resource struct Coin has store {value: u64,}public fun create_coin(value: u64): Coin {Coin { value }}public fun transfer_coin(coin: Coin, recipient: address): Coin {let new_coin = Coin { value: coin.value };// 这里可以执行实际的转账操作return new_coin;}}
}
在这个示例中,Coin
是一个资源类型,包含一个 value
字段,表示代币的值。create_coin
函数用来创建新的 Coin
资源,而 transfer_coin
函数则用于将 Coin
资源转移到指定的账户。
Move 共学活动:快速上手 Move 开发
为了帮助更多开发者快速了解和掌握 Move 编程语言,Move 共学活动由 HOH 社区、HackQuest、OpenBuild、KeyMap 联合发起。该活动旨在为新手小白提供一个良好的学习平台,带领大家一步步熟悉 Move 语言,并了解如何将其应用到 Web3 开发中。
通过与 Move 领域的专业导师们合作,参与者可以快速掌握 Move 语言的基础知识,逐步向更复杂的应用开发进阶。无论是区块链初学者,还是有一定开发经验的工程师,都能从中获益。
资源链接:
- sui官方文档🚪:获取关于 Sui 链的详细文档,包括开发指南、API 参考等。
- move学习B站视频🚪:通过 B 站的视频教程,跟随导师学习 Move 编程语言的基础与进阶。
- letsmove仓库🚪:这是一个 Move 学习资源的 GitHub 仓库,包含了各种示例代码和教程,帮助开发者掌握 Move 语言。
一、创建项目
首先,我们需要创建一个新的 Move 项目,并导入之前在 Task2 中开发的代币合约
1.1 新建 Move 项目
运行以下命令创建名为 rock_paper_scissors
的 Move 项目:
sui move new rock_paper_scissors
cd .\rock_paper_scissors\
1.2 导入依赖
假设我们的代币合约已经实现并存储在 my_coin
目录中。我们可以通过以下方式将其作为依赖项导入到新的项目中:
my_coin = { local = "../../task2/my_coin" }
在此基础上,我们空编译项目,确保依赖项正确引入并且项目能顺利编译:sui move build
二、编写合约代码
在合约代码中,我们创建了一个名为 rock_paper_scissors
的模块,它包含了游戏的主要逻辑,主要功能包括资金池管理、用户存款、取款以及游戏玩法的实现。以下是合约的关键部分。
2.1 资金池管理
资金池的管理是这个合约的核心部分。由于 Move 的设计需要使用 Balance
类型来存储余额,而 Balance
类型本身不具备转移功能,所以我们需要通过 Coin
类型与 Balance
类型之间的转换来进行资金管理。
- 为什么要对 Coin 和 Balance 进行转换?
-
原因:在合约中,所有的资金都以
Balance
类型来存储,这样可以方便地进行余额的管理和操作。然而,Balance
只能用于存储,不能作为一个可转移的对象。而Coin
类型则可以作为具有key
和store
属性的对象,这样它就能够被转移到用户的钱包中。public struct Balance<phantom T> has store {value: u64, }public struct Coin<phantom T> has key, store {id: UID,balance: Balance<T>, }
-
转换方法
into_balance
:将Coin
转换为Balance
类型。from_balance
:将Balance
转换为Coin
类型。
use sui::coin; use sui::coin::{Coin, from_balance, into_balance};
-
在游戏中,我们使用这两个方法来实现存款和取款的功能。
-
存款函数
用户将Coin
代币存入资金池时,首先使用into_balance
将Coin
转换为Balance
,然后通过balance::join
合并余额到游戏的资金池中。public entry fun deposit(game: &mut Game,coin: Coin<HUAHUAHUA1223_FAUCET_COIN>,_ctx: &mut TxContext ) {let in_balance = into_balance(coin);balance::join(&mut game.balance, in_balance); }
-
取款函数
当管理员从资金池中取款时,首先要检查资金池中是否有足够的余额。如果有足够余额,则将Balance
类型转换为Coin
类型,并转账给管理员public entry fun withdraw(game: &mut Game,_: &Admin,amount: u64,ctx: &mut TxContext ) {assert!(game.balance.value() >= amount, EGameInsufficientBalance);let withdrawn_balance = balance::split(&mut game.balance, amount);let withdrawn_coin = from_balance(withdrawn_balance, ctx);public_transfer(withdrawn_coin, sender(ctx)); }
2.2 游戏逻辑
游戏的玩法非常简单,用户参与游戏时,需要选择 剪刀、石头 或 布 之一。合约会根据随机数生成游戏的选择,并判断用户是否获胜。如果用户获胜,奖励会是用户下注金额的两倍;如果失败,则用户下注的金额会被存入资金池。如果是平局,用户将退还代币
胜负判断函数
使用简单的规则判断玩家是否获胜:
- 剪刀胜布。
- 石头胜剪刀。
- 布胜石头。
public fun is_winner(player1: u8, player2: u8): bool {(player1 == 0 && player2 == 2) || // 剪刀胜布(player1 == 1 && player2 == 0) || // 石头胜剪刀(player1 == 2 && player2 == 1) // 布胜石头
}
游戏主函数
-
玩家选择
玩家输入一个u8
类型的数字(0=剪刀,1=石头,2=布)表示选择。 -
合约生成随机选择
使用Random
模块生成一个随机数,取模 3 来确定游戏的选择。 -
胜负逻辑
- 如果玩家获胜,用户收到下注金额的两倍作为奖励。
- 如果玩家失败,下注金额进入资金池。
- 平局时,用户取回下注金额。
entry fun play(game: &mut Game,user_choice: u8,user_coin: Coin<HUAHUAHUA1223_FAUCET_COIN>,rand: &Random,ctx: &mut TxContext
) {let coin_value = user_coin.value();let game_value = game.balance.value();assert!(game_value >= coin_value * 10, EGameInsufficientBalance);let mut gen = new_generator(rand, ctx);let game_choice = generate_u8(&mut gen) % 3;if (is_winner(user_choice, game_choice)) {let reward_balance = game.balance.split(coin_value);let reward_coin = from_balance(reward_balance, ctx);public_transfer(reward_coin, ctx.sender());public_transfer(user_coin, ctx.sender());} else if (is_winner(game_choice, user_choice)) {deposit(game, user_coin, ctx);} else {public_transfer(user_coin, ctx.sender());}
}
2.3 主网部署
-
如果未连接主网,请参考 这篇教程的第三部分🚪,之后在合约项目的根目录下(如
rock_paper_scissors
),执行以下命令部署合约:
sui client publish --skip-dependency-verification
-
部署之后会得到一个交易哈希,记录下该值并使用 suivision区块链浏览器🚪查询合约详情
-
找到合约详情里的
Package ID
,在前端或Sui CLI
测试工具中调用合约函数。
三、测试与验证
合约部署完成后,通过对关键功能的调用进行测试,确保 rock_paper_scissors
合约的正确性和稳定性。以下是详细的测试与验证步骤,涵盖资金池管理和游戏逻辑功能。
3.1 调用 deposit 函数
将现有所有100个代币存入游戏的资金池中
3.2 调用 withdraw 函数
再从资金池中取回5个代币用来参与游戏,之前Task2代币精度为8,所以500000000
就是5个代币,提取后生成一个新的代币对象,供后续调用 play 函数使用。
3.3 调用 play 函数
参与石头剪刀布游戏,验证游戏逻辑是否正确,函数里面输入的coin部分的参数为Created
动作的ObjectID
用户的选择,0代表剪刀, 1代表石头, 2代表布。0x8
是random模块固定的ObjectID
结果显示这局游戏赢了又获得了5个代币
通过上述测试,Task4 的开发任务已圆满完成,恭喜你完成了一个 石头剪刀布 的链游🎉🎉
总结
通过完成 Task4:Move Game 的开发,我们进一步挖掘了 Move 编程语言 的潜力,成功实现了一个链上互动游戏——石头剪刀布。在这一过程中,我们不仅巩固了对 Move 编程语言的基础理解,还掌握了更多高级应用技巧,包括但不限于:
-
资金池管理:
深入了解了Balance
和Coin
类型的设计,学会了如何在合约中高效、安全地管理资金流转。 -
随机性与公平性:
通过Random
模块生成随机数,确保了链上游戏的公平性,为用户提供了可信的游戏体验。 -
智能合约与交互:
掌握了合约中多种复杂逻辑的实现方法,如资金存取、用户胜负判断、奖励分发等,全面提升了开发链上互动应用的能力。 -
模块化开发与复用:
借助之前开发的代币合约,我们成功实现了模块化开发,并深刻体会到了代码复用的重要性和便利性。
在实际开发过程中,我们不仅学习了解决技术难题的方法,还培养了从需求分析到代码实现再到测试部署的完整开发思维。这种实践经验将为我们未来开发更复杂的链上应用奠定坚实的基础。
通过本次任务,我们再次证明了 Move 编程语言 在区块链应用开发中的强大能力和灵活性。链游只是 Move 的众多应用场景之一,未来我们还将探索更多创新领域,让区块链技术真正融入到实际生活中。
下一步,我们将继续完成 Move 共学活动 的后续任务,期待与你一起学习更多区块链开发的精彩内容!🚀
更多精彩内容,欢迎关注系列文章目录!
我们在探索 Move 的道路上共同成长,不见不散! 🎉
相关文章:
Sui 链游戏开发实战:用 Move 写一个链上剪刀石头布游戏!
系列文章目录 Task1:hello move🚪 Task2:move coin🚪 Task3:move nft🚪 Task4:move game🚪 更多精彩内容,敬请期待!✌️ 文章目录 系列文章目录前言什么是 …...
Prometheus告警带图完美解决方案
需求背景 告警分析处理流程 通常我们收到 Prometheus 告警事件通知后,往往都需要登录 Alertmanager 页面查看当前激活的告警,如果需要分析告警历史数据信息,还需要登录 Prometheus 页面的在 Alerts 中查询告警 promQL 表达式,然…...
深度学习模型:循环神经网络(RNN)
一、引言 在深度学习的浩瀚海洋里,循环神经网络(RNN)宛如一颗独特的明珠,专门用于剖析序列数据,如文本、语音、时间序列等。无论是预测股票走势,还是理解自然语言,RNN 都发挥着举足轻重的作用。…...
分布式在线评测系统
OnlineJudge 前言所用技术开发环境 1. 需求分析2. 项目宏观结构3. compile_server服务设计3.1 compiler服务设计3.2 runner服务设计3.3 compile_run3.4 compile_server.cpp 4. oj_server服务设计4.1 model设计4.2 view设计4.3 control设计4.3.1 获取题目列表功能4.3.2 获取单个…...
Unity中动态生成贴图并保存成png图片实现
实现原理: 要生成长x宽y的贴图,就是生成x*y个像素填充到贴图中,如下图: 如果要改变局部颜色,就是从x1到x2(x1<x2),y1到y2(y1<y2)这个范围做处理, 或者要想做圆形就是计算距某个点(x1,y1&…...
鸿蒙多线程开发——sendable共享容器
1、异步锁机制 在介绍共享容器之前,先介绍异步锁机制。 为了解决多线程并发任务间的数据竞争问题,ArkTS引入了异步锁能力。异步锁可能会被类对象持有,因此为了更方便地在并发实例间获取同一个异步锁对象,AsyncLock对象支持跨线程…...
五天SpringCloud计划——DAY1之mybatis-plus的使用
一、引言 咱也不知道为啥SpringCloud课程会先教mybatis-plus的使用,但是教都教了,就学了吧,学完之后觉得mybatis-plus中的一些方法还是很好用了,本文作为我学习mybatis-plus的总结提升,希望大家看完之后也可以熟悉myba…...
Vue.js基础——贼简单易懂!!(响应式 ref 和 reactive、v-on、v-show 和 v-if、v-for、v-bind)
Vue.js是一个渐进式JavaScript框架,用于构建用户界面。它专门设计用于Web应用程序,并专注于视图层。Vue允许开发人员创建可重用的组件,并轻松管理状态和数据绑定。它还提供了一个虚拟DOM系统,用于高效地渲染和重新渲染组件。Vue以…...
警钟长鸣,防微杜渐,遨游防爆手机如何护航安全生产?
近年来,携非防爆手机进入危险作业区引发爆炸的新闻屡见报端。2019年山西某化工公司火灾,2018年延安某煤业瓦斯爆炸,均因工人未用防爆手机产生静电打火引发。涉爆行业领域企业量大面广,相当一部分企业作业场所人员密集,…...
中国科学院大学研究生学术英语读写教程 Unit7 Materials Science TextA 原文和翻译
中国科学院大学研究生学术英语读写教程 Unit7 Materials Science TextA 原文和翻译 Why Is the Story of Materials Really the Story of Civilisation? 为什么材料的故事实际上就是文明的故事? Mark Miodownik 1 Everything is made of something. Take away co…...
win10中使用ffmpeg和MediaMTX 推流rtsp视频
在win10上测试下ffmpeg推流rtsp视频,需要同时用到流媒体服务器MediaMTX 。ffmpeg推流到流媒体服务器MediaMTX ,其他客户端从流媒体服务器拉流。 步骤如下: 1 下载MediaMTX github: Release v1.9.3 bluenviron/mediamtx GitHub…...
代码美学2:MATLAB制作渐变色
效果: %代码美学:MATLAB制作渐变色 % 创建一个10x10的矩阵来表示热力图的数据 data reshape(1:100, [10, 10]);% 创建热力图 figure; imagesc(data);% 设置颜色映射为“cool” colormap(cool);% 在热力图上添加边框 axis on; grid on;% 设置热力图的颜色…...
gitlab:使用脚本批量下载项目,实现全项目检索
目的 当需要知道gitlab中所有项目是否存在某段代码时,gitlab免费版只提供了当个项目内的检索,当项目过多时一个个查太过繁琐。下面通过 GitLab API 将指定 Group 下的所有项目克隆到本地。此脚本会自动获取项目列表并逐一克隆它们,再在本地进…...
大型语言模型LLM - Finetuning vs Prompting
资料来自台湾大学李宏毅教授机器学课程ML 2023 Spring,如有侵权请通知下架 台大机器学课程ML 2023 Springhttps://speech.ee.ntu.edu.tw/~hylee/ml/2023-spring.php2023/3/10 课程 機器如何生成文句 内容概要 主要探讨了大型语言模型的两种不同期待及其导致的两类…...
【Python中while循环】
一、深拷贝、浅拷贝 1、需求 1)拷贝原列表产生一个新列表 2)想让两个列表完全独立开(针对改操作,读的操作不改变) 要满足上述的条件,只能使用深拷贝 2、如何拷贝列表 1)直接赋值 # 定义一个…...
Selenium 包介绍
诸神缄默不语-个人CSDN博文目录 Selenium 是一个强大的工具,主要用于自动化 Web 浏览器的操作。它支持多种编程语言(如 Python、Java、C# 等)和主流浏览器(如 Chrome、Firefox、Safari、Edge 等),广泛应用…...
量化交易系统开发-实时行情自动化交易-4.4.做市策略
19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来继续说说做市策略原理。 做市策…...
C++设计模式(单例模式)
一、介绍 1.动机 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。 如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例? 这应该是类设计者的…...
图的深度优先搜索算法DFS
深度优先搜索(DFS)就是一种寻找图中各个顶点的方法。想象一下,如果你在一个迷宫里探险,你会怎么做呢?你可能会选择一直走到尽头,直到找不到路为止,然后再回过头来试试其他的路,这就是…...
自动泊车“哐哐撞大墙”,小米SU7智驾功能bug缠身?
文/王俣祺 导语:小米SU7,自带热度与科技光环的“流量神车”,近日却以一种极为“狼狈”的方式闯入大众视野。多达70余辆小米SU7陷入“泊车魔咒”,瞬间在网络上炸开了锅。从“科技控”到“惹祸精”的背后,究竟藏着怎样的…...
Linux宝塔部署wordpress网站更换服务器IP后无法访问管理后台和打开网站页面显示错乱
一、背景: wordpress网站搬家,更换服务器IP后,如果没有域名时,使用服务器IP地址无法访问管理后台和打开网站页面显示错乱。 二、解决方法如下: 1.wordpress搬家后,在新服务器上,新建站点时&am…...
Http文件上传
方式一:HttpClient public static String uploadFile(String url, Map<String, FileWrapper> fileParam, Map<String,String> otherParam){long start System.currentTimeMillis();log.info("uploadFile url: {}.",url);HttpClient client …...
哈希C++
文章目录 一.哈希的概念1.直接定址法2.负载因子 二.哈希函数1.除法散列法 / 除留余数法2.乘法散列法3.全域散列法(了解) 三.处理哈希冲突哈希冲突:1.开放定址法(1)线性探测:(2)二次探…...
C++11(中)
C11(中) 1.可变参数模板1.1.使用场景 2.lambda表达式(重要)2.1.使用说明2.2.函数对象与lambda表达式 3.线程库3.1.thread3.2.atomic原子库操作3.3.mutex3.3.1.mutex的种类3.3.2.lock_guard3.3.3.unique_lock 🌟&#x…...
vim 如何高亮/取消高亮
高亮 :在ESC模式下使用 shift # 取消高亮:在ESC模式下输入英文输入 :nohl (no highlight)...
C#中面试的常见问题008
1.内存泄露 内存泄露的原因: 未释放动态分配的内存:在使用malloc、new等动态内存分配函数后,未能正确释放内存。引用计数错误:在引用计数管理内存的语言中,增加引用计数但未相应减少,导致内存无法释放。循…...
【系统架构设计师】真题论文: 论数据访问层设计技术及其应用(包括解题思路和素材)
更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 真题题目(2016年 试题3)解题思路论文素材参考(1)数据访问层设计 JDBC 技术(2)ORM 框架技术 - Hibernate(3)ORM 框架技术 - MyBatis(4)数据访问层设计模式 - DAO 模式(5)数据访问层设计模式 - Repositor…...
力扣整理版九:贪心算法(待整理)
局部最优 全局最优 局部最优可以推出全局最优 并且想不出反例 ----------------------------- (1) 455 分发饼干 (2) 1005 k次取反后最大化的数组和 (3) 860 柠檬水找零 (2) 376 摆动序列 (3) 122 买卖股票的最佳时机2 (4) 135 分发糖果 (4) 55 跳跃游戏 (5) 45 跳…...
香橙派--安装RKMPP、x264、libdrm、FFmpeg(支持rkmpp)以及opencv(支持带rkmpp的ffmpeg)(适用于RK3588平台)
1. 安装RKMPP git clone https://github.com/rockchip-linux/mppcd mpp/build/linux/aarch64./make-Makefiles.bashmake -j8sudo make installRKMPP:用于编解码测试,支持RK3588平台。 2. 安装x264 git clone https://code.videolan.org/videolan/x264…...
计算机毕业设计Python+大模型美食推荐系统 美食可视化 美食数据分析大屏 美食爬虫 美团爬虫 机器学习 大数据毕业设计 Django Vue.js
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
1138:将字符串中的小写字母转换成大写字母
【题目描述】 给定一个字符串,将其中所有的小写字母转换成大写字母。 【输入】 输入一行,包含一个字符串(长度不超过100,可能包含空格)。 【输出】 输出转换后的字符串。 【输入样例】 helloworld123Ha 【输出样例】…...
Wireshark抓取HTTPS流量技巧
一、工具准备 首先安装wireshark工具,官方链接:Wireshark Go Deep 二、环境变量配置 TLS 加密的核心是会话密钥。这些密钥由客户端和服务器协商生成,用于对通信流量进行对称加密。如果能通过 SSL/TLS 日志文件(例如包含密钥的…...
Unity UGUI原理剖析
UI最重要的两部分 UI是如何渲染出来的点击事件如何触发何时发生UI重绘 1:UI如何渲染出来的 UI渲染一定是有顶点的,没有顶点就没法确定贴图的采样,UGUI的顶点在一张Mesh上创建,经过渲染管线UI就渲染到屏幕上了,UI的渲染…...
实现Excel文件和其他文件导出为压缩包,并导入
导出 后端: PostMapping("/exportExcelData")public void exportExcelData(HttpServletRequest request, HttpServletResponse response, RequestBody ResData resData) throws IOException {List<Long> menuIds resData.getMenuIds();List<Co…...
Linux:基础开发工具
目录 软件包管理器yum 什么是软件包? 查看软件包 安装软件 卸载软件 vim vim的基本操作 gcc/g使用 预处理 编译 汇编 连接 make/Makefile .PHONY伪目标 定义使用变量 版本控制器Git 安装git git的使用 git add git commit git push git pull …...
【mac】终端左边太长处理,自定义显示名称(terminal路径显示特别长)
1、打开终端 2、步骤 (1)修改~/.zshrc文件 nano ~/.zshrc(2)添加或修改PS1,我是自定义了名字为“macminiPro” export PS1"macminiPro$ "(3)使用 nano: Ctrl o (字母…...
嵌入式硬件设计:从概念到实现的全流程
嵌入式硬件设计是现代电子技术中一个至关重要的领域,涉及从硬件架构设计到硬件调试的各个方面。它为我们日常生活中的各类智能设备、家电、工业控制系统等提供了强大的支持。本文将介绍嵌入式硬件设计的基本流程、关键技术、常用工具以及常见的挑战和解决方案&#…...
【Nginx】核心概念与安装配置解释
文章目录 1. 概述2. 核心概念2.1.Http服务器2.2.反向代理2.3. 负载均衡 3. 安装与配置3.1.安装3.2.配置文件解释3.2.1.全局配置块3.2.2.HTTP 配置块3.2.3.Server 块3.2.4.Location 块3.2.5.upstream3.2.6. mine.type文件 3.3.多虚拟主机配置 4. 总结 1. 概述 Nginx是我们常用的…...
数据库-MySQL-MybatisPlus实战
文章目录 前言一、整合mybatis-plus二、CRUD操作1、insert操作2、update操作3、delete操作 三、条件构造器(Wrapper)QueryWrapperUpdateWrapperLambdaQueryWrapperLambdaUpdateWrapper 四、分页查询五、自定义主键生成器六、总结 前言 mybatis相信都不陌生,目前互联…...
Vue2学习记录
前言 这篇笔记,是根据B站尚硅谷的Vue2网课学习整理的,用来学习的 如果有错误,还请大佬指正 Vue核心 Vue简介 Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。 它基于标准 HTML、CSS 和 JavaScr…...
thinkphp中对请求封装
请求的封装 //调用 $res Http::post($this->baseUrl . $url,$params,[CURLOPT_HTTPHEADER > [Content-Type: application/json,Content-Length: . strlen($params),],]);<?php namespace fast; /*** 字符串类*/ class Http {/*** 发送一个POST请求*/public static …...
网络安全中的数据科学如何重新定义安全实践?
组织每天处理大量数据,这些数据由各个团队和部门管理。这使得全面了解潜在威胁变得非常困难,常常导致疏忽。以前,公司依靠 FUD 方法(恐惧、不确定性和怀疑)来识别潜在攻击。然而,将数据科学集成到网络安全中…...
通过指令导入/导出vscode扩展插件
导出扩展: 打开VSCode终端: 在VSCode中,你可以通过菜单栏的“终端”选项打开终端,或者使用快捷键Ctrl (反引号,通常在键盘左上角)。运行导出命令: 在终端中,输入以下命…...
vscode添加环境变量(mujoco)
文章目录 前言一、创建.env文件二、编写setting.jason 前言 之前一直用pycharm,最近改用cursor了,在pycharm中设置环境变量修改运行配置就行了,vscode要麻烦一些,记录一下。 一、创建.env文件 以mujoco环境变量为例,…...
0-1背包问题(1):贪心算法
问题: 有 n 个物品和背包的容量,每个物品的重量为 w[i],价值为 v[i],背包的容量为 W。选若干个物品放入购物车,物品不可分割,使价值最大。 问题分析: 首先考虑贪心策略: 每次挑选…...
Qt界面篇:QMessageBox高级用法
1、演示效果 2、用法注意 2.1 设置图标 用于显示实际图标的pixmap取决于当前的GUI样式。也可以通过设置icon pixmap属性为图标设置自定义pixmap。 QMessageBox::Icon icon(...
计算机操作系统——进程控制(Linux)
进程控制 进程创建fork()函数fork() 的基本功能fork() 的基本语法fork() 的工作原理fork() 的典型使用示例fork() 的常见问题fork() 和 exec() 结合使用总结 进程终止与$进程终止的本质进程终止的情况正常退出(Exit)由于信号终止非…...
游戏引擎学习第23天
实时代码编辑功能的回顾 当前实现的实时代码编辑功能已经取得了显著的成功,表现出强大的性能和即时反馈能力。该功能允许开发者在修改代码后几乎立即看到变化在运行中的程序中体现出来,极大提升了开发效率。尽管目前的演示内容较为简单,呈现…...
0基础学java之Day25
Vector /** 知识点:Vector独有的方法 理解: * Vector在JDK1.0开始就已经存在 -- 元老级别的集合类, * 集合框架的概念是JDK1.2开始才有的, * 开发人员为了将Vector保留下来…...
android集成FFmpeg步骤以及常用命令,踩坑经历
1、入坑第一步:首先集成的库必须正确。最好是有ndk的,FFmpeg有许多个版本,我才开始接触的时候随便选了一个,一般的 方法没有问题。但是涉及到需要使用libx264等条件进行编码时,老是报错,网上搜索资料也没有人说需要ndk的支持才行。这个问题困扰了好几天,怎么试不行,最后…...