问题描述
我正在努力提高我的编码技能,所以我认为在 DnD 中创建角色统计数据会很有趣。我创建了一个 main() 函数,该函数创建了一个包含可能统计信息(STR、DEX 等)的字典,将初始值设置为 0,然后根据用户输入(3d6、4d6)将该字典传递给不同的函数。目前,程序只是遍历字典并在滚动时分配值。
这是目前的代码
#!/usr/bin/env python3
# c_stats2.py
import random
import math
# 4d6 drop lowest
def m4d6(x):
for stat in x:
rolls = []
for roll in range(4):
r = random.randint(1,6)
rolls.append(r)
# Drop lowest number
del rolls[rolls.index(min(rolls))]
x[stat] += sum(rolls)
return x
# 3d6 drop lowest
def m3d6(x):
for stat in x:
rolls = []
for roll in range(3):
r = random.randint(1,6)
rolls.append(r)
x[stat] += sum(rolls)
return x
def main():
method = input("Select stat method: ")
stats = {'STR': 0,'DEX': 0,'CON': 0,'INT': 0,'WIS': 0,'CHA': 0
}
while True:
if method == '4d6' or method == '4D6':
stats = m4d6(stats)
break
elif method == '3d6' or method == '3D6':
stats = m3d6(stats)
break
else:
method = input('Please enter a valid method: ')
continue
for stat in stats:
print(stat,':',stats[stat],'\tBonus:',math.floor((int(stats[stat]) - 10)/2))
print("Initiative:",math.floor((int(stats['DEX']) - 10)/2))
main()
我想添加一个选项,允许用户实际选择统计数据的去向。我的想法是我会创建一个滚动值列表,将它们分配给字典中的一个统计信息,然后从滚动值列表中删除该值并将字典返回到新值。这是目前的代码。
# 4d6 drop lowest,choose stats
def m4d6c(x):
val = []
for dice in range(6):
rolls = []
for roll in range(4):
r = random.randint(1,6)
rolls.append(r)
del rolls[rolls.index(min(rolls))]
dice += sum(rolls)
val.append(dice)
for stat in x:
print(val)
print(str("Insert value for {}.").format(stat))
dic = input('Value: ')
if dic in val:
x[stat] += dic
val.remove(dic)
continue
else:
print("Please enter a valid value")
continue
return x
问题是这些值没有分配给统计数据,也没有从 val
列表中删除。谁能告诉我我在这里可能做错了什么?
解决方法
看起来您很接近,但您忘记了 input
返回一个字符串,而在 m4d6c
中,您需要一个 int
才能使您的逻辑正常工作。
当前:
dic = input('Value: ')
需要:
dic = int(input('Value: '))