13 KiB
背景
文件名:2025-11-03_2_werewolf-game.md 创建于:2025-11-03_12:20:10 创建者:admin 主分支:main 任务分支:task/werewolf_2025-11-03_1 Yolo模式:Off
任务描述
在WPS Bot Game项目中添加狼人杀游戏系统,支持6-12人游戏,包含身份分配、私聊功能、技能使用等核心功能。
核心需求
- 支持6-12人狼人杀游戏(配置:2-4狼 1预言家 1女巫 2-6平民)
- 主持人开房:
.狼人杀 open - 玩家加入:
.狼人杀 join(必须注册用户名和个人URL) - 开始游戏:
.狼人杀 start,自动分配身份并通过私聊发送 - 私聊功能:
.狼人杀 <玩家代号> <消息> - 狼人群聊:
.狼人杀 狼人 <消息> - 技能系统:杀、验、救、毒
- 游戏状态查询:
.狼人杀 status - 结束游戏:
.狼人杀 end
游戏规则
人数配置:
- 6人:2狼 1预言家 1女巫 2平民
- 8人:2狼 1预言家 1女巫 4平民
- 10人:3狼 1预言家 1女巫 5平民
- 12人:4狼 1预言家 1女巫 6平民
胜利条件:
- 狼人阵营:杀死所有神职和平民
- 好人阵营:消灭所有狼人
技能:
- 狼人:每晚投票刀人
- 预言家:每晚查验一个玩家身份
- 女巫:拥有一瓶解药(仅可使用一次)和一瓶毒药(仅可使用一次)
- 平民:无特殊技能
项目概览
项目结构
WPSBotGame/
├── app.py # FastAPI主应用
├── config.py # 配置管理
├── core/
│ ├── database.py # SQLite数据库操作
│ ├── middleware.py # 中间件
│ └── models.py # 数据模型
├── routers/
│ ├── callback.py # Callback路由处理
│ ├── health.py # 健康检查
│ └── private.py # 私聊相关API
├── games/ # 游戏模块
│ ├── werewolf.py # 狼人杀游戏(新增)
│ └── ... # 其他游戏
└── utils/
├── parser.py # 指令解析
└── message.py # 消息发送
分析
当前状态
- 已有私聊功能支持,用户可注册个人webhook URL
- 已有游戏架构:BaseGame基类、数据库状态管理
- 已有成语接龙等多人类游戏参考
- 数据库支持game_states表存储游戏状态
关键技术点
-
数据库层:
- 使用game_states表存储游戏状态(user_id=0表示群级别状态)
- 通过state_data JSON字段存储玩家列表、身份、阶段等信息
-
私聊系统:
- 利用现有的send_private_message函数
- 身份信息、技能结果等通过私聊发送
- 支持发送者标识显示
-
游戏状态管理:
- 游戏状态存储在state_data中
- 包含:玩家列表、身份映射、狼人列表、技能使用记录等
-
技能系统:
- 狼人刀人:投票机制
- 预言家验人:私聊返回结果
- 女巫用药:限制使用次数
-
指令路由:
- 在parser.py注册.werewolf和.狼人杀指令
- 在callback.py中导入并注册游戏处理器
提议的解决方案
方案概述
- 创建狼人杀游戏类:
games/werewolf.py,继承BaseGame - 状态数据结构:使用JSON存储在state_data中
- 身份分配:随机分配角色,狼人互相认识
- 私聊通知:游戏开始时通过私聊发送身份信息
- 技能系统:支持杀、验、救、毒四种技能
- 指令注册:添加解析和路由支持
设计决策
- 使用user_id=0存储群级别游戏状态(参考成语接龙)
- 通过私聊发送敏感信息(身份、技能结果)
- 简化实现:主持人手动推进阶段(暂不实现自动流转)
- 使用数字代号(1-N)标识玩家
- 支持狼人群聊功能
当前执行步骤:"实施完成"
详细实施计划
文件1: games/werewolf.py(新建文件)
主要方法
- handle() - 主处理逻辑,指令路由
- get_help() - 帮助信息
- _open_game() - 主持人开房
- _join_game() - 玩家加入
- _start_game() - 开始游戏,分配身份
- _send_identities() - 私聊发送身份信息
- _private_chat() - 玩家私聊
- _wolf_group_chat() - 狼人群聊
- _handle_skill() - 技能处理
- _wolf_kill() - 狼人刀人
- _seer_check() - 预言家验人
- _witch_save() - 女巫救人
- _witch_poison() - 女巫毒人
- _show_status() - 显示游戏状态
- _end_game() - 结束游戏
数据结构设计
state_data = {
'creator_id': int, # 主持人ID
'status': str, # 'open', 'playing', 'finished'
'players': [
{
'user_id': int,
'name': str, # 注册的用户名
'id': int, # 游戏内代号 1-N
'role': str, # 'wolf', 'seer', 'witch', 'civilian'
'alive': bool,
'id_label': str # "1号玩家"
}
],
'phase': str, # 当前阶段
'round': int, # 当前回合数
'wolves': [int], # 狼人ID列表
'kill_target': int, # 狼人票决目标
'seer_result': {}, # 预言家验人结果
'witch_save': bool, # 女巫是否救人
'witch_poison': int, # 女巫毒杀目标
'discussed': False, # 讨论阶段是否完成
'wolf_know_each_other': False
}
文件2: utils/parser.py
修改点:添加指令映射
在COMMAND_MAP中添加:
'.werewolf': 'werewolf',
'.狼人杀': 'werewolf',
文件3: routers/callback.py
修改点:添加路由处理
在handle_command函数中添加:
# 狼人杀系统
if game_type == 'werewolf':
from games.werewolf import WerewolfGame
game = WerewolfGame()
return await game.handle(command, chat_id, user_id)
文件4: games/base.py
修改点:添加帮助信息
在get_help_message()函数中添加狼人杀帮助说明
任务进度
[2025-11-03_12:20:10]
-
已修改:
- games/werewolf.py - 新建狼人杀游戏类,实现所有核心功能
- utils/parser.py - 添加.werewolf和.狼人杀指令映射
- routers/callback.py - 添加狼人杀路由处理
- games/base.py - 添加狼人杀帮助信息
-
更改:
- 创建完整的狼人杀游戏系统
- 支持开房、加入、开始、私聊、技能使用等所有核心功能
- 实现6-12人游戏配置和角色分配
- 集成私聊系统发送身份信息
- 支持狼人群聊功能
- 添加帮助信息和指令注册
-
原因: 实现完整的狼人杀游戏系统,支持多人游戏、身份隐藏、技能使用等核心功能
-
阻碍因素: 无
-
状态:成功
[2025-11-04_17:41:14]
-
已修改:
- games/werewolf.py - 改进阶段提示和自动流转功能
-
更改:
- 添加阶段名称映射系统(phase_configs),定义各阶段的中文名称、行动角色和指令说明
- 实现阶段管理方法:_get_phase_description()、_get_next_phase()、_advance_phase()
- 改进游戏开始提示,明确显示"第一夜 - 狼人行动阶段"和操作指令
- 实现自动阶段流转:狼人刀人后自动进入预言家阶段,预言家验人后自动进入女巫阶段
- 新增女巫跳过功能:支持
.werewolf 跳过指令,女巫可以选择不行动 - 改进状态显示:_show_status()现在显示中文阶段名称、当前行动角色和操作指令
- 更新身份说明和帮助信息,添加女巫跳过选项说明
- 各技能方法添加阶段验证,确保在正确的阶段使用技能
-
原因: 解决用户反馈的游戏阶段不明显的问题,让玩家清楚知道当前是什么阶段、谁应该行动、下一步是什么阶段
-
阻碍因素: 无
-
状态:成功
[2025-11-07_10:59:09]
-
已修改:
- games/werewolf.py - 支持在私聊中使用狼人杀技能(方案2实施)
-
更改:
- 新增 _find_player_game(user_id) 方法,根据玩家ID查找其参与的游戏
- 修改 _handle_skill() 方法,支持从私聊中使用技能指令
- 修改 _wolf_group_chat() 方法,支持从私聊中发送狼人群聊
- 修改 _private_chat() 方法,支持从私聊中发送玩家私聊
- 修改 _witch_pass() 方法,支持从私聊中跳过女巫行动
- 添加日志输出,显示在私聊中使用功能的情况
- 实现逻辑:先尝试用当前chat_id查找游戏(群聊场景),找不到则通过user_id查找玩家游戏(私聊场景)
-
原因: 解决私聊中无法使用技能的问题。游戏在群里创建,但玩家需要在私聊中使用技能以保密。 之前的设计只能在游戏所在群使用技能,现在支持在私聊中使用,查找玩家参与的游戏并操作。
-
阻碍因素: 无
-
状态:成功
[2025-11-07_11:06:58]
-
已修改:
- games/werewolf.py - 改为全局唯一游戏模式(不再按chat_id区分)
-
更改:
- 修改 _get_game_state() 方法,查询全局唯一游戏而非根据chat_id查询
- 新增 _get_game_chat_id() 方法,获取全局游戏所在的chat_id
- 简化 _find_player_game() 方法,使用全局游戏查询
- 修改 _open_game() 方法,检查全局是否已有游戏(而非仅检查当前群)
- 简化所有需要查找玩家游戏的方法(_handle_skill、_wolf_group_chat、_private_chat、_witch_pass)
- 保持数据库兼容性:chat_id列仍然存在并记录游戏创建的群,但查询时忽略
- 实现逻辑:所有查询都获取全局最新的一个狼人杀游戏,不再区分群组
-
原因: Bot全局只需要一个狼人杀游戏,不同群的玩家可以参与同一个游戏。 简化逻辑,消除按chat_id区分的复杂性,同时保持数据库结构兼容。
-
阻碍因素: 无
-
状态:成功
[2025-11-07_11:13:56]
-
已修改:
- games/werewolf.py - 改进狼人投票机制
-
更改:
- 在游戏状态数据中添加 wolf_votes 字段,记录每个狼人的投票
- 修改 _wolf_kill() 方法,实现完整的投票流程:
- 记录每个狼人的投票(支持改票)
- 检查是否所有存活狼人都已投票
- 未全部投票时提示等待其他狼人
- 全部投票后统计票数
- 票数唯一时确定目标并推进阶段
- 平票时清除投票记录并要求重新投票
- 优化投票提示信息,显示投票进度和结果
-
原因: 解决之前"只要一个狼人投票就立即刀人"的问题。 现在要求所有狼人都投票,统计票数最多的目标,平票则重新投票,符合狼人杀游戏规则。
-
阻碍因素: 无
-
状态:成功
[2025-11-07_11:22:53]
-
已修改:
- games/werewolf.py - 狼人投票结果保密处理
-
更改:
- 修改狼人投票反馈机制,不在群里播报投票目标
- 单个狼人投票时,通过私聊确认投票,群消息只显示"投票已记录"
- 投票平票时,通过私聊通知狼人具体平票目标,群消息只显示"平票"
- 投票完成时,通过私聊通知所有狼人击杀目标,群消息只显示"投票完成"
- 所有敏感信息(投票目标、平票详情、击杀决定)均通过私聊发送给狼人
-
原因: 符合狼人杀游戏规则,狼人刀人的决定应该保密,不能在群里公开播报。 只有狼人自己知道投票情况和击杀目标,其他玩家在天亮时才知道结果。
-
阻碍因素: 无
-
状态:成功
[2025-11-07_11:40:44]
-
已修改:
- games/werewolf.py - 新增空刀机制
-
更改:
- 允许狼人投票给0号(表示空刀,不杀人)
- 修改 _wolf_kill() 方法,对target_id=0不验证目标存在性
- 修改投票确认消息,区分空刀和正常投票
- 修改票数统计逻辑,投票0不计入击杀目标统计
- 新增全部空刀处理:如果所有狼人都空刀,kill_target设为0(平安夜)
- 修改 _advance_phase() 为async,进入女巫阶段时私聊通知女巫刀人情况
- 女巫有解药时可知道今晚是否有人被刀(0号为平安夜)
-
原因: 符合狼人杀游戏规则,狼人可以选择空刀(不杀人)。 女巫在有解药时需要知道今晚是否有人被刀以决定是否使用解药。
-
阻碍因素: 无
-
状态:成功
[2025-11-10_10:20:38]
-
已修改:
- games/werewolf.py - 调整status指令的房间名单展示
-
更改:
- 房间开放阶段现在显示已加入玩家的房内ID与用户名
- 游戏进行阶段的玩家状态显示同时包含房内ID和用户名
-
原因: 提升
.werewolf status指令提供的信息量,方便玩家识别房间成员 -
阻碍因素: 无
-
状态:未确认
[2025-11-10_10:27:07]
-
已修改:
- games/werewolf.py - 统一狼人投票记录的键类型
-
更改:
_wolf_kill()读取和保存wolf_votes时转换为字符串键- 统计投票进度时将键重新转换为整数,确保与
alive_wolves对齐
-
原因: 修复狼人全部投票后仍提示有人未投票的问题
-
阻碍因素: 无
-
状态:未确认
最终审查
待审查阶段完成...