如何优化Python中重复if语句 精简龙与地下城属性检定代码
DnD 属性检定代码优化方案
核心优化逻辑是用字典映射替换冗余的if-elif分支,将技能名称和对应加值绑定,重复的掷骰、打印逻辑抽为公共部分,后续新增/修改技能只需要维护映射关系即可,不需要新增判断分支。
优化后代码(当前硬编码加值版本)
import random # 技能-加值映射表,后续直接修改对应值即可,新增技能只需要加一行键值对 ability_bonus = { "acrobatics": 2, "animal handling": 2, "arcana": 8, "athletics": 0, "deception": 0, "history": 0, "insight": 0, "intimidation": 0, "investigation": 0, "medicine": 0, "nature": 0, "perception": 0, "performance": 0, "persuasion": 0, "religion": 0, "sleight of hand": 0, "survival": 0 } # 自动生成格式化的技能名列表,不用手动重复输入两次长列表 ability_display = [k.title() for k in ability_bonus.keys()] ability_list_str = "、".join(ability_display) def ability_check(): user_ability = input(f"你需要进行哪项技能检定:\n{ability_list_str}?").lower() while user_ability not in ability_bonus: user_ability = input(f"请从以下技能中选择:\n{ability_list_str}:").lower() # 通用掷骰计算逻辑,仅写一次即可适配所有技能 roll = random.randint(1, 20) total = roll + ability_bonus[user_ability] print(f"你的{user_ability.title()}检定结果为:{total}") ability_check()
对接DnD_Attributes模块的修改方法
直接将映射表中的硬编码值替换为模块对应属性即可:
import random import DnD_Attributes ability_bonus = { "acrobatics": DnD_Attributes.Acrobatics, "animal handling": DnD_Attributes.AnimalHandling, "arcana": DnD_Attributes.Arcana, # 剩余技能按上述格式对应替换即可 }
如果模块内的属性名和技能名的驼峰命名规则完全匹配,还可以用getattr自动读取属性,省去手动写全映射表的步骤:
def get_ability_bonus(ability_name: str) -> int: # 将空格分隔的技能名转为驼峰格式,匹配模块属性命名 attr_name = ability_name.replace(" ", "_").title() # 第二个参数为默认值,找不到对应属性时返回0 return getattr(DnD_Attributes, attr_name, 0)
其他可优化方向
- 增加优势/劣势检定支持:让用户选择是否有优势/劣势,自动掷两次D20取最高/最低值,更贴合DnD官方规则
- 封装为角色类:将角色的所有属性、技能加值、检定方法封装为
Character类,方便同时管理多个角色的数据 - 增加自然数1/20的大成功/大失败提示,符合跑团常用规则
内容的提问来源于stack exchange,提问作者Maykid
相关产品推荐
相关产品推荐

