Skip to content

xiaoshuntian/claude-badpunpc

Repository files navigation

BadPunPC AI 自动解题器 🎮🤖

让 Claude 看图、推谐音、键盘输入答案,全自动通关《这是谐音梗》(BadPunPC)。

CI License: MIT Python 3.10+ Claude Platform: Windows PRs Welcome

实战战绩: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 增量记账(题号→答案,跨次复用)

关键设计点

  1. AI 看图直接出 JSON — 不依赖 OCR,让 Claude 同时干「视觉识别 + 谐音推理 + 颜色解析 + 候选生成」四件事。
  2. Wordle 反馈喂回 prompt — 每次提交后再截一张图发给 API,让 Claude 自己读历史尝试的 green / orange / gray 颜色。这样不需要写一行 Wordle 解约束代码
  3. TAB 提示作为 fallback — confidence 低时让 AI 主动要提示,先拿一个字的拼音锚点再推理。
  4. 答案库累积 — 解过的题号写到 answers.jsonl,下次跑直接命中缓存跳过推理。

🚀 快速开始

前置要求

  • Windows 10/11
  • Python 3.9+
  • 这是谐音梗(Steam 上购买)
  • Anthropic API Key(在这申请,免费送 $5 够刷 60+ 题)

1. 配置游戏

游戏必须加启动参数才能正常截屏(否则抓到一片黑 —— 详见心路历程):

  1. 打开 Steam → 库 → 右键 这是谐音梗 → 属性
  2. 在「通用」标签页 → 启动选项 填入:--disable-gpu
  3. 关闭属性窗口

2. 安装依赖

git clone https://github.com/<你的用户名>/badpunpc-ai-solver
cd badpunpc-ai-solver/solver
pip install -r requirements.txt

3. 配置 API Key

# 临时(当前 PowerShell 会话)
$env:ANTHROPIC_API_KEY = "sk-ant-..."

# 或永久(推荐)
[System.Environment]::SetEnvironmentVariable('ANTHROPIC_API_KEY', 'sk-ant-...', 'User')

4. 启动求解器

  1. 从 Steam 启动游戏,进 单人游戏 → 经典题库,停在某未通关题上
  2. 在终端运行:
python solver.py
  1. 看着 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 内部使用说明

🧠 核心设计

System Prompt(智能所在)

整个系统的"智能"几乎全部压在 solver.pySYSTEM_PROMPT 字符串里。这是 v2 版(蒸馏自 29 题实战),包含:

  • 5 类谐音梗模板(A 组合 / B 同音异调 / C 场景成语 / D 双重谐音 / E 反讽)
  • 35 对高频谐音字对照表(鱿→油、寒→韩、电→淀…)
  • 类型 → 答案池常识库(成语、食物、电影术语等 16 个类型的常见答案)
  • 元规则(如"上图叠词→同音叠字成语"、"下图新动作=一个字")
  • 反模式警示(如"视觉直觉 ≠ 谐音对",避免重蹈第一次踩的坑)

改 prompt 不需要重新部署 —— 这是这个架构最大的优点。每解一道新题型,把经验加进 prompt,下次启动就立刻生效。

JSON Schema(接口契约)

让 Claude 返回结构化 JSON 而不是自由文本,程序好接管:

{
  "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
}

决策树

看到截图 →
├─ 视觉清晰 + 谐音强联系 → 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 你能截图玩这个游戏吗?」

然后发现一连串现实问题:

坑 1:游戏窗口截不到(截屏全黑)

第一次截屏,BadPunPC 窗口区域是纯黑色。我以为是工具坏了,研究半天才搞清:游戏用了 GPU 硬件加速渲染(DirectComposition / WebView2 独立 swap chain),标准 Windows 截屏 API(GDI BitBlt)根本抓不到 GPU 帧。

解决:在 Steam 启动选项加 --disable-gpu。这条命令告诉 WebView2 走 CPU 软件渲染,截屏立刻能抓到画面了。代价是渲染稍慢、窗口偶尔出现 letterbox 黑边,但完全可以接受。

坑 2:Windows 不让我夺焦点

open_application() 调用后,游戏窗口在视觉上确实在最前,但键盘焦点还在桌面 shell。任何 click 和 type 都被拦截。

试了一圈:SetForegroundWindow Windows API 有「焦点保护」会拒绝。pygetwindow.activate() 同上。Alt+Tab 需要系统级权限。

解决:让用户手动点一下游戏窗口给焦点。这条没法完全自动化(除非用 win32 API 模拟 ALT 释放骗过保护)。文档里写清楚了。

坑 3:中文输入失败

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 行,关键就是:

  1. mss 截屏,转 base64
  2. anthropic SDK 发给 Claude API(多模态消息)
  3. 解析返回的 JSON,按 recommend_action 走 submit / hint / skip
  4. pyperclip + pyautogui 模拟键鼠操作
  5. 主循环 + answers.jsonl 缓存

最关键的还是 SYSTEM_PROMPT —— 我们这一路所有的经验都浓缩在那 100 多行字符串里。改 prompt 不用重新部署,这是这个架构最大的爽点。

后期想法

  • 验证缓存命中 —— 题号缓存对了之后再发一张截图给 API 校验场景一致(防止题库改动)
  • 像素级颜色读取 —— 用 PIL 直接读 RGB 判定绿/橙/灰,省 API token
  • 图像模板匹配 —— 用 OpenCV 自动定位输入框,摆脱硬编码坐标
  • 本地 VLM 替代 —— Qwen2-VL 跑通后,零成本刷题
  • 题库爬取 —— 用 OCR 把所有题号 + 答案爬一遍,生成完整题库

🐛 踩过的坑

Top 5 最痛的坑

  1. --disable-gpu 没加 → 截屏全黑,研究两小时
  2. Windows 焦点保护 → 用户必须手动 click 一次游戏窗口
  3. typewrite 不支持中文 → 改用剪贴板粘贴
  4. 手算 Unicode 转义码笔误 → 把 螺(螺) 写成 螂(螂),把 煲(煲) 写成 煋(煋),把 煽(煽) 写成 熙(煕)。栽了 3 次。直接写中文字符就行了,让 JSON 自己处理编码
  5. 「恭喜通关」按钮 click 经常无效 → 用 Enter 键 推进下一题

其他小坑

  • 游戏偶尔会回主菜单(窗口失焦超时?) → 写了导航回 经典题库 → 继续 的逻辑
  • --disable-gpu 模式下窗口偶尔出现黑色 letterbox → 每次操作前必须重新截屏定位坐标
  • 进度点的颜色解析 —— 黄色 = 已用错误次数,灰色 = 未用,提示不计入

🙏 致谢

  • 《这是谐音梗》(BadPunPC) 制作组 —— 谢谢做了这么好玩的游戏
  • Anthropic Claude —— 真正的解题大脑
  • 各位作者 —— 沧海一声啸 / 仓薯 / 天天谐音梗 / 画点冷笑画 / 覃 / 脑洞君 / Cinderella / 月月鸟 / 童心看世界 / 梅梅心灵小屋 / 鼠鸣 / 夜风吹纱 / 岚月栖夜 / 小z / 吐司面包 / 汉堡贼 / 肠粉一份 / 画画的思诺 / CiCi —— 你们的脑洞撑起了整个游戏

📜 License

MIT。游戏本身版权归原制作组所有,本项目只是辅助工具,不分发任何游戏内容(题库截图、答案表都是用户自己运行时生成的)。

如果你也喜欢这个游戏,建议先自己玩再用 AI —— 自己解出谐音梗的快乐,AI 替代不了。

About

让 Claude 看图、推谐音、键盘输入答案,全自动通关 Steam 游戏《这是谐音梗》(BadPunPC)。

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages