# deepseek狼人杀 **Repository Path**: a-stupid-code-farmer/deepseek-werewolf-kill ## Basic Information - **Project Name**: deepseek狼人杀 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-11 - **Last Updated**: 2026-09-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 狼人杀 AI 对战 用大模型驱动的狼人杀对局观看器:**一群 AI 玩家互相博弈**,你在浏览器里以上帝视角围观整场,也可以随时自己下场玩一局。 后端 FastAPI + WebSocket,前端 React + Vite + Tailwind。模型支持 **DeepSeek** 与 **Anthropic**,按 API Key 前缀自动识别,不需要改代码。 ``` ┌──────────────┐ WebSocket ┌───────────────┐ │ React 前端 │ ◀───────────▶ │ FastAPI 后端 │ │ 上帝视角/真人 │ │ 游戏主循环 │ └──────────────┘ └───────┬───────┘ │ 每个 AI 玩家 = 一条独立多轮对话 ▼ DeepSeek / Claude ``` --- ## 特性 ### 会思考的 AI 玩家 不是「随机发言 + 随机投票」的假 AI,每个座位都有独立的人格、记忆和对话历史: - **多轮持久对话**:每个玩家的 `messages` 跨轮累积,system prompt 固定在最前以命中前缀缓存。AI 记得自己之前说过什么。 - **人格系统**:8 种性格(逻辑推理型 / 激进进攻型 / 狡猾伪装型 / 新手懵懂型 / 话痨分析型 / 沉稳老练型 / 阴阳怪气型 / 情绪激动型),性格描述会注入 system prompt,说话腔调真的不一样。 - **结构化记忆**:模型在发言时自己输出 `` JSON 记录「谁可疑、我的策略是什么」,取代早期靠关键词刮文本的做法(那种刮法基本是噪音)。 - **真实推理素材**:票型表(谁投了谁 + 得票排名)、往轮摘要、发言顺序、跳身份列表都会注入 prompt。AI 能说出「上一轮 3 号归票 5 号,这轮 5 号急着跳预言家,我觉得他在悍跳」这种话。 - **狼队协商**:多狼夜间各自提案刀口,多数决定,并产出白天统一口径的战术。分歧时才退回单选。 ### 严格的信息隔离 这是狼人杀 AI 最容易做错的地方——**给 AI 看了它不该知道的东西,博弈就没了**。 程序内部拆成两条独立通道: | 通道 | 内容 | 谁能看到 | |---|---|---| | `public_history` | 发言、投票、死亡名单、翻牌身份 | 所有 AI 玩家 + 前端 | | `all_events` (spectator) | 女巫救了谁、守卫守了谁、验人结果、狼队刀口 | **仅前端观众** | 夜死者不翻牌、死因不公布、女巫用药不公开。`verify.py` 里有 5 项专门的信息泄漏检查。 ### 完整规则 - 三种板子:**6 人新手局**、**9 人标准局**(预女猎)、**12 人预女猎守局**(含白狼王) - 角色:预言家、女巫(解药/毒药各一次,同晚只能用一瓶)、猎人(被毒杀不能开枪)、守卫(不可连续两晚守同一人)、白狼王(自爆带人)、白痴(翻牌免死但失去投票权)、村民 - 流程:夜晚行动 → 天亮公布死讯 → 轮流发言 → 并发投票 → 平票 PK → 遗言 → 下一轮 - 首夜死者有遗言(死预言家可以报出当晚刚拿到的验人结果) - 决赛圈提示:存活 ≤5 人时注入「这票投错直接输」,好人只给狼数上界、狼人给精确数 ### 你可以自己下场 打开「自己加入」开关选个座位,你就是场上的一员: - 身份随机分配,**你自己也不知道别人的身份** - 轮到你发言/投票/夜间行动时前端弹出操作面板,**不限时**,想清楚再说 - 你的视角是隐藏的:看不到狼数、看不到未翻牌的身份、验人和用药结果只回传给你自己 - 发言节奏可以 0.5x ~ 2x 实时调速 ### 可观测 「AI 变笨了」到底是模型问题还是代码问题?这套工具让它可回答: - `python verify.py` — 抓真实 prompt 核对 21 项设计(含信息泄漏检查) - `python smoke_test.py N` — 用假模型跑 N 局,快速验证流程不崩 - `python run_real_game.py N SIZE` — 真实 API 跑 N 局,结果落盘 `logs/*.jsonl` - `python stats.py [-v]` — 聚合胜率、投票命中率、查杀执行率、API 降级率 区分「真笨」和「挂了」是这套统计的核心目的——所有 fallback、重试、降级都有计数和日志。 --- ## 快速开始 ### 前置 - Python **3.10+**(开发环境用的是 3.11) - Node.js 18+ - 一个 API Key:[DeepSeek](https://platform.deepseek.com)(`sk-...`,便宜推荐)或 [Anthropic](https://console.anthropic.com)(`sk-ant-...`) ### 一键启动(Windows) ```bat cd werewolf-ai start.bat ``` 脚本会依次检查 Python / Node、读取或询问 API Key、安装依赖、拉起前后端,然后打开 。 ### 手动启动 ```bash cd werewolf-ai # 1. 配置 Key cp .env.example .env # 编辑 .env,填入 ANTHROPIC_API_KEY=sk-...(DeepSeek)或 sk-ant-...(Anthropic) # 2. 后端 cd backend pip install -r requirements.txt python main.py # http://localhost:8000 # 3. 前端(另开一个终端) cd frontend npm install npm run dev # http://localhost:5173 ``` ### 配置项 全部写在 `.env` 里,详见 [`.env.example`](.env.example)。最常用的几个: | 变量 | 默认 | 说明 | |---|---|---| | `ANTHROPIC_API_KEY` | — | 必填,按 `sk-` / `sk-ant-` 前缀自动识别服务商 | | `WOLF_QUALITY` | `fast` | `fast` / `balanced` / `deep`,只在两个模型名不同时才有区别 | | `WOLF_MODEL_LIGHT` | `deepseek-flash` | 发言、投票用的轻模型 | | `WOLF_MODEL_MAIN` | `deepseek-flash` | 关键决策用的主模型 | | `WOLF_REASONING_EFFORT` | `low` | `low` / `medium` / `high`,思考档位 | | `WOLF_THINKING` | `1` | 设 `0` 彻底关闭 thinking | | `WOLF_RETRY` | `3` | 调用失败重试次数 | | `WOLF_TIMEOUT` | `90` | 单次请求超时(秒) | > **关于速度**:实测 `deepseek-flash` + `reasoning_effort=low` 约为 1~2 秒/次。一局调用次数:6 人局约 60 次、9 人局约 70 次、12 人局约 120 次;9 人局实际耗时约 5~6 分钟(含发言展示节奏)。 > 推理型模型(如 `deepseek-v4-pro`)即使把 `reasoning_effort` 调低,实测仍约 50~100 秒/次,一局要一个多小时,所以默认全量走 flash。 > > **想更快/更省**:`WOLF_THINKING=0` 可以再快一截,代价是决策质量下降。 --- ## 打包 exe ```bash cd werewolf-ai/backend python -m PyInstaller --noconfirm --clean WerewolfAI.spec ``` 产物在 `backend/dist/WerewolfAI.exe`。已内置前端静态资源(**注意**:需要先 `cd frontend && npm run build` 并把产物同步到 `backend/static/`,spec 是直接从那里打包的)。 打包版启动后读的是 exe 同目录的 `.env`,所以把 `.env` 放在 exe 旁边即可。 --- ## 实测数据 以下数字来自 `run_real_game.py` 实跑的对局,用 `python stats.py` 聚合得出(`deepseek-flash` + `reasoning_effort=low`)。 **只统计纯 AI 对局**——真人下场的混合局里,投票不再是 AI 决策,混进来会让指标失真(`stats.py` 会自动排除)。 > 以下为 11 局纯 AI 对局(6 / 9 / 12 人混合)的聚合结果: | 指标 | 实测 | 参考基准 | |---|---|---| | 狼人胜率 / 好人胜率 | 0.25 / 0.75 | 取决于板子与人数 | | **好人投票命中率** | **0.637** | 随机约 0.3 | | **狼人投同伴率** | **0.0** | 应接近 0 | | 查杀执行率(验出的狼最终出局) | 0.417 | — | | **API 失败率** | **0.0**(0 / 532 次调用) | — | | **兜底率**(走随机决策的比例) | **0.0019** | 应接近 0 | | 降级率(空响应触发重试) | 0.036 | flash 偶发,重试即恢复 | | 发言违规打回 | 0 / 136 | — | > 这些数字衡量的是「AI 有没有在推理」,不是「AI 有多强」: > 投票命中率显著高于随机基线,说明 AI 确实在根据发言和票型推理; > 兜底率接近 0,说明表现不是随机决策堆出来的。 > 样本量不大(十几局),看趋势即可,不必当精确指标。 **实际对局里 AI 打出来的东西**(摘自 `stats.py` 收录的轮次摘要): ``` 第1轮:7号跳预言家报3号查杀并归票;0号跳预言家报4号查杀归票4号; 3号跳女巫称平安夜开解药、归票7号。最终0号被放逐,翻牌预言家。 第2轮:4号跳预言家报1号查杀;2、6、8、1号归票4号。4号被放逐, 翻牌狼人。真预言家的遗言补刀:验过4号是查杀。 ``` 多预言家对跳、狼人悍跳发查杀、好人识破后归票推出真狼、神职在遗言里补交验人信息—— 这些是真实博弈行为,不是「各说各话」的模板发言。 --- ## 开发 ### 目录结构 ``` werewolf-ai/ ├── backend/ │ ├── game_engine.py # 数据模型(Role/Phase/Player/GameState)+ 板子配置 + 双通道事件 │ ├── prompts.py # 所有 prompt 模板(system / 夜晚 / 发言 / 投票 / 遗言 / PK ...) │ ├── ai_player.py # LLM 调用层:双服务商、重试降级、多轮对话、XML/JSON 解析、统计 │ ├── main.py # 游戏主循环、WebSocket、人类玩家决策点 │ ├── stats.py # 对局落盘 JSONL + 离线聚合 │ ├── verify.py # 21 项设计核对(含信息泄漏检查) │ ├── smoke_test.py # 假模型跑完整对局,验证流程 │ └── run_real_game.py # 真实 API 无前端对局 └── frontend/ └── src/ ├── components/ # GameBoard / ChatArea / PlayerCard / HumanPanel / GameControls └── hooks/useWebSocket.ts ``` ### 测试三件套 ```bash cd backend python verify.py # 设计核对,期望 21/21 python smoke_test.py 10 # 10 局假模型对局,期望 0 异常 python stats.py # 真实对局的聚合指标 ``` `smoke_test.py` 用假模型(随机决策)跑流程,所以结果不反映 AI 智力,只验证**流程不崩**。判断 AI 有没有变聪明要看 `run_real_game.py` 的产物。 ### 加一个角色 / 改规则 1. `game_engine.py`:`Role` 加枚举、`ROLE_DESC` 加描述、`GAME_CONFIGS` 里排进板子 2. `prompts.py`:写该角色的夜晚/技能 prompt 3. `ai_player.py`:`_build_user_message` 加分支、`TEMPERATURE` 加温度 4. `main.py`:`run_one_round` 里加决策点(注意区分 AI / `is_human` 两条路径) 5. `verify.py`:补一条核对,别让它悄悄回归 --- ## FAQ **Q:AI 看起来很笨,怎么办?** 先跑 `python verify.py` 和 `stats.py` 看兜底率/降级率。如果兜底率不是 0,说明是 API 调用在挂(Key、余额、超时),不是 AI 逻辑问题——启动时的自检横幅也会明确报出来。如果都正常还是笨,那就是 prompt 的问题,去 `prompts.py` 加推理素材。 **Q:能不能不花 API 钱跑?** `python smoke_test.py` 用假模型,完全离线,用来验证流程。但它跑不出真实的博弈质量。 **Q:为什么日志里有 `.env` 的警告?** `.env` 已被 `.gitignore` 忽略。如果你 fork 后不小心提交过 Key,请立刻去服务商控制台吊销重发——删除文件不等于从历史里删除。 **Q:支持多少个玩家的局?** 目前内置 6 / 9 / 12 人三种板子。加板子只需改 `GAME_CONFIGS`(注意角色总数要和人数一致)。 **Q:人类玩家中途关掉网页会怎样?** 后端检测到 WebSocket 断开会给挂起的决策返回空值,该次行动走兜底,游戏继续。 --- ## 许可 个人项目,随意取用。