Files
WPSBot/.tasks/2025-11-03_2_werewolf-game.md
2025-11-10 10:37:43 +08:00

396 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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