嵌套 If/While/If 语句的问题

Issue with Nested If/While/If statement

作为 D&D 的狂热爱好者,我编写了一个脚本来为任何指定的骰子执行任何攻击和伤害掷骰,包括在关键攻击掷骰 (20) 的情况下会发生什么。

from random import randint

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

def dice_roller(x, y, z):
    y1 = int(y.strip('d'))
    dict = {}
    results = []
    step = 1
    while step <= z:
        die = randint(1,y1)
        results.append(die)
        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)
    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(dict)

print(dice_roller(atk_hit, die, rolls))

{'Attack Roll: 20 + 6 = 26': {'Damage Roll: 1d10': {'Rolls': [4], 'Total Damage': 18, 'Pct_Damage': '75%'}}}
None

当我引入一个新的“if/else”语句来说明未命中的攻击时,问题就出现了。唯一不起作用的掷骰是关键掷骰:

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'))
    dict = {}
    results = []
    step = 1
    if x >= ac:
        while step <= z:
            die = randint(1,y1)
            results.append(die)
            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)
                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(dict)
    else:
        print('Your attack missed')

print(dice_roller((atk_hit), die, rolls))
{}
None

当我在第二个脚本中将“atk_roll”的值改回“randint(1,20)”时,代码完全按预期工作,注意到攻击未命中或返回字典攻击命中时的值。我一辈子都弄不明白为什么代码只在“atk_roll”= 20 时才返回空白字典。它与 if/while/if 的嵌套语法有关吗?谢谢!

在您提供的第二个代码片段中:if-else 块 if ask_roll == 20: 将始终被采用,因此您的字典将不会填充值,因为 atk_roll 值始终为 20。这是因为您的 dict 被填充在以下 else.

这与您的第一段代码不同,因为 dict 每次调用函数时都会更新,因为它位于任何条件语句之外。

我需要有关您的代码功能的更多详细信息才能提供详细的解决方案,但我会尝试提供高级解决方案。如果您尝试更新字典而不管 atk_roll 是否等于 20,那么更新应该在条件语句中检查 atk_roll 是否等于 20 的嵌套 else 块之外。此代码段包含在下面。

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)
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%}'}}})