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

14 KiB
Raw Blame History

背景

文件名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() - 结束游戏

数据结构设计

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]

  • 已修改:

    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> 的问题

  • 阻碍因素: 无

  • 状态:未确认

最终审查

待审查阶段完成...