1. 初始化系统

本章将讨论 initiate_system 的实现,它将生成游戏和包含棋子的方格。

什么是initiate_system

要下棋,您需要开始游戏并生成棋子。initiate_system 会生成游戏实体,然后将每个棋子放置在适当的位置。确保游戏状态与正确的棋子类型相匹配,并且正确颜色的棋子位于棋盘上的指定位置。

image

需求

复制下面的单元测试,并将其粘贴到 systems/initiate.cairo文件的底部

  1. 在系统中编写一个 execute函数接受world context, white address, 以及 black address 作为输入。
  2. 实现由我们上一步骤里创建的 GameGameTurn 组件组成的游戏实体。
  3. Square组件中实现方格实体,从a1到a8并包含正确的PieceType
  4. 运行 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 章的 答案