fix: impl

This commit is contained in:
2026-04-04 22:11:02 +08:00
parent 28782aaf9b
commit e58690c9c6
2 changed files with 32 additions and 14 deletions
+16 -10
View File
@@ -32,12 +32,15 @@ async function place(game: BoopGame, row: number, col: number, player: PlayerTyp
throw new Error(`No ${type} available in ${player}'s supply`);
}
const partId = part.id;
game.produce(state => {
// 将棋子从supply移动到棋盘
const part = state.pieces[partId];
moveToRegion(part, state.regions[player], state.regions.board, [row, col]);
});
return { row, col, player, type, partId: part.id };
return { row, col, player, type, partId };
}
const placeCommand = registry.register( 'place <row:number> <col:number> <player> <type>', place);
@@ -52,12 +55,13 @@ async function boop(game: BoopGame, row: number, col: number, type: PieceType) {
for (const [dr, dc] of getNeighborPositions()) {
const nr = row + dr;
const nc = col + dc;
if (!isInBounds(nr, nc)) continue;
const part = findPartAtPosition(game, nr, nc);
// 从 state 中查找,而不是 game
const part = findPartAtPosition(state, nr, nc);
if (!part) continue;
// 小猫不能推动猫
if (type === 'kitten' && part.type === 'cat') continue;
@@ -70,7 +74,7 @@ async function boop(game: BoopGame, row: number, col: number, type: PieceType) {
// 棋子被推出棋盘,返回玩家supply
booped.push(part.id);
moveToRegion(part, state.regions.board, state.regions[part.player]);
} else if (!isCellOccupied(game, newRow, newCol)) {
} else if (!isCellOccupied(state, newRow, newCol)) {
// 新位置为空,移动过去
booped.push(part.id);
moveToRegion(part, state.regions.board, state.regions.board, [newRow, newCol]);
@@ -122,21 +126,23 @@ async function checkGraduates(game: BoopGame){
}
const player = whites >= WIN_LENGTH ? 'white' : blacks >= WIN_LENGTH ? 'black' : null;
if(!player) continue;
for(const [row, col] of line){
const part = findPartAtPosition(game, row, col);
part && toUpgrade.add(part.id);
}
}
game.produce(state => {
// 预先收集所有可用的猫(在盒子里的)
for(const partId of toUpgrade){
const part = state.pieces[partId];
const [row, col] = part.position;
const player = part.player;
moveToRegion(part, state.regions.board, null);
const newPart = findPartInRegion(game, '', 'cat');
// 使用下一个可用的猫
const newPart = findPartInRegion(state, '', 'kitten', player);
moveToRegion(newPart || part, null, state.regions[player], [row, col]);
}
});