boardgame-core/docs/parts-regions-rng.md

2.9 KiB
Raw Blame History

棋子、区域与 RNG

创建和放置 Part

import { createPart, createRegion, moveToRegion } from 'boardgame-core';

const board = createRegion('board', [
    { name: 'row', min: 0, max: 2 },
    { name: 'col', min: 0, max: 2 },
]);

const piece = createPart<{ owner: string }>(
    { regionId: '', position: [], owner: 'white' },
    'piece-1'
);

state.produce(draft => {
    draft.parts[piece.id] = piece;
    // 推荐使用 moveToRegion 自动维护 childIds 和 partMap
    moveToRegion(piece, null, draft.board, [1, 1]);
});

// 或者手动操作(不推荐,容易出错):
// state.produce(draft => {
//     draft.parts[piece.id] = piece;
//     draft.board.childIds.push(piece.id);
//     draft.board.partMap['1,1'] = piece.id;
//     piece.regionId = 'board';
//     piece.position = [1, 1];
// });

Part 池

const pool = createPartPool<{ type: string }>(
    { regionId: 'supply', type: 'kitten' },
    10,
    'kitten'
);

const piece = pool.draw();       // 取出一个
pool.return(piece);              // 放回
pool.remaining();                // 剩余数量

从表格数据创建 Part

const parts = createPartsFromTable(
    [
        { id: 'p1', regionId: 'board', position: [0, 0], owner: 'white' },
        { id: 'p2', regionId: 'board', position: [1, 1], owner: 'black' },
    ],
    (item, index) => item.id,  // 返回 ID 的函数
    // 可选:每个 item 创建几个,默认 1
    1
);

// parts = {
//   'p1': { id: 'p1', regionId: 'board', position: [0, 0], owner: 'white' },
//   'p2': { id: 'p2', regionId: 'board', position: [1, 1], owner: 'black' },
// }

createPartsFromTable 接受对象数组,每个对象的所有字段都会被展开到 Part 中。

查询棋子

// O(n) 遍历查找
findPartById(state.parts, 'piece-1');
getPartAtPosition(state.parts, 'board', [1, 1]);
isCellOccupied(state.parts, 'board', [1, 1]);

// O(1) 使用 Region.partMap 查找
getPartAtPositionInRegion(board, state.parts, [1, 1]);
isCellOccupiedByRegion(board, [1, 1]);

区域操作

import { applyAlign, shuffle, moveToRegion } from 'boardgame-core';

applyAlign(handRegion, state.parts);    // 紧凑排列
shuffle(deckRegion, state.parts, rng);  // 打乱

// 移动棋子sourceRegion 为 null 表示棋子当前不在区域中
moveToRegion(piece, sourceRegion, targetRegion, [0, 0]);
moveToRegion(piece, null, boardRegion, [0, 0]);  // 从外部放入区域
moveToRegion(piece, boardRegion, null);          // 从区域中移除(返回外部)

翻面与掷骰

import { flip, flipTo, roll } from 'boardgame-core';

flip(piece);           // 翻到下一面
flipTo(piece, 2);      // 翻到指定面
roll(piece, rng);      // 随机面

RNG

import { createRNG } from 'boardgame-core';

const rng = createRNG(12345);
rng.nextInt(6);   // 0-5
rng.next();       // [0, 1)

完整 API 列表详见 API 参考