改进阶段提示和自动流转功能

This commit is contained in:
2025-11-04 17:43:27 +08:00
parent 9ed8fffcf7
commit 4027771a65
2 changed files with 219 additions and 40 deletions

View File

@@ -209,37 +209,29 @@ if game_type == 'werewolf':
- 状态:成功
[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. 各技能方法添加阶段验证,确保在正确的阶段使用技能
- 原因:
解决用户反馈的游戏阶段不明显的问题,让玩家清楚知道当前是什么阶段、谁应该行动、下一步是什么阶段
- 阻碍因素:
- 状态:成功
# 最终审查
## 实施总结
本次任务成功实现了狼人杀游戏系统的核心功能:
1. **游戏管理**:开房、加入、开始、状态查询、结束
2. **身份系统**:自动分配角色,狼人互相认识
3. **私聊功能**:单聊、狼人群聊、发送者标识
4. **技能系统**:狼人刀人、预言家验人、女巫用药
5. **数据持久化**使用game_states表存储状态
## 技术特点
- 继承BaseGame基类符合现有架构
- 使用user_id=0存储群级别状态
- 充分利用现有私聊功能
- 完整的帮助和错误提示
- 合理的技能使用限制
## 后续可扩展功能
- 自动阶段流转(天黑/天亮)
- 投票放逐系统
- 胜负自动判断
- 游戏历史记录
- 统计功能
## 测试建议
1. 测试开房、加入、开始流程
2. 测试身份分配和私聊通知
3. 测试私聊和狼人群聊功能
4. 测试所有技能使用
5. 测试多人游戏6-12人
实施与计划完全匹配
待审查阶段完成...

View File

@@ -26,6 +26,30 @@ class WerewolfGame(BaseGame):
}
self.min_players = 6
self.max_players = 12
# 阶段名称映射:{阶段代码: {'name': 中文名称, 'role': 行动角色, 'instruction': 指令说明}}
self.phase_configs = {
'night_kill': {
'name': '狼人行动阶段',
'role': '狼人',
'instruction': '使用 `.werewolf 杀 <id>` 投票杀人'
},
'night_seer': {
'name': '预言家验人阶段',
'role': '预言家',
'instruction': '使用 `.werewolf 验 <id>` 查验身份'
},
'night_witch': {
'name': '女巫行动阶段',
'role': '女巫',
'instruction': '使用 `.werewolf 救 <id>` 救人、`.werewolf 毒 <id>` 毒人,或 `.werewolf 跳过` 不行动'
},
'day_discuss': {
'name': '白天讨论阶段',
'role': '所有玩家',
'instruction': '讨论昨晚的事件'
}
}
async def handle(self, command: str, chat_id: int, user_id: int) -> str:
"""处理狼人杀指令
@@ -86,6 +110,10 @@ class WerewolfGame(BaseGame):
except ValueError:
pass
# 女巫跳过指令
if action in ['跳过', 'pass']:
return await self._witch_pass(chat_id, user_id)
# 技能指令
if action in ['', '', '', '', '']:
if len(parts) < 2:
@@ -131,6 +159,78 @@ class WerewolfGame(BaseGame):
"""
self.db.save_game_state(chat_id, 0, 'werewolf', state_data)
def _get_phase_description(self, phase: str) -> Dict[str, str]:
"""获取阶段描述信息
Args:
phase: 阶段代码
Returns:
阶段描述字典包含name、role、instruction
"""
return self.phase_configs.get(phase, {
'name': phase,
'role': '未知',
'instruction': ''
})
def _get_next_phase(self, current_phase: str) -> Optional[str]:
"""获取下一阶段
Args:
current_phase: 当前阶段代码
Returns:
下一阶段代码如果无下一阶段则返回None
"""
phase_sequence = ['night_kill', 'night_seer', 'night_witch', 'day_discuss']
try:
current_index = phase_sequence.index(current_phase)
if current_index < len(phase_sequence) - 1:
return phase_sequence[current_index + 1]
except ValueError:
pass
return None
def _advance_phase(self, chat_id: int, state_data: Dict) -> str:
"""推进到下一阶段
Args:
chat_id: 会话ID
state_data: 游戏状态
Returns:
阶段推进提示消息
"""
current_phase = state_data.get('phase')
if not current_phase:
return ""
next_phase = self._get_next_phase(current_phase)
if not next_phase:
return ""
# 更新阶段
state_data['phase'] = next_phase
self._save_game_state(chat_id, state_data)
# 获取下一阶段描述
next_phase_desc = self._get_phase_description(next_phase)
# 构建提示消息
round_num = state_data.get('round', 1)
if next_phase.startswith('night'):
time_desc = "夜晚"
else:
time_desc = "白天"
msg = f"\n\n---\n\n## 🌙 进入下一阶段\n\n"
msg += f"**{time_desc} - {next_phase_desc['name']}**\n\n"
msg += f"👤 {next_phase_desc['role']}请行动:\n"
msg += f"{next_phase_desc['instruction']}"
return msg
def _open_game(self, chat_id: int, user_id: int) -> str:
"""主持人开房
@@ -296,8 +396,16 @@ class WerewolfGame(BaseGame):
# 私聊发送身份
await self._send_identities(chat_id, state_data)
# 获取当前阶段描述
phase_desc = self._get_phase_description('night_kill')
# 公共消息
return f"## 🎮 游戏开始!\n\n玩家已分配身份,请查看私聊消息\n\n第一夜,天黑请闭眼..."
msg = f"## 🎮 游戏开始!\n\n玩家已分配身份,请查看私聊消息\n\n"
msg += f"---\n\n## 🌙 第一夜 - {phase_desc['name']}\n\n"
msg += f"🐺 **{phase_desc['role']}请行动**\n"
msg += f"{phase_desc['instruction']}"
return msg
async def _send_identities(self, chat_id: int, state_data: Dict):
"""发送身份信息到私聊
@@ -316,7 +424,7 @@ class WerewolfGame(BaseGame):
role_details = {
'wolf': '你的技能:\n- 每晚可以投票决定杀死一个目标\n- 你认识所有狼人同伴\n- 胜利条件:杀死所有神职和平民\n\n使用 `.werewolf 杀 <id>` 投票杀人',
'seer': '你的技能:\n- 每晚可以查验一个玩家的身份\n- 胜利条件:消灭所有狼人\n\n使用 `.werewolf 验 <id>` 查验身份',
'witch': '你的技能:\n- 拥有一瓶解药和一瓶毒药\n- 每晚可以救人(只能使用一次)或毒人(只能使用一次)\n- 胜利条件:消灭所有狼人\n\n使用 `.werewolf 救 <id>` 救人\n使用 `.werewolf 毒 <id>` 毒人',
'witch': '你的技能:\n- 拥有一瓶解药和一瓶毒药\n- 每晚可以救人(只能使用一次)或毒人(只能使用一次)\n- 也可以选择跳过不行动\n- 胜利条件:消灭所有狼人\n\n使用 `.werewolf 救 <id>` 救人\n使用 `.werewolf 毒 <id>` 毒人\n使用 `.werewolf 跳过` 不行动',
'civilian': '你没有特殊技能\n\n你的胜利条件:消灭所有狼人\n\n仔细观察,通过投票帮助好人阵营获胜'
}
@@ -534,12 +642,20 @@ class WerewolfGame(BaseGame):
if not target['alive']:
return f"{target_id}号玩家已死亡!"
# 检查当前阶段
if current_phase != 'night_kill':
return f"❌ 当前不是狼人行动阶段!当前阶段:{self._get_phase_description(current_phase)['name']}"
# 记录投票
# 简化:只要有一个狼人投票就算成功
if state_data.get('kill_target') is None:
state_data['kill_target'] = target_id
self._save_game_state(chat_id, state_data)
return f"✅ 投票成功:刀{target_id}号玩家"
# 自动推进到下一阶段
next_phase_msg = self._advance_phase(chat_id, state_data)
return f"✅ 投票成功:刀{target_id}号玩家{next_phase_msg}"
else:
return f"⚠️ 今晚已经有了投票目标:{state_data['kill_target']}"
@@ -562,6 +678,10 @@ class WerewolfGame(BaseGame):
if not current_phase or not current_phase.startswith('night'):
return "❌ 只能在夜晚使用技能!"
# 检查当前阶段
if current_phase != 'night_seer':
return f"❌ 当前不是预言家验人阶段!当前阶段:{self._get_phase_description(current_phase)['name']}"
# 查找目标
target = None
for p in state_data['players']:
@@ -582,7 +702,10 @@ class WerewolfGame(BaseGame):
msg = f"## 🔮 验人结果\n\n{target_id}号玩家的身份是:**{result_text}**"
await self._send_to_player(player['user_id'], msg, sender="系统")
return f"✅ 验人成功!已私聊发送结果"
# 自动推进到下一阶段
next_phase_msg = self._advance_phase(chat_id, state_data)
return f"✅ 验人成功!已私聊发送结果{next_phase_msg}"
async def _witch_save(self, chat_id: int, state_data: Dict, player: Dict, target_id: int) -> str:
"""女巫救人
@@ -606,6 +729,10 @@ class WerewolfGame(BaseGame):
if not current_phase or not current_phase.startswith('night'):
return "❌ 只能在夜晚使用技能!"
# 检查当前阶段
if current_phase != 'night_witch':
return f"❌ 当前不是女巫行动阶段!当前阶段:{self._get_phase_description(current_phase)['name']}"
# 查找目标
target = None
for p in state_data['players']:
@@ -620,7 +747,10 @@ class WerewolfGame(BaseGame):
state_data['witch_save'] = True
self._save_game_state(chat_id, state_data)
return f"✅ 救人成功:救了{target_id}号玩家"
# 自动推进到下一阶段
next_phase_msg = self._advance_phase(chat_id, state_data)
return f"✅ 救人成功:救了{target_id}号玩家{next_phase_msg}"
async def _witch_poison(self, chat_id: int, state_data: Dict, player: Dict, target_id: int) -> str:
"""女巫毒人
@@ -644,6 +774,10 @@ class WerewolfGame(BaseGame):
if not current_phase or not current_phase.startswith('night'):
return "❌ 只能在夜晚使用技能!"
# 检查当前阶段
if current_phase != 'night_witch':
return f"❌ 当前不是女巫行动阶段!当前阶段:{self._get_phase_description(current_phase)['name']}"
# 查找目标
target = None
for p in state_data['players']:
@@ -661,7 +795,52 @@ class WerewolfGame(BaseGame):
state_data['witch_poison'] = target_id
self._save_game_state(chat_id, state_data)
return f"✅ 毒人成功:毒了{target_id}号玩家"
# 自动推进到下一阶段
next_phase_msg = self._advance_phase(chat_id, state_data)
return f"✅ 毒人成功:毒了{target_id}号玩家{next_phase_msg}"
async def _witch_pass(self, chat_id: int, user_id: int) -> str:
"""女巫跳过(不行动)
Args:
chat_id: 会话ID
user_id: 用户ID
Returns:
提示消息
"""
state_data = self._get_game_state(chat_id)
if not state_data:
return "❌ 没有正在进行的游戏!"
if state_data['status'] != 'playing':
return "❌ 游戏未开始或已结束!"
# 查找玩家
player = None
for p in state_data['players']:
if p['user_id'] == user_id:
player = p
break
if not player:
return "❌ 你不是游戏参与者!"
if player['role'] != 'witch':
return "❌ 只有女巫可以跳过!"
if not player['alive']:
return "❌ 死亡玩家无法使用技能!"
current_phase = state_data['phase']
if current_phase != 'night_witch':
return f"❌ 当前不是女巫行动阶段!当前阶段:{self._get_phase_description(current_phase)['name']}"
# 自动推进到下一阶段
next_phase_msg = self._advance_phase(chat_id, state_data)
return f"✅ 女巫选择跳过,不行动{next_phase_msg}"
def _show_status(self, chat_id: int) -> str:
"""显示游戏状态
@@ -683,11 +862,18 @@ class WerewolfGame(BaseGame):
if status != 'playing':
return "❌ 游戏未开始或已结束!"
# 获取当前阶段描述
current_phase = state_data.get('phase', 'unknown')
phase_desc = self._get_phase_description(current_phase)
# 显示玩家状态(只显示存活状态,不显示身份)
msg = f"## 🎮 游戏进行中\n\n"
msg += f"回合:第{state_data['round']}回合\n"
msg += f"阶段:{state_data['phase']}\n\n"
msg += f"**玩家状态**\n"
msg += f"**回合**:第{state_data['round']}回合\n"
msg += f"**当前阶段**{phase_desc['name']}\n"
msg += f"**行动角色**{phase_desc['role']}\n"
if phase_desc['instruction']:
msg += f"**操作指令**{phase_desc['instruction']}\n"
msg += f"\n**玩家状态**\n"
alive_count = 0
dead_count = 0
@@ -752,6 +938,7 @@ class WerewolfGame(BaseGame):
- `.werewolf 验 <id>` - 预言家验人
- `.werewolf 救 <id>` - 女巫救人
- `.werewolf 毒 <id>` - 女巫毒人
- `.werewolf 跳过` - 女巫跳过(不行动)
### 游戏规则
**人数配置**