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

Python嵌套If/While/If结构导致D&D骰子脚本暴击场景返回空字典

问题根因
  • 核心是缩进错误导致暴击场景跳过了字典更新逻辑:你修改后的代码中,dict.update() 语句被错误缩进在了if atk_roll == 20的else分支内,只有非暴击场景才会执行字典写入,暴击时直接跳过该步骤,因此返回空字典。
  • 其次是代码块位置错误:伤害计算、字典更新逻辑被错误放在了while循环内部,原本应该在所有骰子掷完后统一计算,现在会每掷一个骰子就执行一次,属于逻辑嵌套错误。
  • 额外的None输出是因为你定义的函数没有显式return值,Python会默认返回None,最后一行print(dice_roller(...))就会打印这个默认返回值。
修复方案

调整代码缩进,把伤害计算、字典更新逻辑移到while循环外,恢复和初始版本一致的逻辑层级即可,注意不要用dict作为变量名,这是Python内置的字典类关键字,容易引发命名冲突,修复后代码如下:

from random import randint

atk_roll = 20
hit_mod = 6
atk_hit = atk_roll + hit_mod
die = 'd10'
dmg_mod = 4
rolls = 1
ac = 15

def dice_roller(x, y, z):
    y1 = int(y.strip('d'))
    res_dict = {}
    results = []
    step = 1
    if x >= ac:
        # 先掷完所有骰子
        while step <= z:
            die_val = randint(1,y1)
            results.append(die_val)
            step += 1
        # 再统一计算伤害
        if atk_roll == 20:
            total = (sum(results)+dmg_mod) + (y1*z)
            pct_dmg = total / (((y1*z)+dmg_mod) + (y1*z))
        else:
            total = sum(results) + dmg_mod
            pct_dmg = total / ((y1*z)+dmg_mod)
        # 统一更新字典
        res_dict.update({'Attack Roll: ' + f'{atk_roll} + {hit_mod} = {x}':
                    {'Damage Roll: ' + f'{z}' + y:
                    {'Rolls': results, 'Total Damage': total, 'Pct_Damage': f'{pct_dmg:.0%}'}}})
        print(res_dict)
        return res_dict # 显式返回结果,避免返回None
    else:
        miss_info = 'Your attack missed'
        print(miss_info)
        return miss_info

# 不需要再套一层print,函数内部已经会打印输出
dice_roller(atk_hit, die, rolls)

内容的提问来源于stack exchange,提问作者Paul Kearney

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:36:00