Sui 链游戏开辟实战:用 Move 写一个链上铰剪石头布游戏!

[复制链接]
发表于 2025-12-20 09:57:40 | 显示全部楼层 |阅读模式
系列文章目次

Task1:hello move🚪
Task2:move coin🚪
Task3:move nft🚪
Task4:move game🚪
更多精彩内容,敬请期待!✌️




前言

在上一篇文章《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 的资源:
  1. address 0x1 {
  2.     module CoinModule {
  3.         resource struct Coin has store {
  4.             value: u64,
  5.         }
  6.         public fun create_coin(value: u64): Coin {
  7.             Coin { value }
  8.         }
  9.         public fun transfer_coin(coin: Coin, recipient: address): Coin {
  10.             let new_coin = Coin { value: coin.value };
  11.             // 这里可以执行实际的转账操作
  12.             return new_coin;
  13.         }
  14.     }
  15. }
复制代码
在这个示例中,Coin 是一个资源范例,包罗一个 value 字段,表今世币的值。create_coin 函数用来创建新的 Coin 资源,而 transfer_coin 函数则用于将 Coin 资源转移到指定的账户。

Move 共学运动:快速上手 Move 开辟

为了资助更多开辟者快速相识和把握 Move 编程语言,Move 共学运动由 HOH 社区HackQuestOpenBuildKeyMap 团结发起。该运动旨在为新手小白提供一个良好的学习平台,领导各人一步步熟悉 Move 语言,并相识怎样将其应用到 Web3 开辟中。
通过与 Move 范畴的专业导师们互助,到场者可以快速把握 Move 语言的根本知识,渐渐向更复杂的应用开辟进阶。无论是区块链初学者,照旧有肯定开辟履历的工程师,都能从中获益。
资源链接:


  • sui官方文档🚪:获取关于 Sui 链的具体文档,包罗开辟指南、API 参考等。
  • move学习B站视频🚪:通过 B 站的视频教程,跟随导师学习 Move 编程语言的根本与进阶。
  • letsmove堆栈🚪:这是一个 Move 学习资源的 GitHub 堆栈,包罗了各种示例代码和教程,资助开辟者把握 Move 语言。

一、创建项目

起首,我们须要创建一个新的 Move 项目,并导入之前在 Task2 中开辟的代币合约
1.1 新建 Move 项目

运行以下下令创建名为 rock_paper_scissors 的 Move 项目:
  1. sui move new rock_paper_scissors
  2. cd .\rock_paper_scissors\
复制代码

1.2 导入依靠

假设我们的代币合约已经实现并存储在 my_coin 目次中。我们可以通过以下方式将其作为依靠项导入到新的项目中:
  1. 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 属性的对象,如许它就可以大概被转移到用户的钱包中。
      1. public struct Balance<phantom T> has store {
      2.     value: u64,
      3. }
      4. public struct Coin<phantom T> has key, store {
      5.     id: UID,
      6.     balance: Balance<T>,
      7. }
      复制代码
    • 转换方法

      • into_balance:将 Coin 转换为 Balance 范例。
      • from_balance:将 Balance 转换为 Coin 范例。
      1. use sui::coin;
      2. use sui::coin::{Coin, from_balance, into_balance};
      复制代码


在游戏中,我们使用这两个方法来实现存款和取款的功能

  • 存款函数
    用户将 Coin 代币存入资金池时,起首使用 into_balance 将 Coin 转换为 Balance,然后通过 balance::join 归并余额到游戏的资金池中。
    1. public entry fun deposit(
    2.     game: &mut Game,
    3.     coin: Coin<HUAHUAHUA1223_FAUCET_COIN>,
    4.     _ctx: &mut TxContext
    5. ) {
    6.     let in_balance = into_balance(coin);
    7.     balance::join(&mut game.balance, in_balance);
    8. }
    复制代码
  • 取款函数
    当管理员从资金池中取款时,起首要查抄资金池中是否有充足的余额。假如有充足余额,则将 Balance 范例转换为 Coin 范例,并转账给管理员
    1. public entry fun withdraw(
    2.     game: &mut Game,
    3.     _: &Admin,
    4.     amount: u64,
    5.     ctx: &mut TxContext
    6. ) {
    7.     assert!(game.balance.value() >= amount, EGameInsufficientBalance);
    8.     let withdrawn_balance = balance::split(&mut game.balance, amount);
    9.     let withdrawn_coin = from_balance(withdrawn_balance, ctx);
    10.     public_transfer(withdrawn_coin, sender(ctx));
    11. }
    复制代码
2.2 游戏逻辑

游戏的玩法非常简单,用户到场游戏时,须要选择 铰剪石头 之一。合约会根据随机数天生游戏的选择,并判断用户是否得胜。假如用户得胜,嘉奖会是用户下注金额的两倍;假如失败,则用户下注的金额会被存入资金池。假如是平手,用户将退还代币
胜负判断函数
使用简单的规则判断玩家是否得胜:


  • 铰剪胜布。
  • 石头胜铰剪。
  • 布胜石头。
  1. public fun is_winner(player1: u8, player2: u8): bool {
  2.     (player1 == 0 && player2 == 2) || // 剪刀胜布
  3.     (player1 == 1 && player2 == 0) || // 石头胜剪刀
  4.     (player1 == 2 && player2 == 1)    // 布胜石头
  5. }
复制代码
游戏主函数

  • 玩家选择
    玩家输入一个 u8 范例的数字(0=铰剪,1=石头,2=布)表现选择。
  • 合约天生随机选择
    使用 Random 模块天生一个随机数,取模 3 来确定游戏的选择。
  • 胜负逻辑

    • 假如玩家得胜,用户收到下注金额的两倍作为嘉奖。
    • 假如玩家失败,下注金额进入资金池。
    • 平手时,用户取回下注金额。

  1. entry fun play(
  2.     game: &mut Game,
  3.     user_choice: u8,
  4.     user_coin: Coin<HUAHUAHUA1223_FAUCET_COIN>,
  5.     rand: &Random,
  6.     ctx: &mut TxContext
  7. ) {
  8.     let coin_value = user_coin.value();
  9.     let game_value = game.balance.value();
  10.     assert!(game_value >= coin_value * 10, EGameInsufficientBalance);
  11.     let mut gen = new_generator(rand, ctx);
  12.     let game_choice = generate_u8(&mut gen) % 3;
  13.     if (is_winner(user_choice, game_choice)) {
  14.         let reward_balance = game.balance.split(coin_value);
  15.         let reward_coin = from_balance(reward_balance, ctx);
  16.         public_transfer(reward_coin, ctx.sender());
  17.         public_transfer(user_coin, ctx.sender());
  18.     } else if (is_winner(game_choice, user_choice)) {
  19.         deposit(game, user_coin, ctx);
  20.     } else {
  21.         public_transfer(user_coin, ctx.sender());
  22.     }
  23. }
复制代码
2.3 主网摆设


  • 假如未毗连主网,请参考 这篇教程的第三部门🚪,之后在合约项目标根目次下(如 rock_paper_scissors),实行以下下令摆设合约:

    1. 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 的门路上共同发展,不见不散! 🎉

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表