基于大语言模型的AI狼人杀游戏:双层角色扮演与模型竞技场设计
1. 项目概述:当狼人杀遇上AI,一场全新的推理盛宴
毕业之后,想凑齐8到12个人,在周末的晚上围坐一圈,点上外卖,来一场酣畅淋漓的狼人杀,几乎成了一种奢望。这个游戏的精髓在于社交,但剥开这层外壳,其内核——逻辑推理、语言博弈、察言观色——本身就充满了魅力。有没有一种可能,让我们随时随地,一个人也能体验到这种烧脑的乐趣?这正是Wolfcha诞生的初衷。
Wolfcha,这个名字巧妙地融合了“狼人”(Werewolf)和中文文学形象“猹”,既是对项目诞生于“Watcha + ModelScope全球黑客松”的致敬,也精准地捕捉了其核心玩法:观看AI角色们上演一出好戏。在这个游戏里,除了你之外的所有玩家——预言家、女巫、猎人、守卫、狼人——全部由人工智能驱动。你不再是唯一的玩家,而是这场AI大乱斗的导演和首席观众。
2. 核心设计思路:双层AI角色扮演与模型竞技场
2.1 双层AI角色扮演系统:从“人设”到“角色扮演”
传统的AI游戏角色,往往只是根据游戏规则做出反应,缺乏“人”的质感。Wolfcha的核心创新在于其双层AI角色扮演系统,这得益于当前大语言模型(LLM)日益增长的上下文窗口和强大的指令遵循能力。
第一层:虚拟玩家的人格塑造在游戏开始前,系统会为每个AI玩家生成一个独特的“虚拟人格”。这不仅仅是一个名字,而是一个包含背景故事、性格特质(如“多疑”、“冲动”、“冷静”)、说话风格甚至口头禅的完整人设。例如,一个AI玩家可能被设定为“一位喜欢引用莎士比亚的退休历史教授”,而另一个则是“一位说话直来直去的程序员”。
注意:人设的生成质量直接影响到后续的游戏体验。过于平淡的人设会导致AI发言同质化,而过于极端的人设(如“完全沉默寡言”)则可能破坏游戏平衡。在实际开发中,我们通过预设一批经过精心调校的人格模板,并结合随机要素来生成,确保多样性与可玩性。
第二层:游戏内的角色扮演当游戏开始,这位拥有独立人格的“虚拟玩家”会拿到一个狼人杀角色(比如狼人)。此时,AI需要完成一次复杂的“嵌套扮演”:它要以自己虚拟人格的思维方式,去扮演游戏中的狼人角色,并根据实时变化的游戏局势(如夜间信息、白天发言、投票情况)进行发言、推理、撒谎或归票。
这个过程是实时生成的,充满了不可预测性。那个“退休历史教授”扮演的狼人,可能会在辩解时引经据典;而“程序员”扮演的预言家,发言可能格外逻辑严谨但缺乏感染力。这种深度角色扮演让每一局游戏都像是一部由AI即兴创作的微型戏剧。
2.2 AI模型竞技场:一场隐藏的“图灵测试”
Wolfcha的另一个精妙之处在于,它不仅仅是一个游戏,更是一个AI模型的竞技场。我们接入了多个顶尖的大语言模型来驱动这些AI玩家。游戏结束后,你可以清晰地看到每个角色背后是哪个模型在“操盘”。
这相当于设置了一场持续的、多模型的“图灵测试”。你可以观察:
- 哪个模型逻辑最缜密:能否从复杂的发言中找出狼人的逻辑漏洞?
- 哪个模型最会“装傻充愣”:作为狼人时,能否完美地隐藏自己,发出像好人一样的言论?
- 哪个模型最具“人味”:它的发言是否自然,是否有情感波动,是否会出现符合其人格但不符合绝对理性的有趣失误?
目前项目集成的模型包括DeepSeek V3.2、Qwen3-235B-A22B、Moonshot AI的Kimi K2、Google的Gemini 3 Flash以及字节跳动的Seed 1.8。让这些不同“血统”的AI同台竞技,本身就是一件极具观赏性和研究价值的事情。
3. 技术架构与核心实现解析
3.1 现代化全栈技术选型
Wolfcha采用了一套非常现代且高效的技术栈,确保了开发的流畅性与最终产品的优秀体验:
- 前端框架:Next.js 15 (App Router)。选择Next.js而非纯React,主要看中其服务端渲染(SSR)和流式渲染能力。这对于需要快速加载、且内容动态的AI游戏页面至关重要。App Router的模式也让基于角色的路由管理(如
/game/[id]/day,/game/[id]/night)变得异常清晰。 - 语言:TypeScript。在涉及复杂游戏状态(如玩家列表、角色技能、发言记录)和AI API调用时,TypeScript的强类型系统是避免低级错误、提升开发效率的生命线。
- 样式:Tailwind CSS 4。其效用优先(Utility-First)的理念非常适合快速构建定制化UI,并且能轻松实现项目追求的复古视觉风格。通过精心挑选的复古色板(如暗色调背景搭配柔和的琥珀色、墨绿色高亮),营造出独特的沉浸感。
- 状态管理:Jotai。相比于Redux的繁重,Jotai的原子化状态管理概念与React思维模式更契合。游戏中的状态如
gamePhase(游戏阶段)、players(玩家列表)、currentSpeaker(当前发言者)都很适合用独立的atom来管理,更新高效且精准。 - AI集成层:ZenMux。这是项目的关键枢纽。直接对接多个LLM厂商的API非常繁琐,而ZenMux提供了一个统一的接口。我们只需向ZenMux发送标准化的请求(包含角色人设、游戏历史、当前回合指令),它就能帮我们路由到配置好的不同模型(如DeepSeek或Qwen),并返回格式化的响应,极大降低了集成复杂度。
3.2 游戏状态机的设计与实现
狼人杀是一个典型的状态机(State Machine)。Wolfcha的核心逻辑就是维护并驱动这个状态机。
状态定义示例:
type GamePhase = 'LOBBY' | 'NIGHT_WEREWOLF' | 'NIGHT_SEER' | 'NIGHT_WITCH' | ... | 'DAY_DISCUSSION' | 'DAY_VOTING' | 'GAME_END'; type Player = { id: string; name: string; avatar: string; // 使用DiceBear生成 role: WerewolfRole; aiModel: string; // 如 'deepseek-v3.2' personality: PersonalityProfile; // 第一层人设 isAlive: boolean; // ... 其他状态 };状态流转控制:游戏引擎(一个Node.js后端服务或Next.js API Route)负责按顺序推进状态。例如,从NIGHT_WEREWOLF切换到NIGHT_SEER时,引擎会:
- 检查狼人AI是否已完成行动(通过调用ZenMux API获得选择目标)。
- 存储行动结果。
- 广播状态更新给所有前端客户端(使用WebSocket或Server-Sent Events实现实时性)。
- 向前端发送指令,触发相应的视觉过渡动画(如眨眼效果切换昼夜)。
3.3 AI交互与提示词工程
这是项目的灵魂所在。如何让AI理解复杂的游戏规则并做出合理行为?关键在于精心设计的系统提示词(System Prompt)。
以狼人夜间行动提示词为例:
你正在玩一场狼人杀游戏。以下是你的身份和当前游戏状态: 【你的身份】 - 你是:狼人 - 你的人设:[此处插入第一层人格,如“你是一个谨慎的图书管理员,习惯在发言前深思熟虑”] - 你的队友是:[玩家X, 玩家Y](仅你知道) 【游戏规则摘要】 - 每晚你们狼人可以共同商议并杀死一名玩家。 - 目标是消灭所有神职或所有平民。 【当前局势】 - 当前存活玩家:[列表] - 昨天的发言摘要:[摘要] - 昨天的投票结果:[结果] - 目前场上的风向:[分析] 【你的任务】 请以你的人设和狼人身份进行思考,从存活玩家中选择一名最可能是神职,或对狼人阵营威胁最大的玩家作为今晚的击杀目标。请只用JSON格式回复:{"action": "kill", "targetPlayerId": "player_id", "reasoning": "你的思考过程,体现你的人设"}。这个提示词结构清晰,包含了身份、人设、规则、局势和明确的输出格式要求。输出格式锁定为JSON是至关重要的工程实践,这保证了后端代码能稳定地解析AI的响应,而不会因为AI的“自由发挥”导致程序出错。
实操心得:温度(Temperature)参数的微调。对于需要稳定执行行动的环节(如夜间杀人),我们会将温度参数调低(如0.2),让AI输出更确定、更符合规则。而对于白天发言环节,温度可以适当调高(如0.7-0.9),以激发AI更多的创造性和符合人设的“表演”,增加趣味性。
4. 前端交互与沉浸式体验打造
4.1 动态视觉反馈系统
为了让AI的“表演”更生动,我们在前端下了不少功夫:
- 口型同步动画:当AI生成的文本被转为语音(或模拟语音播放)时,我们根据语音的时间戳和文本音节,动态控制角色头像的嘴部SVG路径,产生简单的“说话”动画。这虽然不如真正的口型识别精确,但极大地增强了角色的生动感。
- 专属角色特效:在夜间行动阶段,当预言家查验身份或女巫使用毒药时,对应的角色头像会触发独特的微光、涟漪等SVG动画,强化技能施放的仪式感。
- 昼夜切换的“眨眼”效果:使用Framer Motion实现了一个全屏的渐变遮罩动画。从白天切换到黑夜时,屏幕上下边缘像眼帘一样合拢,再睁开时已是夜景模式,过渡非常自然。
4.2 实时聊天与历史记录
游戏内的发言系统基于Tiptap编辑器构建,这允许我们未来可以轻松地为其添加更丰富的文本格式(如强调某句话、插入表情)。所有AI和玩家的发言都以消息流的形式呈现,并附上时间戳和说话者头像。
关键实现点:为了模拟真实桌游的发言顺序,我们设计了一个“发言计时器”。当进入白天讨论环节,系统会按照座位顺序(或随机顺序)自动激活当前发言者的麦克风图标,并开始倒计时。在这段时间内,驱动该玩家的AI模型需要生成发言内容并“说出”。这个过程是异步的,前端会显示“正在思考...”的加载状态,给玩家一种AI正在认真组织语言的真实感。
5. 部署、配置与常见问题排查
5.1 本地开发环境搭建详解
如果你想在本地运行或贡献代码,请遵循以下步骤:
获取代码与安装依赖:
git clone https://github.com/oil-oil/wolfcha.git cd wolfcha pnpm install # 强烈推荐使用pnpm,依赖安装速度和磁盘空间占用优势明显环境变量配置: 复制
.env.example文件为.env.local。你需要申请以下关键服务的API密钥:ZENMUX_API_KEY: 这是核心。前往ZenMux官网注册并获取密钥,它将是调用所有AI模型的桥梁。DASHSCOPE_API_KEY(可选): 如果你希望单独使用阿里云的通义千问模型。 将密钥填入.env.local文件。务必确保该文件已被加入.gitignore,切勿提交密钥!
启动开发服务器:
pnpm dev访问
http://localhost:3000。首次加载时,由于需要初始化AI模型连接,可能会稍有延迟。
5.2 核心配置项解析
在项目配置中,有几个文件至关重要:
src/lib/game-config.ts: 这里定义了游戏规则常量,如角色数量配置 ({ werewolves: 2, seer: 1, witch: 1, ... })、每轮发言时长、技能冷却规则等。修改这里可以快速创建“快速局”或“标准局”。src/lib/ai-models.ts: 这里管理着可用的AI模型列表及其对应参数。你可以在这里添加新的模型供应商,或调整现有模型的参数(如maxTokens,temperature)。export const availableModels = [ { id: 'deepseek-v3.2', name: 'DeepSeek V3.2', provider: 'zenmux', config: { temperature: 0.7 } }, { id: 'qwen-max', name: 'Qwen3 Max', provider: 'dashscope', config: { temperature: 0.8 } }, // ... 添加新模型 ];src/data/personalities.ts: 这里是虚拟人格库。你可以在这里预定义大量有趣的人格模板,游戏开始时AI会随机分配一个。
5.3 常见问题与排查实录
在开发和运行过程中,你可能会遇到以下问题:
| 问题现象 | 可能原因 | 排查与解决思路 |
|---|---|---|
| 游戏卡在“AI思考中...” | 1. AI API调用超时或失败。 2. 网络连接问题。 3. API密钥无效或额度用尽。 | 1. 打开浏览器开发者工具(F12)的“网络(Network)”标签,查看对/api/ai/action或类似端点的请求是否返回错误(如429、500)。2. 检查ZenMux控制台,确认API密钥有效且有余量。 3. 临时在配置中切换到一个更稳定或免费的模型(如Qwen的某些免费额度型号)进行测试。 |
| AI行为不符合预期或胡言乱语 | 1. 系统提示词(Prompt)设计有歧义。 2. 温度(Temperature)参数过高。 3. 上下文历史过长导致模型混乱。 | 1.核心检查点:仔细审查发送给AI的完整Prompt,确保角色、规则、任务指令清晰无矛盾。可以在后端日志中打印出完整的请求Payload进行调试。 2. 对于关键行动(如杀人、救人),将 temperature降至0.1-0.3。3. 实现“上下文窗口管理”,只保留最近N轮的关键信息(如投票结果、死亡情况)在历史中,过长的聊天记录可以总结摘要后再喂给AI。 |
| 前端动画卡顿或不同步 | 1. 大量状态更新导致React重复渲染。 2. Framer Motion动画与AI响应线程冲突。 | 1. 使用Jotai的select或React的useMemo、React.memo来优化组件,避免不必要的渲染。2. 将AI响应处理与动画触发逻辑用 setTimeout或requestAnimationFrame适当解耦,确保主线程流畅。 |
| 多人模式下状态不同步 | WebSocket连接断开或消息丢失。 | 1. 实现健壮的重连机制和心跳检测。 2. 在每次关键状态变更后,广播全量的游戏状态快照给所有客户端,客户端以服务端状态为“唯一真相源”,避免状态分歧。 |
踩坑记录:API成本控制。让多个AI模型持续对话,Token消耗非常快。我们采取了以下策略优化:1) 对AI的发言长度做限制(
maxTokens);2) 在非必要环节(如等待玩家操作时)暂停AI轮询;3) 考虑使用更小、更经济的模型来处理一些简单的状态判断。务必在开发初期就设置好预算警报。
6. 未来展望与扩展思路
Wolfcha已经搭建了一个极具潜力的框架,未来的扩展方向非常有趣:
- 自定义模型竞技:允许玩家在创建房间时,像选英雄一样为每个席位选择不同的AI模型(例如,“1号位用DeepSeek,2号位用Kimi”),进行真正的“模型对决”。
- 赛后复盘与AI聊天:游戏结束后,不仅可以回看录像,还可以“采访”任意一位AI玩家:“你当时为什么投了A玩家?”、“你作为狼人,觉得哪一步最惊险?”。这能产生大量有趣的、基于本局游戏内容的衍生对话。
- 特殊技能与模组:引入更多身份和技能,如“丘比特”、“盗贼”等。甚至可以设计“时间回溯”技能,让玩家有机会重演上一轮的发言,观察AI的不同选择。
- 人格市场与评级:社区可以创作并分享高质量的“虚拟人格”配置文件。玩家可以为游戏中表现出色的AI人格点赞,形成一个“最强狼人AI”排行榜。
这个项目的魅力在于,它既是一个好玩的游戏,也是一个观察和研究AI行为的绝佳窗口。看着不同“性格”、不同“大脑”的AI在同一个规则下博弈、欺骗、合作,其过程本身就充满了意想不到的乐趣和启发。它让我们以一种全新的方式,重温了狼人杀这个经典游戏的核心魅力。
