基于 BOLT 框架构建具有可重用组件和可定制逻辑的井字棋

时间:2024-09-22 编辑: 浏览:(664)

作者:Magicblock;来源:MetaCat

本文展示了一个使用 Bolt 引擎的实体组件系统 (ECS) 开发的简单游戏示例,它促进了组件的可重用性,并使用户能够修改和扩展游戏的逻辑。

该框架通过抽象帐户空间(Account Space)和程序派生地址 (Program Derived Addresses)等底层概念,显著简化了基于 Solana 的开发。要与基于 Anchor 的程序进行比较,请参阅本教程?

https://book.anchor-lang.com/anchor_in_depth/milestone_project_tic-tac-toe.html

有关 Bolt 的更详细说明,请参阅公告博文?

https://blog.magicblock.gg/bolt-v0.1/

开发井字棋

本文第一部分详细介绍如何使用 Bolt 框架实现游戏逻辑。第二部分解释从开源井字棋实现开始,如何将基于 React 的客户端与程序集成。

该示例的完整源代码可在此处获取?

https://github.com/magicblock-labs/bolt-tic-tac-toe

游戏逻辑:使用 Bolt ECS 实现井字棋

首先,安装bolt-cli:

npminstall@magicblock-labs/bolt-cli

安装后,使用以下命令创建新项目:

boltinittic-tac-toe

创建组件(Component)

我们需要定义所需的数据结构。为简单起见,我们将创建两个组件:一个包含活跃玩家,另一个包含网格信息。

使用以下命令创建新组件:

boltcomponentplayers

此命令在 program-ecs/components 下创建一个players 组件。保存两个玩家的公钥的玩家组件可以定义如下:

usebolt_lang::*;declare_id!("5Xz6iiE2FZdpqrvCKbGqDajNYt1tP8cRGXrq3THSFo1q");#[component]#[derive(Default)]pubstructPlayers{pubplayers:[Option<Pubkey>;2],}

第二个组件包含网格信息。使用如下命令创建它:

boltcomponentgrid

网格组件可以定义为:

usebolt_lang::*;declare_id!("rdiVoU6KomhXBDMLi6UXVHvmjEUtKqb5iDCWChxMzZ7");#[component]pubstructGrid{pubboard:[[Option<Sign>;3];3],pubstate:GameState,pubis_first_player_turn:bool,}#[component_deserialize]#[derive(PartialEq)]pubenumGameState{Active,Tie,Won{winner:Pubkey},}#[component_deserialize]#[derive(PartialEq)]pubenumSign{X,O,}implSign{pubfnfrom_usize(value:usize)->Sign{matchvalue{0=>Sign::X,_=>Sign::O,}}}implDefaultforGrid{fndefault()->Self{Self::new(GridInit{board:[[None;3];3],state:GameState::Active,is_first_player_turn:true,})}}

创建系统(Systems)

系统以模块化方式实现游戏逻辑。它们对一组输入组件进行操作,并且可以执行任何计算。系统在你的世界实例中执行,并遵守审批策略,例如,一个世界可以允许任何人提交新系统,而另一个世界可能需要白名单方或 DAO 的批准。

我们构建的第一个系统将允许玩家加入比赛:

boltsystemjoin-game

将逻辑(在 program-ecs/systems/join-game.rs 中)修改为:

#[system]pubmodjoin_game{pubfnexecute(ctx:Context<Components>,_args_p:Vec<u8>)->Result<Components>{letplayers=&mutctx.accounts.players.players;letidx=matchplayers.iter_mut().position(|player|player.is_none()){Some(player_index)=>player_index,None=>returnErr(PlayersError::GameFull.into()),};ctx.accounts.players.players[idx]=Some(*ctx.accounts.authority.key);Ok(ctx.accounts)}#[system_input]pubstructComponents{pubplayers:Players,}}

第二个系统实现了游戏的核心逻辑:

1. 创建一个玩游戏系统:

boltsystemplay

2. 实现逻辑:

usebolt_lang::*;usegrid::Grid;useplayers::Players;declare_id!("DyUy1naq1kb3r7HYBrTf7YhnGMJ5k5NqS3Mhk65GfSih");#[system]pubmodplay{pubfnexecute(ctx:Context<Components>,args:Args)->Result<Components>{letgrid=&mutctx.accounts.grid;letplayers=&mutctx.accounts.players;letauthority=*ctx.accounts.authority.key;require!(players.players[0]==Some(authority)||players.players[1]==Some(authority),TicTacToeError::NotInGame);require!(grid.state==grid::GameState::Active,TicTacToeError::NotActive);letplayer_idx:usize=ifplayers.players[0]==Some(authority){0}else{1};require!(grid.is_first_player_turn==(player_idx==0),TicTacToeError::NotPlayersTurn);//Coregamelogicmatchargs{tile@Args{row:0..=2,column:0..=2,}=>matchgrid.board[tile.rowasusize][tile.columnasusize]{Some(_)=>returnErr(TicTacToeError::TileAlreadySet.into()),None=>{grid.board[tile.rowasusize][tile.columnasusize]=Some(grid::Sign::from_usize(player_idx));}},_=>returnErr(TicTacToeError::TileOutOfBounds.into()),}grid.is_first_player_turn=!grid.is_first_player_turn;check_winner(grid,authority);Ok(ctx.accounts)}#[system_input]pubstructComponents{pubgrid:Grid,pubplayers:Players,}#[arguments]structArgs{row:u8,column:u8,}}pubfncheck_winner(grid:&mutAccount<Grid>,player:Pubkey){...}

有关详细信息,请参阅完整源代码?

https://github.com/magicblock-labs/bolt-tic-tac-toe/blob/main/programs-ecs/systems/play/src/lib.rs

正如你所注意到的,实现非常简单。标记的结构体system_input定义了可以在execute函数中访问和使用的组件输入包。标记为的结构体arguments定义你的系统可以作为输入接收的参数。

构建并测试程序

使用以下命令构建程序:

boltbuild

此命令编译程序并自动生成 IDL 和 TypeScript 类型以进行客户端集成。

设置组件和执行系统的过程涉及以下步骤:

实例化一个世界。

创建与之匹配实体。

将玩家和网格组件附加到该匹配实体。

执行系统以促进游戏玩法。

Tic-Tac-Toe 游戏的 TypeScript 测试可以在这里找到?

连接 React 客户端

连接 React 客户端非常简单,这要归功于类型的动态检索和生成以及 Bolt TypeScript SDK 提供的实用函数。

添加依赖项:

yarnadd-D@magicblock-labs/bolt-sdk

例如,要执行一个系统:

// Componentsconst GRID_COMPONENT = new PublicKey("rdiVoU6KomhXBDMLi6UXVHvmjEUtKqb5iDCWChxMzZ7");const PLAYERS_COMPONENT = new PublicKey("5Xz6iiE2FZdpqrvCKbGqDajNYt1tP8cRGXrq3THSFo1q");// Systemsconst JOIN_GAME = new PublicKey("2umhnxiCtmg5KTn4L9BLo24uLjb74gAh4tmpMLRKYndN");const PLAY = new PublicKey("DyUy1naq1kb3r7HYBrTf7YhnGMJ5k5NqS3Mhk65GfSih");const applySystem = await ApplySystem({ authority: publicKey, system: JOIN_GAME, entity, components: [PLAYERS_COMPONENT],});const transaction = applySystem.transaction;const signature = await submitTransaction(transaction);

在这里找到用 React 制作的简单井字棋 UI?

https://github.com/magicblock-labs/bolt-tic-tac-toe/tree/main/app/react-tic-tac-toe

需要强调的一个重要方面是:执行系统和实例化组件仅需要 ID。这意味着可以动态创建和利用新的逻辑和数据结构,从而能够开发模组并更改游戏的行为。

结论

我们已经演练了使用 Bolt ECS 的井字棋游戏的简单实现,演示了如何将其连接到 React UI。这凸显了该框架的简单性和灵活性。除了抽象 Solana 和重用链上逻辑之外,我们对 BOLT 将为用户生成的逻辑和 mod 引入带来的可能性感到兴奋。在后续示例中,我们将展示游戏开发人员如何独立且无需许可地扩展游戏逻辑,以及如何使用临时汇总(Ephemeral Rollups)实现低延迟/高吞吐量交易。

最新 更多 >
  • 1 Robinhood在欧洲推出SOL股权,索拉纳股价飙升| Cryptopolitan

    转换器英语 新闻关闭新闻开放新闻价格预测关闭价格预测开放价格预测学习关闭学习开放学习人工智能关闭人工智能开放人工智能游戏关闭游戏开放游戏比特币Dogecoin骗局币安DeFi Ripple NFT以太坊EFTs Cardano Regulation AAVE Algorand Avalanche比特币现金BNB CAKE Cardano Chainlink CRO Dent Digibyte D

  • 2 澳大利亚BitConnect Frontman认罪

    BitConnect在澳大利亚的全国推广人John Bigatton在被起诉三年半后,对自己在推广该骗局中所起的作用表示认罪。他在社交媒体上推广欺诈性加密货币计划,在全国各地举办研讨会,并与受害者面对面会面,说服他们投资该计划。 Bigatton于5月16日在悉尼地方法院对提供未经许可的金融服务的刑事指控认罪,并将于7月5日接受判决。他将面临经济处罚以及长达两年的监禁。 价值24亿美元的加密骗局

  • 3 EOS区块链在2024年实现收益峰值:Messari Research | Cryptopolitan

    转换器英语 新闻关闭新闻开放新闻价格预测关闭价格预测开放价格预测学习关闭学习开放学习人工智能关闭人工智能开放人工智能游戏关闭游戏开放游戏比特币Dogecoin骗局币安DeFi Ripple NFT以太坊EFTs Cardano Regulation AAVE Algorand Avalanche比特币现金BNB CAKE Cardano Chainlink CRO Dent Digibyte D

  • 4 人工智能基础设施初创公司CoreWeave在黑石牵头的债务交易中筹集75亿美元

    CoreWeave首席执行官Michael Intrator于2024年5月9日参加了CNBC的采访。CNBC 刚刚完成11亿美元的股权融资,人工智能基础设施初创公司CoreWeave筹集了75亿美元的债务,以加大对其云数据中心的投资。在Coatue、Carlyle、BlackRock和其他公司的参与下,黑石集团的基金在本轮贷款中处于领先地位。在两周前的股权融资中,CoreWeave的估值为19

  • 5 海能投顾5月16日机构严选:地产收储政策 能否拯救下行的周期?

    5月16日,海能投顾对本日行情机会进行分析。昨天市场弱势,今天预期如果有继续下探可能会迎来冰点,但开盘直接反弹,交易节奏又变的不那么情绪,低空有利好政策影响,再次爆发,而铜连接,cpo等受到隔夜美股大涨影响,但是毕竟不是主线,很难发酵,地产的轮动相对更好一些,总体都不够强,继续轮动切换,市场没有系统性风险,交易上目前只适合低吸为主,这里需要注意节奏,继续尽量控制好仓位,但也不要猛烈追高,做好风控。

  • 6 WAET:AET Chain在RWA赛道上的战略布局与创新

    引言在当前快速发展的数字经济中,AET生态系统以其独特的创新能力和广泛的应用场景,逐步成为全球数字资产市场的领军者。AET生态系统由公链、数字钱包和AI数字人平台构成,各个部分相互促进,共同构建了一个充满活力和创新的数字世界。通过不断推进技术创新和战略布局,AET生态系统在推动全球数字经济转型中发挥着重要作用。现实世界资产代币化(Real World Asset Tokenization,简称RW

  • 7 随着特斯拉裁员的持续,该公司在加利福尼亚州裁员600人

    在这篇文章TSLA关注你最喜欢的股票REATE FREE帐号 2024年4月24日,在加利福尼亚州弗里蒙特的特斯拉弗里蒙特工厂,一辆崭新的特斯拉汽车停在停车场上。贾斯汀·沙利文|盖蒂图片社 作为特斯拉大规模重组的一部分,这家电动汽车制造商本周通知加州就业发展部,其位于弗里蒙特和帕洛阿尔托之间的制造厂和工程办公室将再裁员约600人。最新一轮裁员取消了从入门级职位到董事的所有职位,并影响了一系列部

  • 8 AI时代的网络:需求从何而来 创新将走向何方?

    摘要网络是AI大模型时代的关键一环。大模型时代,我们已经开始看到光模块、交换机等网络设备迭代加速,需求爆发。但市场对于为何显卡需要搭配大量光模块,以及通信为何成为大模型痛点体会较浅。本文中,我们将从原理出发,探讨网络为何成为AI时代的全新“C位”,并将从最新的产业变化中,讨论未来网络侧的创新与背后的投资机会。网络需求从何而来?进入大模型时代,模型体积和单卡上限之间的差距迅速拉大,业界转而寻求多服务

  • 9 比特币暴涨超7% 近6万人合约爆仓 投资者血本无归

    加密货币市场再度爆发!5月16日,比特币日内一度大涨超7%,站上66000美元,其他加密货币纷纷走强,更有多个品种暴涨超20%。CoinGlass数据显示,最近24个小时,虚拟货币市场共有近6万人爆仓,爆仓总金额为1.57亿美元(约合11.33亿元人民币)。比特币突破66000美元近6万人爆仓5月16日,比特币日内一度大涨超7%,突破66000美元。此外,狗狗币、BNB、SOL等加密货币纷纷走强,

  • 10 京链供应链招商会海外举办情况揭秘

    在全球化的浪潮下,京东工业不甘落后,积极举办招商会,以深化其海外供应链布局,为中国企业的国际化进程提供强有力的支持。此次招商会不仅吸引了业界的广泛关注,更吸引了众多海外优质供应商的目光。越南北部最大的仪器仪表供应商Emin、全球知名品牌个护代理服务商VinhThai以及全球知名办公及工具品牌方DELI VietNam等商家,纷纷与京东工业达成了战略合作。这些合作不仅意味着京东工业在海外市场的进一步