You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 00:15:05