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
cat,white,8
cat,black,8
- ```
```
```typescript
import parts from "./parts.csv";
@ -207,38 +207,112 @@ async function turn(game: Game, turnPlayer: PlayerType, turnNumber: number) {
### 4. 创建测试
基于 `createGameContext` 来测试游戏逻辑
测试文件位于 `tests/samples/` 目录下,命名格式为 `<game-name>.test.ts`
- 为每种游戏结束条件准备至少一条测试
- 为每种玩家行动准备至少一条测试
- 使用 `createTestContext()``createTestRegion()` 测试辅助函数
#### 测试要求
**覆盖范围:**
- 每种游戏结束条件至少一条测试
- 每种玩家行动至少一条测试
- 边界条件和异常情况至少一条测试
- 胜利和失败场景各至少一条测试
**测试结构:**
```typescript
import { describe, it, expect } from 'vitest';
import { createGameContext } from '@/core/game';
import { createInitialState, registry, start } from './my-game';
import { registry, createInitialState } from './my-game';
describe('My Game', () => {
it('should detect horizontal win for X', async () => {
const ctx = createGameContext({
initialState: createInitialState(),
registry,
// 测试辅助函数
function createTestContext() {
return createGameContext(registry, createInitialState());
}
// 测试工具函数
describe('Utils', () => {
it('should calculate correct values', () => {
// 测试纯函数逻辑
});
});
// 测试命令
describe('Commands', () => {
it('should perform action correctly', async () => {
const game = createTestContext();
// 设置初始状态
// 执行命令
// 验证状态变化
});
// 执行一系列操作
await ctx.run('play X 0 0');
await ctx.run('play O 1 0');
await ctx.run('play X 0 1');
await ctx.run('play O 1 1');
await ctx.run('play X 0 2');
it('should fail on invalid input', async () => {
const game = createTestContext();
// 测试错误输入
const result = await game.run('invalid-command');
expect(result.success).toBe(false);
});
});
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/regicide/` 获取卡牌游戏的完整示例。
## 相关资源