1. 初始化系统
本章将讨论 initiate_system
的实现,它将生成游戏和包含棋子的方格。
什么是initiate_system
?
要下棋,您需要开始游戏并生成棋子。initiate_system
会生成游戏实体,然后将每个棋子放置在适当的位置。确保游戏状态与正确的棋子类型相匹配,并且正确颜色的棋子位于棋盘上的指定位置。
需求
复制下面的单元测试,并将其粘贴到 systems/initiate.cairo
文件的底部
- 在系统中编写一个
execute
函数接受world context, white address, 以及 black address 作为输入。 - 实现由我们上一步骤里创建的
Game
和GameTurn
组件组成的游戏实体。 - 在
Square
组件中实现方格实体,从a1到a8并包含正确的PieceType
。 - 运行
sozo test
并通过所有测试。
测试流程
- 生成测试世界并导入测试中使用的组件和系统。
- 提供黑白玩家的钱包地址作为输入来执行
initiate_system
。 - 获取
initiate_system
过程中创建的游戏实体以及棋子实体。 - 确保游戏已正确创建。
- 确认每个
Piece
都放在正确的Square
上。
单元测试
#[cfg(test)]
mod tests {
use starknet::ContractAddress;
use dojo::test_utils::spawn_test_world;
use dojo_chess::components::{Game, game, GameTurn, game_turn, Square, square, PieceType};
use dojo_chess::systems::initiate_system;
use array::ArrayTrait;
use core::traits::Into;
use dojo::world::IWorldDispatcherTrait;
use core::array::SpanTrait;
#[test]
#[available_gas(3000000000000000)]
fn test_initiate() {
let white = starknet::contract_address_const::<0x01>();
let black = starknet::contract_address_const::<0x02>();
// components
let mut components = array::ArrayTrait::new();
components.append(game::TEST_CLASS_HASH);
components.append(game_turn::TEST_CLASS_HASH);
components.append(square::TEST_CLASS_HASH);
//systems
let mut systems = array::ArrayTrait::new();
systems.append(initiate_system::TEST_CLASS_HASH);
let world = spawn_test_world(components, systems);
let mut calldata = array::ArrayTrait::<core::felt252>::new();
calldata.append(white.into());
calldata.append(black.into());
world.execute('initiate_system'.into(), calldata);
let game_id = pedersen(white.into(), black.into());
//get game
let game = get!(world, (game_id), (Game));
assert(game.white == white, 'white address is incorrect');
assert(game.black == black, 'black address is incorrect');
//get a1 square
let a1 = get!(world, (game_id, 0, 0), (Square));
match a1.piece {
Option::Some(piece) => {
assert(piece == PieceType::WhiteRook, 'should be White Rook');
},
Option::None(_) => assert(false, 'should have piece'),
};
}
}
需要帮助?
如果您遇到困难,请随时到 Dojo 社区 提问!
您可以在这里找到第 1 章的 答案。