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
相关产品推荐
相关产品推荐

