俄罗斯方块游戏引擎

一个基于Rust构建的俄罗斯方块游戏引擎,通过MCP协议让Claude AI进行实时游戏操作,并提供游戏历史记录和Web回放功能。

  • by freezing
  • Rust
  • 本地部署
  • 更新于
在 GitHub 查看 freezing/tetris-mcp

使用说明

俄罗斯方块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编码的 克劳德代码.