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

时间:2024-09-21 编辑: 浏览:(954)

作者: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 Chainlink价格超过BCH收回100亿美元估值

    5月24日(星期五),Chainlink价格突破17.70美元,达到45天的峰值,因为本周以太坊(ETH)现货ETF获得批准后,鲸鱼投资者开始疯狂购买LINK。 以太坊ETF获批后,Chainlink赶超比特币现金 自5月23日以太坊ETF获批以来,有人观察到加密货币投资者采取了合谋的行动,将资金转向以太坊市场以及以太坊区块链网络上的关键项目。 Chainlink被广泛认为是市场领导者,提供复杂智

  • 2 比特币和以太坊价格显示稳定-最新加密货币新闻

    比特币目前的交易价格为69330美元,而以太坊则徘徊在3800美元左右。在5月一个相对平静的周日,Chiliz(CHZ)吸引了投资者的注意,涨幅达15%。Dogecoin(DOGE)和Chiliz(CHZ)的最新价格预测是什么? 内容隐藏1 Chiliz(CHZ)价格预测2 Dogecoin(DOGE)怎么样?投资者的3个关键见解 Chiliz(CHZ)价格预测 此前,有人指出,

  • 3 分析师预计加密货币市场增长-最新加密货币新闻

    分析师Michael van de Poppe最近的评估表明,加密货币市场的动态发生了变化。Van de Poppe认为,市场目前处于大幅调整后的盘整阶段,尤其是跌幅在50%至70%之间的替代币,在超过之前的历史高点之前,可能会经历进一步的盘整。 隐藏的内容1加密货币市场价值能否达到15万亿美元?2合并阶段的意义是什么?投资者的3大收获 加密货币市场价值能达到15万亿美元吗? V

  • 4 有麻烦-加密影响者和名人X账户被黑客攻击

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

  • 5 前三个硬币可能是你的加密货币投资组合的一个很好的恢复选择。

    TLDR Milei Moneda是一款受Javier Milei启发的表情包代币,目前正在进行预售,并提供NFT和赌注等福利。随着USDT的集成和即将推出的NOT代币,Toncoin正在获得吸引力,该代币得到了币安等主要交易所的支持。Pepe币已飙升至新高,吸引了Smart Money交易员,并显示出强大的投资组合建设潜力。随着加密货币市场的波动,投资者不断寻找有前景的代币来振兴他们的投资组合。

  • 6 一名女子因洗钱64亿美元诈骗比特币收益入狱约7年:报告

    据报道,一名中国女子因参与洗钱数十亿美元诈骗案而被指控入狱。 据路透社报道,温建在3月份被陪审员裁定犯有一项洗钱罪后,于周五被判处六年零八个月监禁。 检察官表示,温将比特币转换为现金和财产,以隐藏据称在2014年至2017年间发生在中国的64亿美元财富计划中从近13万名投资者那里窃取的资金来源。 据信,该计划是由另一名女性策划的,她在2017年中国当局开始调查后逃到了英国。据称,温是帮助将被盗资金

  • 7

  • 8 Apu社区通过收购超稀有域名Apu获得大奖。组件对象模型

    新闻稿。 经过与前所有者的长期讨论,高级委员会成员Peter Hedges获得了备受追捧的域名apu.com,这标志着阿普社区的分水岭时刻。此次收购值得注意,因为三个字母的域名并不常见,需求量很大,价格高达数十万至数百万美元。 彼得·赫奇斯强调,apu.com的不活跃是对互联网上最著名的模因之一的伤害。Apu Apustaja硬币市值超过3.5亿美元,其表现优于全球许多企业,值得成为如此高价值的领

  • 9 特朗普对加密货币的支持如何推动这5种新硬币的发展

    随着2024年牛市的进行,美国前总统等知名人士的支持可能会改变新兴加密货币的游戏规则。对市场情绪的影响是巨大的,可能会将精选硬币推向聚光灯下。这种影响范围从经验丰富的投资者扩展到那些新接触加密货币的投资者,引起了人们的关注和投资激增。这篇文章深入了解了这种政治支持如何成为五种新兴加密货币的重要催化剂。CYBRO预售运行迅速,2500万代币已售罄CYBRO是一个独一无二的市场,利用了Blast区块链

  • 10 Shiba Inu ETF获批:加密货币投资者的新时代?

    今年,数字资产市场见证了以太坊和比特币ETF的突破性批准。这一事态发展标志着金融部门的风险敞口和知名度发生了巨大转变。随着更多资产有望获得类似的投资产品,Shiba Inu ETF是否即将问世?已经有人讨论过比特币和以太坊之后的加密货币。渣打银行已经预测,Solana和Ripple将在2025年推出ETF。然而,按市值计算,第二大迷因币拥有自己的投资工具迭代,将真正标志着一个全新时代的到来。另请阅