|
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
"""三国狼人杀角色定义"""
|
|
|
|
|
|
from typing import Dict, List
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class GameRoles:
|
|
|
|
|
|
"""游戏角色管理类"""
|
|
|
|
|
|
|
|
|
|
|
|
ROLES = {
|
|
|
|
|
|
"狼人": {
|
|
|
|
|
|
"description": "狼人",
|
|
|
|
|
|
"ability": "夜晚可以击杀一名玩家",
|
|
|
|
|
|
"win_condition": "消灭所有好人或与好人数量相等",
|
|
|
|
|
|
"team": "狼人阵营"
|
|
|
|
|
|
},
|
|
|
|
|
|
"预言家": {
|
|
|
|
|
|
"description": "预言家",
|
|
|
|
|
|
"ability": "每晚可以查验一名玩家的身份",
|
|
|
|
|
|
"win_condition": "消灭所有狼人",
|
|
|
|
|
|
"team": "好人阵营"
|
|
|
|
|
|
},
|
|
|
|
|
|
"女巫": {
|
|
|
|
|
|
"description": "女巫",
|
|
|
|
|
|
"ability": "拥有解药和毒药各一瓶,可以救人或杀人",
|
|
|
|
|
|
"win_condition": "消灭所有狼人",
|
|
|
|
|
|
"team": "好人阵营"
|
|
|
|
|
|
},
|
|
|
|
|
|
"猎人": {
|
|
|
|
|
|
"description": "猎人",
|
|
|
|
|
|
"ability": "被投票出局时可以开枪带走一名玩家",
|
|
|
|
|
|
"win_condition": "消灭所有狼人",
|
|
|
|
|
|
"team": "好人阵营"
|
|
|
|
|
|
},
|
|
|
|
|
|
"村民": {
|
|
|
|
|
|
"description": "村民",
|
|
|
|
|
|
"ability": "无特殊技能,依靠推理和投票",
|
|
|
|
|
|
"win_condition": "消灭所有狼人",
|
|
|
|
|
|
"team": "好人阵营"
|
|
|
|
|
|
},
|
|
|
|
|
|
"守护者": {
|
|
|
|
|
|
"description": "守护者",
|
|
|
|
|
|
"ability": "每晚可以守护一名玩家免受狼人攻击",
|
|
|
|
|
|
"win_condition": "消灭所有狼人",
|
|
|
|
|
|
"team": "好人阵营"
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CHARACTER_TRAITS = {
|
|
|
|
|
|
"刘备": "仁德宽厚,善于团结众人,说话温和有礼",
|
|
|
|
|
|
"关羽": "忠义刚烈,言辞直接,重情重义",
|
|
|
|
|
|
"张飞": "性格豪爽,说话大声直接,容易冲动",
|
|
|
|
|
|
"诸葛亮": "智慧超群,分析透彻,言辞谨慎",
|
|
|
|
|
|
"赵云": "忠勇双全,话语简洁有力",
|
|
|
|
|
|
"曹操": "雄才大略,善于权谋,话语犀利",
|
|
|
|
|
|
"司马懿": "深谋远虑,城府极深,言辞含蓄",
|
|
|
|
|
|
"周瑜": "才华横溢,略显傲气,分析精准",
|
|
|
|
|
|
"孙权": "年轻有为,善于决断,话语果决"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
|
def get_role_desc(cls, role: str) -> str:
|
|
|
|
|
|
"""获取角色描述"""
|
|
|
|
|
|
return cls.ROLES.get(role, {}).get("description", "未知角色")
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
|
def get_role_ability(cls, role: str) -> str:
|
|
|
|
|
|
"""获取角色技能"""
|
|
|
|
|
|
return cls.ROLES.get(role, {}).get("ability", "无特殊技能")
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
|
def get_character_trait(cls, character: str) -> str:
|
|
|
|
|
|
"""获取角色性格特点"""
|
|
|
|
|
|
return cls.CHARACTER_TRAITS.get(character, "性格温和,说话得体")
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
|
def is_werewolf(cls, role: str) -> bool:
|
|
|
|
|
|
"""判断是否为狼人"""
|
|
|
|
|
|
return role == "狼人"
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
|
def is_villager_team(cls, role: str) -> bool:
|
|
|
|
|
|
"""判断是否为好人阵营"""
|
|
|
|
|
|
return cls.ROLES.get(role, {}).get("team") == "好人阵营"
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
|
def get_standard_setup(cls, player_count: int) -> List[str]:
|
|
|
|
|
|
"""获取标准角色配置"""
|
|
|
|
|
|
if player_count == 6:
|
|
|
|
|
|
return ["狼人", "狼人", "预言家", "女巫", "村民", "村民"]
|
|
|
|
|
|
elif player_count == 8:
|
|
|
|
|
|
return ["狼人", "狼人", "狼人", "预言家", "女巫", "猎人", "村民", "村民"]
|
|
|
|
|
|
elif player_count == 9:
|
|
|
|
|
|
return ["狼人", "狼人", "狼人", "预言家", "女巫", "猎人", "守护者", "村民", "村民"]
|
|
|
|
|
|
else:
|
|
|
|
|
|
# 默认配置:约1/3狼人
|
|
|
|
|
|
werewolf_count = max(1, player_count // 3)
|
|
|
|
|
|
roles = ["狼人"] * werewolf_count
|
|
|
|
|
|
|
|
|
|
|
|
# 添加神职
|
|
|
|
|
|
remaining = player_count - werewolf_count
|
|
|
|
|
|
if remaining >= 1:
|
|
|
|
|
|
roles.append("预言家")
|
|
|
|
|
|
remaining -= 1
|
|
|
|
|
|
if remaining >= 1:
|
|
|
|
|
|
roles.append("女巫")
|
|
|
|
|
|
remaining -= 1
|
|
|
|
|
|
if remaining >= 1:
|
|
|
|
|
|
roles.append("猎人")
|
|
|
|
|
|
remaining -= 1
|
|
|
|
|
|
|
|
|
|
|
|
# 剩余为村民
|
|
|
|
|
|
roles.extend(["村民"] * remaining)
|
|
|
|
|
|
|
|
|
|
|
|
return roles
|