المؤلف: Magicblock المصدر: MetaCat
توضح هذه المقالة نظام مكونات الكيان (ECS) باستخدام Bolt Engine ) الذي يعزز إمكانية إعادة استخدام المكونات ويمكّن المستخدمين من تعديل وتوسيع منطق اللعبة.
يعمل إطار العمل على تبسيط عملية التطوير المستندة إلى Solana بشكل كبير من خلال تجريد المفاهيم الأساسية مثل مساحة الحساب والعناوين المشتقة من البرنامج. للمقارنة مع البرامج المستندة إلى Anchor، راجع هذا البرنامج التعليمي؟
https://book.anchor-lang.com/anchor_in_ Deep/milestone_project_tic-tac-toe .html
للحصول على وصف أكثر تفصيلاً لـ Bolt، يرجى الرجوع إلى منشور مدونة الإعلان؟
https: //blog.magicblock.gg/bolt-v0.1/
تطوير Tic-Tac-Toe
يوضح الجزء الأول من هذه المقالة كيفية استخدام إطار عمل Bolt لتنفيذ منطق اللعبة. يشرح الجزء الثاني كيفية دمج عميل قائم على React مع البرنامج، بدءًا من تطبيق Tic-Tac-Toe مفتوح المصدر.
كود المصدر الكامل لهذا المثال متاح هنا؟
https:// github .com/magicblock-labs/bolt-tic-tac-toe
منطق اللعبة: استخدام Bolt ECS لتنفيذ tic-tac-toe
أولاً، قم بتثبيت bolt-cli
:
npm install @magicblock-labs/bolt-cli
< p style="text-align: left;">بعد التثبيت، أنشئ مشروعًا جديدًا باستخدام الأمر التالي:
bolt init tic-tac-toe
إنشاء مكون
نحن بحاجة إلى تحديد بنية البيانات المطلوبة. للتبسيط، سنقوم بإنشاء مكونين: أحدهما يحتوي على اللاعبين النشطين والآخر يحتوي على معلومات الشبكة.
قم بإنشاء مكون جديد باستخدام الأمر التالي:
bolt component players
ينشئ هذا الأمر مكونًا للاعبين ضمن Program-ecs/components. يمكن تعريف مكون المشغل الذي يحمل المفاتيح العامة للاعبين على النحو التالي:
use bolt_lang::*;declare_id!("5Xz6iiE2FZdpqrvCKbGqDajNYt1tP8cRGXrq3THSFo1q");#[component]#[derive(Default)] pub struct  ;اللاعبون { pub اللاعبون: [Option<Pubkey>; 2],
الثاني يحتوي المكون على معلومات الشبكة. قم بإنشائه باستخدام الأمر التالي:
bolt component grid
يمكن تعريف مكون الشبكة على النحو التالي:
use  ;bolt_lang::*;declare_id!("rdiVoU6KomhXBDMLi6UXVHvmjEUtKqb5iDCWChxMzZ7");#[component]pub& nbsp;struct Grid { pub [ [الخيار<التوقيع>; 3] ; 3], pub state: GameState, pub is_first_player_turn: bool,}#[component_deserialize]#[derive (PartialEq)] حانة تعداد GameState { نشطة، تعادل، فاز { الفائز: Pubkey&nb س؛ },}# [component_deserialize]#[derive(PartialEq)]pub enum Sign { ; مطابقة القيمة { 0 = > التوقيع:: _ => التوقيع::0, } ;{ fn default() -> Self { Self::new(GridInit{ اللوحة: [[لا شيء; 3]; 3], state: }) }
إنشاء نظام (الأنظمة)
ينفذ النظام منطق اللعبة بطريقة معيارية. تعمل على مجموعة من مكونات الإدخال ويمكنها إجراء أي عملية حسابية. يتم تنفيذ الأنظمة داخل مثيلات عالمك وتخضع لسياسات الموافقة، على سبيل المثال، قد يسمح أحد العوالم لأي شخص بإرسال أنظمة جديدة، بينما قد يتطلب عالم آخر موافقة من طرف مدرج في القائمة البيضاء أو DAO.
النظام الأول الذي قمنا ببنائه سيسمح للاعبين بالانضمام إلى المباراة:
bolt system join-game
تعديل المنطق (في Program-ecs/systems/join-game.rs) إلى:
#[system]pub mod join_game {  & & nbsp; & nbsp; pub & nbsp; تنفيذ (ctx: & nbsp; context & lt; المكونات & gt;, & nbsp; _Args_P: & nbsp; VEC & LT; u8 & gt)) & nbsp;-& gt; & nbsp; المكونات & gt & nbsp; is_none()) {   ; Some(player_index) => player_index, لا شيء => return Err (PlayersError::GameFull.into()),   ; }; ctx.accounts.players .players[idx] = Some(*ctx.accounts.authority.key); Ok(ctx.accounts) } & nbsp; & nbsp;#[إدخال النظام] & nbsp; & nbsp; & nbsp; & nbsp; }}
النظام الثاني ينفذ المنطق الأساسي للعبة:
1. إنشاء نظام تشغيل اللعبة:
bolt system play
2. تنفيذ المنطق:
< pre> Use & nbsp; pub fn تنفيذ(ctx: السياق<المكونات>, الوسائط: الوسائط) -> النتيجة<المكونات> { &nb sp & nbsp ؛ & nbsp ؛ & nbsp ؛ *ctx.accounts.authority.key; تتطلب!(players.players[0] == بعض(السلطة) || players.players[1] == Some(authority) , TicTacToeError::NotInGame); require!(grid.state == grid::GameState::Active, TicTacToeError::NotActive ); 1 & nbsp ؛} ؛ & nbsp ؛ & nbsp ؛ & nbsp ؛ & nbsp ؛ & nbsp ؛ & nbsp ؛ & nbsp ؛ ; //منطق اللعبة الأساسي تطابق الحجج { &n بسب؛ بلاط @ board[tile.row as usize][tile.column as usize] { Some(_) => return Err(TicTacToeError::TileAlreadySet.into()), ; لا شيء => grid.board[tile.row as usize][tile.column  ;as usize] = Some(grid::Sign::from_usize( player_idx)); }   ; },   ; _ => return Err(TicTacToeError: :TileOutOfBounds.into()), } grid.is_first_player_turn = !grid .is_first_player_turn; check_winner (gri د، & نبسب ; & nbsp;} & nbsp; {& nbsp; & nbsp; الشبكة, اللاعبون, }   ;#[الحجج] struct Args { الصف: u8, العمود: u8, }}pub check_winner(grid: & mut Account<Grid>, player: Pubkey)  ;{ ...
شاهد المصدر كاملاً رمز للحصول على التفاصيل؟
https://github.com/magicblock-labs/bolt-tic-tac-toe/blob/main/programs-ecs/systems /play/src/lib.rs
< p style="text-align: left;">كما لاحظت، التنفيذ بسيط جدًا. تحدد البنية الموسومة
system_input
حزمة إدخال المكونات التي يمكن الوصول إليها واستخدامها في وظيفة
تنفيذ
. تحدد الهياكل المميزة بالوسائط
الوسائط التي يمكن لنظامك استقبالها كمدخلات. إنشاء البرنامج واختباره
إنشاء البرنامج باستخدام الأوامر التالية :
bolt build
يقوم هذا الأمر بتجميع البرنامج وإنشاء أنواع IDL وTypeScript تلقائيًا لتكامل العميل.
تتضمن عملية إعداد المكونات وأنظمة التنفيذ الخطوات التالية:
-
إنشاء مثيل للعالم.
إنشاء كيان مطابق.
قم بإرفاق مكونات المشغل والشبكة بهذا الكيان المطابق.
نفذ الأنظمة لتسهيل اللعب.
يمكن العثور على اختبارات TypeScript للعبة Tic-Tac-Toe هنا؟
الاتصال بعميل React
الاتصال بعميل React بسيط للغاية، وذلك بفضل الاسترجاع الديناميكي وإنشاء الأنواع والإمكانيات التي توفرها وظائف Bolt TypeScript SDK Utility.
إضافة التبعيات:
yarn add -D @magicblock-labs/bolt-sdk
على سبيل المثال، لتنفيذ نظام:
// المكونات
const GRID_COMPONENT = new PublicKey("rdiVoU6KomhXBDMLi6UXVHvmjEUtKqb5iDCWChxMzZ7");
const PLAYERS_COMPONENT = new PublicKey ("5Xz6iiE2FZdpqrvCKbGqDajNYt1tP8cRGXrq3THSFo1q");
// الأنظمة
const JOIN_GAME = new PublicKey("2umhnxiCtmg5KTn4L9BLo24uLjb74gAh4tmpMLRKYndN");
const PLAY = new PublicKey("DyUy1naq1kb3r7HYBrTf7YhnGMJ5k5NqS3Mh k65GfSih");
const ApplySystem = انتظار ApplySystem({
السلطة: المفتاح العام,
النظام: JOIN_GAME,
الكيان,
المكونات: [PLAYERS_COMPONENT],
});
معاملة const = ApplySystem.transaction;
const التوقيع = انتظار SubmitTransaction(transaction);
هل تبحث عن واجهة مستخدم بسيطة لـ Tic-Tac-Toe تم إنشاؤها باستخدام React هنا؟
https://github.com/magicblock-labs/bolt-tic-tac-toe/tree/main/app/react-tic-tac-toe
أحد الجوانب المهمة التي يجب التأكيد عليها هو أنهناك حاجة إلى المعرفات فقط لتنفيذ النظام وإنشاء المكونات. وهذا يعني أنه يمكن إنشاء هياكل منطقية وبيانات جديدة واستخدامها بسرعة، مما يسمح بتطوير التعديلات وتغيير سلوك الألعاب.
الاستنتاج
لقد مررنا باستخدام بولت ECS تطبيق بسيط للعبة Tic-Tac-Toe، يوضح كيفية توصيلها بواجهة مستخدم React. وهذا يسلط الضوء على بساطة ومرونة الإطار. بالإضافة إلى تجريد Solana وإعادة استخدام المنطق الموجود على السلسلة، نحن متحمسون بشأن الإمكانيات التي سيوفرها BOLT للمنطق الذي أنشأه المستخدم ومقدمة التعديل. في الأمثلة اللاحقة، سنوضح كيف يمكن لمطوري الألعاب توسيع نطاق منطق اللعبة بشكل مستقل ودون إذن، وكيفية استخدام المجموعات المؤقتة لتحقيق زمن استجابة منخفض/معاملات إنتاجية عالية. ص>