让 Claude 看图、推谐音、键盘输入答案,全自动通关《这是谐音梗》(BadPunPC)。
实战战绩:29 题 100% 通关,85% 一击命中,AI 推理真实准确率约 100%。
《这是谐音梗》(BadPunPC) 是一款基于谐音梗的 Wordle 类益智游戏 —— 看上下两幅图,根据图片差异推出一个谐音相关的成语 / 食物 / 地名等。比如:
- 上图:房子 + 下图:贴满票的房子 → 票房
- 上图:鱿鱼 + 下图:鱿鱼摆摊卖菜 → 油麦菜(鱿→油 同音)
- 上图:戴围巾的鹿 + 下图:两只鹿 → 碌碌无为(鹿鹿→碌碌,无围→无为)
我超喜欢玩这个游戏,就萌生了一个念头:能不能让 AI 替我自动玩? 不是为了刷成绩,是想看看大模型在「看图 + 推中文谐音 + Wordle 风格反馈推理」这个组合任务上表现到底如何。
事实证明 —— 表现非常好。
┌─────────────────┐
│ BadPunPC 游戏 │ Steam 启动,--disable-gpu
│ (WebView2/Win) │
└────────┬────────┘
│ 截屏 (mss)
▼
┌─────────────────────┐
│ Anthropic API │
│ claude-sonnet-4-6 │ System Prompt 内置 5 类谐音梗模板
│ + 多模态视觉理解 │ + 35 对高频谐音对照
│ │ + 类型→答案池常识库
└────────┬────────────┘
│ JSON 结构化返回
│ {candidates, constraints, recommend_action}
▼
┌─────────────────────┐
│ 执行引擎 (PyAuto) │
│ - 点击输入框 │
│ - 粘贴中文(剪贴板) │ ← typewrite 不支持中文,必须走剪贴板
│ - 按 Enter 提交 │
│ - 截屏读颜色反馈 │
│ - 全绿则进下一题 │
└────────┬────────────┘
│
▼
answers.jsonl 增量记账(题号→答案,跨次复用)
关键设计点:
- AI 看图直接出 JSON — 不依赖 OCR,让 Claude 同时干「视觉识别 + 谐音推理 + 颜色解析 + 候选生成」四件事。
- Wordle 反馈喂回 prompt — 每次提交后再截一张图发给 API,让 Claude 自己读历史尝试的 green / orange / gray 颜色。这样不需要写一行 Wordle 解约束代码。
- TAB 提示作为 fallback — confidence 低时让 AI 主动要提示,先拿一个字的拼音锚点再推理。
- 答案库累积 — 解过的题号写到
answers.jsonl,下次跑直接命中缓存跳过推理。
- Windows 10/11
- Python 3.9+
- 这是谐音梗(Steam 上购买)
- Anthropic API Key(在这申请,免费送 $5 够刷 60+ 题)
游戏必须加启动参数才能正常截屏(否则抓到一片黑 —— 详见心路历程):
- 打开 Steam → 库 → 右键 这是谐音梗 → 属性
- 在「通用」标签页 → 启动选项 填入:
--disable-gpu - 关闭属性窗口
git clone https://github.com/<你的用户名>/badpunpc-ai-solver
cd badpunpc-ai-solver/solver
pip install -r requirements.txt# 临时(当前 PowerShell 会话)
$env:ANTHROPIC_API_KEY = "sk-ant-..."
# 或永久(推荐)
[System.Environment]::SetEnvironmentVariable('ANTHROPIC_API_KEY', 'sk-ant-...', 'User')- 从 Steam 启动游戏,进 单人游戏 → 经典题库,停在某未通关题上
- 在终端运行:
python solver.py- 看着 AI 自己解题。按
Ctrl + C随时中止。
claude-badpunpc/
├── README.md ← 你正在读
├── DESIGN.md ← 系统设计文档(架构 + 反馈解析 + 风险点)
├── STRATEGY.md ← 解题策略活文档(5 类模板 + 35 对谐音 + 经验日志)
├── CHANGELOG.md ← 版本变更记录
├── CONTRIBUTING.md ← 贡献指南
├── CITATION.cff ← 学术引用元数据
├── LICENSE ← MIT
├── answers.jsonl ← 答案知识库(累积式)
├── .github/ ← issue / PR 模板 + CI workflow
└── solver/
├── solver.py ← 主程序(约 220 行)
├── pyproject.toml ← 包元数据 + ruff 配置
├── requirements.txt ← Python 依赖
└── README.md ← solver 内部使用说明
整个系统的"智能"几乎全部压在 solver.py 的 SYSTEM_PROMPT 字符串里。这是 v2 版(蒸馏自 29 题实战),包含:
- 5 类谐音梗模板(A 组合 / B 同音异调 / C 场景成语 / D 双重谐音 / E 反讽)
- 35 对高频谐音字对照表(鱿→油、寒→韩、电→淀…)
- 类型 → 答案池常识库(成语、食物、电影术语等 16 个类型的常见答案)
- 元规则(如"上图叠词→同音叠字成语"、"下图新动作=一个字")
- 反模式警示(如"视觉直觉 ≠ 谐音对",避免重蹈第一次踩的坑)
改 prompt 不需要重新部署 —— 这是这个架构最大的优点。每解一道新题型,把经验加进 prompt,下次启动就立刻生效。
让 Claude 返回结构化 JSON 而不是自由文本,程序好接管:
看到截图 →
├─ 视觉清晰 + 谐音强联系 → submit, confidence > 0.85
├─ 视觉清晰但谐音说不通 → hint (拿 1 字锚点)
├─ 有历史 attempts:
│ ├─ 有绿色 → 锁定位置,挑符合的同长候选
│ ├─ 有橙色 → 把橙色字/拼音挪到别的位置
│ └─ 全灰 → 完全换思路,不要近邻替换
└─ 无方向且已试 2 次 → hint
实战数据(前 29 题完整记录见 answers.jsonl,老司机期含后续未入库新一批):
| 维度 | 数据 |
|---|---|
| 通关率 | 100% |
| 一击命中(零错零提示) | ~85%(老司机期稳定值) |
| 至多一次提示后通关 | 100% |
| 平均尝试次数 | ~1.2 次 |
类型多样性:覆盖 16 个类别 —— 成语 / 食物 / 电影术语 / 历史人物 / 职业 / 饮品 / 地名 / 数学 / 校园生活 / 基础设施 / 地质时期 / 玩具 / 国学 / 动物 / 评价 / 娱乐。
学习曲线(一击命中率随策略库迭代单调上升):
| 批次 | 一击命中率 |
|---|---|
| 探索期(前 6 题,No.82-87) | 33% |
| 巡航期(中 7 题,No.88-94) | 71% |
| 老司机期(No.95+,含后续新一批) | 85% |
策略库的正反馈循环非常明显 —— 每解一题,prompt 就更强一分。从「视觉直觉乱猜」到「先类型→再谐音对→再候选池」的稳定流程,一击命中率提升 2.5 倍。
Steam 上下载到《这是谐音梗》后我玩到深夜:「这是房子 → 这是票房」第一题就让我笑出声。每一道题的解法都是大脑里一次微小的爆炸 —— 视觉理解、汉字音韵、文化典故全部一起转。
玩到 No.80 多关时一个念头冒出来:Claude 的多模态能力不是号称很强吗?让它来玩这个会怎样?
不是为了"代打"刷成绩 —— 是好奇大模型在这种高度本土化、需要文化常识 + 音韵推理 + 视觉理解 + 反馈推理的混合任务上的真实水平。
最初只是随便聊:「Claude 你能截图玩这个游戏吗?」
然后发现一连串现实问题:
第一次截屏,BadPunPC 窗口区域是纯黑色。我以为是工具坏了,研究半天才搞清:游戏用了 GPU 硬件加速渲染(DirectComposition / WebView2 独立 swap chain),标准 Windows 截屏 API(GDI BitBlt)根本抓不到 GPU 帧。
解决:在 Steam 启动选项加 --disable-gpu。这条命令告诉 WebView2 走 CPU 软件渲染,截屏立刻能抓到画面了。代价是渲染稍慢、窗口偶尔出现 letterbox 黑边,但完全可以接受。
open_application() 调用后,游戏窗口在视觉上确实在最前,但键盘焦点还在桌面 shell。任何 click 和 type 都被拦截。
试了一圈:SetForegroundWindow Windows API 有「焦点保护」会拒绝。pygetwindow.activate() 同上。Alt+Tab 需要系统级权限。
解决:让用户手动点一下游戏窗口给焦点。这条没法完全自动化(除非用 win32 API 模拟 ALT 释放骗过保护)。文档里写清楚了。
pyautogui.typewrite("油麦菜") —— 啥也没打进去。原来 typewrite 只支持 ASCII。
解决:走系统剪贴板:
import pyperclip
pyperclip.copy("油麦菜")
pyautogui.hotkey("ctrl", "v")这条路同时解决了「打中文」和「绕过 IME」两个问题。
第二次截屏看到画面了 —— 上下两幅图、4 个空格框、几个圆点。但怎么判断答错了?怎么解析颜色?
我让 Claude 故意答错几道题,记录每种颜色:
| 颜色 | 含义 | 我们叫它 |
|---|---|---|
| 🟢 绿色 | 字 + 拼音 + 位置全对 | "锁死" |
| 🟠 橙色 | 字 / 拼音在答案中但位置错 | "重排" |
| ⚪ 白底灰字 | 不在答案里 | "排除" |
橙色我们到 No.92 方程式 才第一次见到 —— 错答「正方形」时 方 显示橙色,立刻知道方在答案中但不在 pos 2,结合「方在 pos 1 + 数学 3 字」推出 方程式。这次反馈循环跑通是 milestone。
重要洞见:不需要写 Wordle 求解代码 —— 把截图喂回 Claude,让它自己读颜色、自己生成约束、自己出新候选。模型的视觉理解 + 推理能力顶得上几百行 if-else。
最初的 prompt 很简单:「这是个谐音梗游戏,看图猜答案」。结果 Claude 的第一枪经常错 —— 比如 No.84「狗在木筏上」,AI 押了视觉直觉的「汪洋大海」,但真答案是「过目不忘」(不汪→不忘 同音异调)。
我意识到:AI 缺的不是智力,是"题感"。它不知道这游戏偏爱哪些套路。
于是开始把每道题的经验提炼成模板,写进 prompt:
模板 A:组合谐音 — 上图主体首字同音替换 + 下图新增元素
模板 B:单字同音异调
模板 C:场景成语
模板 D:双重谐音 — 上图谐音 X' + 下图谐音 Y'
模板 E:反讽谐音(最神奇 —— 视觉 negative,答案 positive)
每解一题,把谐音字对(鱿→油、寒→韩、电→淀…)写进 prompt 表格里。29 题下来累积了 35 对。
效果立竿见影 —— 一击命中率从前 6 题的 50% 升到后 16 题的 75%。
到 20 多题时,「Claude in chat」 + computer use 已经验证了概念。下一步是把它做成独立 Python 程序,让任何人下载下来配个 API Key 就能跑。
solver.py 大约 220 行,关键就是:
- 用
mss截屏,转 base64 - 用
anthropicSDK 发给 Claude API(多模态消息) - 解析返回的 JSON,按
recommend_action走 submit / hint / skip pyperclip+pyautogui模拟键鼠操作- 主循环 + answers.jsonl 缓存
最关键的还是 SYSTEM_PROMPT —— 我们这一路所有的经验都浓缩在那 100 多行字符串里。改 prompt 不用重新部署,这是这个架构最大的爽点。
- 验证缓存命中 —— 题号缓存对了之后再发一张截图给 API 校验场景一致(防止题库改动)
- 像素级颜色读取 —— 用 PIL 直接读 RGB 判定绿/橙/灰,省 API token
- 图像模板匹配 —— 用 OpenCV 自动定位输入框,摆脱硬编码坐标
- 本地 VLM 替代 —— Qwen2-VL 跑通后,零成本刷题
- 题库爬取 —— 用 OCR 把所有题号 + 答案爬一遍,生成完整题库
- --disable-gpu 没加 → 截屏全黑,研究两小时
- Windows 焦点保护 → 用户必须手动 click 一次游戏窗口
- typewrite 不支持中文 → 改用剪贴板粘贴
- 手算 Unicode 转义码笔误 → 把 螺(螺) 写成 螂(螂),把 煲(煲) 写成 煋(煋),把 煽(煽) 写成 熙(煕)。栽了 3 次。直接写中文字符就行了,让 JSON 自己处理编码
- 「恭喜通关」按钮 click 经常无效 → 用 Enter 键 推进下一题
- 游戏偶尔会回主菜单(窗口失焦超时?) → 写了导航回 经典题库 → 继续 的逻辑
--disable-gpu模式下窗口偶尔出现黑色 letterbox → 每次操作前必须重新截屏定位坐标- 进度点的颜色解析 —— 黄色 = 已用错误次数,灰色 = 未用,提示不计入
- 《这是谐音梗》(BadPunPC) 制作组 —— 谢谢做了这么好玩的游戏
- Anthropic Claude —— 真正的解题大脑
- 各位作者 —— 沧海一声啸 / 仓薯 / 天天谐音梗 / 画点冷笑画 / 覃 / 脑洞君 / Cinderella / 月月鸟 / 童心看世界 / 梅梅心灵小屋 / 鼠鸣 / 夜风吹纱 / 岚月栖夜 / 小z / 吐司面包 / 汉堡贼 / 肠粉一份 / 画画的思诺 / CiCi —— 你们的脑洞撑起了整个游戏
MIT。游戏本身版权归原制作组所有,本项目只是辅助工具,不分发任何游戏内容(题库截图、答案表都是用户自己运行时生成的)。
如果你也喜欢这个游戏,建议先自己玩再用 AI —— 自己解出谐音梗的快乐,AI 替代不了。
{ "puzzle_no": 88, "category": "职业", "length": 2, "top_caption": "这是演员", "bottom_visual": "演员倒立(头朝下)", "is_won": false, "previous_attempts": [...], "constraints": { "locked": {"3": "肠"}, // 已绿的字 "exclude_chars": ["火","腿"], "exclude_pinyins": ["huǒ","tuǐ"] }, "candidates": [ {"answer": "导演", "reasoning": "倒演 dào yǎn → 导演 dǎo yǎn 同音异调", "confidence": 0.95} ], "recommend_action": "submit" // submit | hint | skip }