feat: update skill def

This commit is contained in:
hyper 2026-04-10 13:45:10 +08:00
parent 617057988d
commit 5849c0a343
1 changed files with 92 additions and 18 deletions

View File

@ -105,7 +105,7 @@ kitten,white,8
kitten,black,8 kitten,black,8
cat,white,8 cat,white,8
cat,black,8 cat,black,8
- ``` ```
```typescript ```typescript
import parts from "./parts.csv"; import parts from "./parts.csv";
@ -207,40 +207,114 @@ async function turn(game: Game, turnPlayer: PlayerType, turnNumber: number) {
### 4. 创建测试 ### 4. 创建测试
基于 `createGameContext` 来测试游戏逻辑 测试文件位于 `tests/samples/` 目录下,命名格式为 `<game-name>.test.ts`
- 为每种游戏结束条件准备至少一条测试 #### 测试要求
- 为每种玩家行动准备至少一条测试
- 使用 `createTestContext()``createTestRegion()` 测试辅助函数
**覆盖范围:**
- 每种游戏结束条件至少一条测试
- 每种玩家行动至少一条测试
- 边界条件和异常情况至少一条测试
- 胜利和失败场景各至少一条测试
**测试结构:**
```typescript ```typescript
import { describe, it, expect } from 'vitest';
import { createGameContext } from '@/core/game'; import { createGameContext } from '@/core/game';
import { createInitialState, registry, start } from './my-game'; import { registry, createInitialState } from './my-game';
describe('My Game', () => { describe('My Game', () => {
it('should detect horizontal win for X', async () => { // 测试辅助函数
const ctx = createGameContext({ function createTestContext() {
initialState: createInitialState(), return createGameContext(registry, createInitialState());
registry, }
// 测试工具函数
describe('Utils', () => {
it('should calculate correct values', () => {
// 测试纯函数逻辑
});
});
// 测试命令
describe('Commands', () => {
it('should perform action correctly', async () => {
const game = createTestContext();
// 设置初始状态
// 执行命令
// 验证状态变化
}); });
// 执行一系列操作 it('should fail on invalid input', async () => {
await ctx.run('play X 0 0'); const game = createTestContext();
await ctx.run('play O 1 0'); // 测试错误输入
await ctx.run('play X 0 1'); const result = await game.run('invalid-command');
await ctx.run('play O 1 1'); expect(result.success).toBe(false);
await ctx.run('play X 0 2'); });
});
expect(ctx.value.winner).toBe('X'); // 测试完整游戏流程
describe('Game Flow', () => {
it('should complete a full game cycle', async () => {
// 模拟完整游戏流程
});
}); });
}); });
``` ```
**测试规范:**
- 使用 `createGameContext(registry, initialState)` 创建测试上下文
- 使用 `game.run('command args')` 执行命令
- 验证 `game.value` 的状态变化,而非命令返回值
- 不要使用 `console.log` 或其他调试输出
- 使用 `describe` 分组相关测试
- 测试命名使用 `should...` 格式描述预期行为
- 异步测试使用 `async/await`
**命令测试示例:**
```typescript
it('should deal damage to enemy', async () => {
const game = createTestContext();
setupTestGame(game); // 自定义测试设置
const enemyHpBefore = game.value.currentEnemy!.hp;
await game.run('play player1 card_1');
// 验证状态变化
expect(game.value.currentEnemy!.hp).toBeLessThan(enemyHpBefore);
expect(game.value.playerHands.player1).not.toContain('card_1');
});
it('should fail if card not in hand', async () => {
const game = createTestContext();
setupTestGame(game);
const result = await game.run('play player1 invalid_card');
expect(result.success).toBe(false);
if (!result.success) {
expect(result.error).toContain('不存在');
}
});
```
**运行测试:**
```bash
# 运行所有测试
npm run test:run
# 运行特定测试文件
npx vitest run tests/samples/my-game.test.ts
# 运行特定测试用例
npx vitest run -t "should deal damage" tests/samples/my-game.test.ts
```
## 完整示例 ## 完整示例
参考 `src/samples/boop/` 获取完整的`boop`游戏实现。 参考 `src/samples/boop/` 获取完整的`boop`游戏实现。
参考 `src/samples/regicide/` 获取卡牌游戏的完整示例。
## 相关资源 ## 相关资源
- [API 参考](./references/api.md) - 完整的 API 文档 - [API 参考](./references/api.md) - 完整的 API 文档
- [AGENTS.md](../../AGENTS.md) - 项目代码规范和架构说明 - [AGENTS.md](../../AGENTS.md) - 项目代码规范和架构说明