Tác giả: Magicblock; Nguồn: MetaCat
Bài viết này trình bày một hệ thống thành phần thực thể (ECS) sử dụng Bolt engine ), giúp thúc đẩy khả năng sử dụng lại các thành phần và cho phép người dùng sửa đổi và mở rộng logic của trò chơi.
Khung này đơn giản hóa đáng kể việc phát triển dựa trên Solana bằng cách trừu tượng hóa các khái niệm cơ bản như Không gian tài khoản và Địa chỉ bắt nguồn từ chương trình. Để so sánh với các chương trình dựa trên Anchor, hãy xem hướng dẫn này?
https://book.anchor-lang.com/anchor_in_deep/milestone_project_tic-tac-toe .html
Để biết mô tả chi tiết hơn về Bolt, vui lòng tham khảo bài đăng trên blog thông báo?
https: //blog.magicblock.gg/bolt-v0.1/
Phát triển Tic-Tac-Toe
Phần đầu tiên của bài viết này trình bày chi tiết cách sử dụng khung Bolt để triển khai logic trò chơi. Phần thứ hai giải thích cách tích hợp ứng dụng khách dựa trên React với chương trình, bắt đầu bằng việc triển khai Tic-Tac-Toe nguồn mở.
Mã nguồn hoàn chỉnh cho ví dụ này có sẵn ở đây?
https:// github .com/magicblock-labs/bolt-tic-tac-toe
Logic trò chơi: sử dụng Bolt ECS để triển khai tic-tac-toe
Đầu tiên, hãy cài đặt bolt-cli
:
npm install @magicblock-labs/bolt-cli
< p style="text-align: left;">Sau khi cài đặt, tạo một dự án mới bằng lệnh sau:
bolt init tic-tac-toe
Tạo Thành phần
Chúng ta cần xác định cấu trúc dữ liệu cần thiết. Để đơn giản, chúng ta sẽ tạo hai thành phần: một thành phần chứa những người chơi đang hoạt động và thành phần khác chứa thông tin lưới.
Tạo thành phần mới bằng lệnh sau:
bolt comComponent players
Lệnh này tạo thành phần trình phát trong chương trình-ecs/thành phần. Thành phần người chơi chứa khóa chung của hai người chơi có thể được xác định như sau:
use bolt_lang::*;declare_id!("5Xz6iiE2FZdpqrvCKbGqDajNYt1tP8cRGXrq3THSFo1q");#[comComponent]#[derive(Default)] pub struct  ;Người chơi { pub người chơi: [Option<Pubkey>; 2],
Thứ hai Thành phần chứa thông tin lưới. Tạo nó bằng lệnh sau:
bolt comComponent grid
Thành phần lưới có thể được định nghĩa là:
use  ;bolt_lang::*;declare_id!("rdiVoU6KomhXBDMLi6UXVHvmjEUtKqb5iDCWChxMzZ7");#[comComponent]pub& nbsp;struct Grid { pub board: [[Option<Sign & gt;; 3] ; 3], pub state: GameState, pub is_first_player_turn: bool,}#[comComponent_deserialize]#[derive (PartialEq)] pub enum GameState { Hoạt động, Hòa, Thắng { người chiến thắng: Pubkey # ;{ khớp giá trị { 0 = > Ký tên:: _ => Ký tên::0, } ;{ fn default() -> Self { Self::new(GridInit{ board: [[Không có; 3]; 3], state: GameState::Active, ;true, }) }
Tạo hệ thống (Hệ thống)
Hệ thống triển khai logic trò chơi theo cách mô-đun. Chúng hoạt động trên một tập hợp các thành phần đầu vào và có thể thực hiện bất kỳ phép tính nào. Các hệ thống thực thi trong các phiên bản thế giới của bạn và tuân theo các chính sách phê duyệt, ví dụ: một thế giới có thể cho phép bất kỳ ai gửi hệ thống mới, trong khi một thế giới khác có thể yêu cầu sự chấp thuận từ một bên trong danh sách trắng hoặc DAO.
Hệ thống đầu tiên chúng tôi xây dựng sẽ cho phép người chơi tham gia trận đấu:
bolt system join-game
Sửa đổi logic (trong chương trình-ecs/systems/join-game.rs) thành:
#[system]pub mod join_game {  & nbsp; & nbsp; pub & nbsp; thực thi (ctx: & nbsp; bối cảnh & lt; thành phần & gt;, & nbsp; _Args_P: & nbsp; VEC & LT; u8 & gt)) & nbsp;-& gt; & nbsp; kết quả & lt; thành phần & gt; & nbsp; & nbsp = match players.iter_mut().position(|player| player. is_none()) {   ; Some(player_index) => player_index, Không => return Err (PlayersError::GameFull.into()),   ; }; ctx.accounts.players .players[idx] = Some(*ctx.accounts.authority.key); Ok(ctx.accounts) & nbsp;} & nbsp; & nbsp; ; & nbsp; & nbsp; thành phần p; & nbsp; & nbsp; & nbsp; }
Hệ thống thứ hai triển khai logic cốt lõi của trò chơi:
1. Tạo hệ thống chơi trò chơi:
bolt system play
2. Triển khai logic:
< pre> Sử dụng & nbsp; Bolt_lang ::*; sử dụng & nbsp; lưới :: sử dụng lưới & nbsp; Người chơi :: Người chơi; pub fn execute(ctx: Context<Components>, args: Args) -> Result<Components> {   ; let grid = ;&mut ctx.accounts.players; cho thẩm quyền = *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 ); hãy để { 0 } else { 1 }; require!(grid.is_first_player_turn == (player_idx ==  ;0), TicTacToeError::NotPlayersTurn);  ; //Core game logic match args { &nb sp; &nb sp; tile @ Args { => match grid. board[tile.row as usize][tile.column as usize] {   ; Some(_) => return Err(TicTacToeError::TileAlreadySet.into()), ; Không => 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 (lưới,&nb sp ;quyền); & nbsp; & nbsp; & nbsp;} & nbsp; & nbsp;#[System_input] & nbsp; ; & nbsp; & nbsp; & nbsp; pub lưới: Lưới, pub người chơi: }   ;#[đối số] struct Args { hàng: u8, cột: u8, }}pub fn check_winner(lưới: & mut Tài khoản<Grid>, player: Pubkey)  ;{ ...
Xem nguồn đầy đủ mã để biết chi tiết?
https://github.com/magicblock-labs/bolt-tic-tac-toe/blob/main/programs-ecs/systems /play/src/lib.rs
< p style="text-align: left;">Như bạn đã nhận thấy, việc triển khai rất đơn giản. Cấu trúc được gắn thẻ
system_input
xác định gói đầu vào thành phần có thể được truy cập và sử dụng trong hàm
thực thi
. Cấu trúc được đánh dấu
đối số
xác định các đối số mà hệ thống của bạn có thể nhận làm đầu vào.
Xây dựng và thử nghiệm chương trình
Xây dựng chương trình bằng cách sử dụng các lệnh sau:
bolt build
Lệnh này biên dịch chương trình và tự động tạo các loại IDL và TypeScript để tích hợp máy khách.
Quy trình thiết lập các thành phần và hệ thống thực thi bao gồm các bước sau:
-
Khởi tạo một thế giới.
Tạo một thực thể phù hợp.
Đính kèm các thành phần trình phát và lưới vào thực thể phù hợp này.
Thực thi các hệ thống để hỗ trợ quá trình chơi trò chơi.
Bạn có thể tìm thấy các bài kiểm tra TypeScript cho trò chơi Tic-Tac-Toe tại đây?
Kết nối với ứng dụng khách React
Việc kết nối với ứng dụng khách React rất đơn giản, nhờ khả năng truy xuất và tạo động các loại cũng như các khả năng được cung cấp bởi các chức năng Tiện ích SDK TypeScript của Bolt.
Thêm phần phụ thuộc:
yarn add -D @magicblock-labs/bolt-sdk
Ví dụ: để thực thi một hệ thống:
// Thành phần
const GRID_COMPONENT = new PublicKey("rdiVoU6KomhXBDMLi6UXVHvmjEUtKqb5iDCWChxMzZ7");
const PLAYERS_COMPONENT = new PublicKey ("5Xz6iiE2FZdpqrvCKbGqDajNYt1tP8cRGXrq3THSFo1q");
// Hệ thống
const JOIN_GAME = new PublicKey("2umhnxiCtmg5KTn4L9BLo24uLjb74gAh4tmpMLRKYndN");
const PLAY = new PublicKey("DyUy1naq1kb3r7HYBrTf7YhnGMJ5k5NqS3Mh Hừ");
const applySystem = đang chờ ApplySystem({
authority: publicKey,
system: JOIN_GAME,
entity,
thành phần: [PLAYERS_COMPONENT],
});
const giao dịch = applySystem.transaction;
const signature = wait submitTransaction(transaction);
Tìm giao diện người dùng Tic-Tac-Toe đơn giản được tạo bằng React tại đây?
https://github.com/magicblock-labs/bolt-tic-tac-toe/tree/main/app/react-tic-tac-toe
Một khía cạnh quan trọng cần nhấn mạnh làchỉ cần ID để thực thi hệ thống và khởi tạo các thành phần. Điều này có nghĩa là cấu trúc dữ liệu và logic mới có thể được tạo và sử dụng nhanh chóng, cho phép phát triển các bản mod và thay đổi hành vi của trò chơi.
Kết luận
Chúng ta đã tìm hiểu cách sử dụng Bolt ECS Cách triển khai đơn giản trò chơi Tic-Tac-Toe, trình bày cách kết nối nó với React UI. Điều này làm nổi bật sự đơn giản và linh hoạt của framework. Ngoài việc trừu tượng hóa Solana và tái sử dụng logic trên chuỗi, chúng tôi rất vui mừng về những khả năng mà BOLT sẽ mang lại cho việc giới thiệu mod và logic do người dùng tạo. Trong các ví dụ tiếp theo, chúng tôi sẽ chỉ ra cách các nhà phát triển trò chơi có thể mở rộng logic trò chơi một cách độc lập và không cần được phép, cũng như cách sử dụng bản tổng hợp tạm thời để đạt được các giao dịch có độ trễ thấp/thông lượng cao.