嵌套 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%}'}}})
作为 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%}'}}})