使用说明
俄罗斯方块MCP
俄罗斯方块引擎作为 主控程序 (模型上下文协议)服务器,让克劳德通过调用结构化工具玩俄罗斯方块。内置Rust。
这是什么?
克劳德连接到俄罗斯方块MCP服务器,通过调用以下工具玩游戏 get_board_state, move_piece, rotate,以及 hard_drop每场比赛都记录了完整的棋盘状态、动作和克劳德的推理——这样你就可以回放比赛、比较策略,并了解LLM如何实时处理空间推理。
为什么?
只是为了好玩!
我认为获得法学硕士学位来玩一个不太可能擅长的游戏会很有趣。我很好奇它会怎么样。
建筑
┌──────────────┐ MCP (stdio) ┌───────────────┐
│ Claude │ ◄─────────────────► │ MCP Server │
│ (MCP client)│ │ (Rust bin) │
└──────────────┘ └─────┬─────────┘
│
┌──────▼─────────┐
│ Tetris Engine │
│ (Rust lib) │
└──────┬─────────┘
│
┌──────▼─────────┐
│ Game History │
│ (JSON files) │
└──────┬─────────┘
│
┌──────▼─────────┐
│ Web Viewer │
│ (HTML/JS) │
└────────────────┘
发动机 --Rust库板条箱采用标准俄罗斯方块规则:7袋随机数发生器、带壁踢的SRS旋转、线清除、评分。通过种子RNG进行确定性。发动机是基于转弯的,没有重力——碎片不会自动掉落。克劳德明确地移动和放下每一块,使游戏成为一个纯粹的空间推理测试,没有时间压力。这使LLM玩家的事情变得简单和公平。重力和移动预算可以稍后添加为难度模式。
MCP服务器 --Rust二进制文件,封装引擎并将其作为MCP工具在stdio上公开。克劳德调用工具来玩。
游戏历史 --每个游戏都保存为JSON文件,其中包含增量编码的动作(不是全板快照)。网格使用稀疏序列化——只存储已占用的单元格。一个典型的50步游戏大约是20KB。
网络观众 --HTML/JS回放查看器由编译为WASM的引擎驱动。加载游戏历史文件,并通过动画硬下降、逐步控制和擦洗来重放它们。
快速开始
先决条件
运行测试
cargo test -p engine
生成示例游戏
cargo run --example sample_game > viewer/examples/sample_game.json
观众
网络查看器通过动画硬滴、逐步控制和擦洗来重放录制的游戏。
构建
wasm-pack build engine-wasm --target web --out-dir ../viewer/pkg
跑
cd viewer
python3 -m http.server 8080
打开 http://localhost:8080 并将游戏JSON文件拖动到页面上。游戏文件保存到 games/ 在每次MCP会话之后。
控制
| 关键 | 行动 |
|---|---|
| 空格 | 播放/暂停 |
| 向右箭头 | 向前走 |
| 左箭头 | 后退 |
| 主页 | 立即开始 |
| 结束 | 跳转到结束 |
| 拖动滑块 | 拖动时间线 |
| 速度下拉 | 0.5倍至10倍 |
硬滴使碎片掉落而不是传送。
项目结构
tetris-mcp/
├── engine/ # Tetris game engine (library crate)
├── engine-wasm/ # WASM wrapper for the viewer
├── mcp-server/ # MCP server binary
├── viewer/ # HTML/JS replay viewer
│ ├── index.html # Viewer app
│ ├── pkg/ # WASM build output (generated)
│ └── examples/ # Sample game files
└── games/ # Recorded game history (gitignored)
与克劳德一起玩
安装MCP服务器
cargo install --path mcp-server
这将安装 tetris-mcp-server 到 ~/.cargo/bin/.
添加到克劳德代码
添加到您的项目 .claude/settings.json:
{
"mcpServers": {
"tetris": {
"command": "tetris-mcp-server",
"args": []
}
}
}
然后开始一个新的Claude Code会话。克劳德将可以使用俄罗斯方块工具。告诉它玩:
调用get_instructions学习规则,然后玩俄罗斯方块游戏。
CLI选项
tetris-mcp-server [OPTIONS]
Options:
--width <WIDTH> Board width [default: 10]
--height <HEIGHT> Board height [default: 20]
--seed <SEED> RNG seed (random if not set)
--games-dir <DIR> Where to save game history [default: games]
MCP检验员测试
您可以使用官方的MCP检查器在没有Claude的情况下交互式测试服务器:
npx @modelcontextprotocol/inspector tetris-mcp-server -- --seed 42
这将打开一个web UI,您可以在其中浏览工具、手动调用它们并查看响应。
游戏保存到 games/ 作为JSON文件。将它们加载到查看器中以进行回放和比较。
克劳德打得怎么样?
简短的回答:不太好。克劳德了解俄罗斯方块策略,但无法执行。
克劳德尝试什么
- 用左右交替的方式保持木板平整
- 为垂直工字钢Tetrises预留第9列(4行空白)
- 在增加高度之前,先填补较低行的空白
- 旋转零件以适应狭窄的空间(窄柱为L-West,帽间隙为T-South)
实际发生的情况
克劳德无法可靠地预测碎片会落在哪里。核心问题是 空间模拟 --给定工件形状和板状态,计算工件锁定时将占用哪些单元格。对于游戏引擎来说,这是微不足道的,但当你唯一的表示是ASCII文本和坐标列表时,这就很难了。
具体故障模式:
- S/Z件 创建两排高度交错,形成不平坦的表面
- 着陆高度误差 --克劳德计划填充第19行,但该块落在第16行,因为相邻的一列比预期的要高,从而形成了永久性的孔
- 无法接近的孔 累积(每场3-5),使线清除成为不可能
基准测试结果
测试了3种配置:高强度Opus、低强度Sonnet和每种配置两种模式(速度=每次移动2秒,小心=无时间限制)。
| 配置 | 速度平均值 | 小心平均值 | 线条已清除 |
|---|---|---|---|
| 高努力(作品) | 480 | 502 | 0 |
| 低强度(十四行诗) | 418 | 399 | 0 |
游戏文件在 games/ --将它们加载到查看器中进行回放。
Individual game scores
高努力(Opus)
| # | 模式 | 得分 | 游戏文件 |
|---|---|---|---|
| 1 | 速度 | 468 | 0337da12 |
| 2 | 速度 | 484 | a269c166 |
| 3 | 速度 | 488 | e0c29c49 |
| 4 | 小心 | 496 | 93f32d94 |
| 5 | 小心 | 530 | 245cbdcf |
| 6 | 小心 | 480 | a4f89d7c |
轻松(十四行诗)
| # | 模式 | 得分 | 游戏文件 |
|---|---|---|---|
| 1 | 速度 | 478 | 974267f6 |
| 2 | 速度 | 402 | d000e4ae |
| 3 | 速度 | 374 | aee4d5e5 |
| 4 | 小心 | 418 | f37a8222 |
| 5 | 小心 | 386 | eff11e53 |
| 6 | 小心 | 392 | 6004e39e |
- 模型能力>思考时间。 作品平均数~490;十四行诗的平均值约为408。模型之间17%的差距大于两者之间的速度/小心差距。
- 思考时间只会对一个强大的模型有所帮助。 Opus谨慎地将速度提高了5%。十四行诗谨慎实际上 更糟 而不是速度——当推理能力有限时,额外的时间无济于事。
- 线路畅通是罕见和幸运的。 在12场受控比赛中,零线被清除。一个早期的异常值达到1700,有5行空白,这可能是有利的片段序列而不是技能造成的噪音。它从未被复制过。
- 分数几乎完全是硬下降点。 没有清除,得分=2分/行下降。比赛最后以17胜25负的比分结束(370胜530负)。
状态
- 发动机:完成
- WASM查看器:已完成
- MCP服务器:已完成
- Claude集成:准备就绪
这个项目的大部分内容都是用vibe编码的 克劳德代码.