因此对于一个私人项目,我想将几个不同骰子的投掷数字化。到目前为止,我的代码要求输入,抛出多少骰子和输出哪种骰子,并输出结果。到目前为止,我有以下内容:
import dice
die = input("Roll the dice: ")
if die == "d4":
dice.d4()
elif die == "d6":
dice.d6()
骰子模块包含
import random
def d4():
n = int(input())
x = 0
d4=[1, 2, 3, 4]
while x < n:
print(random.choice(d4))
x = x + 1
def d6():
n = int(input())
x = 0
d6=[1, 2, 3, 4, 5, 6]
while x < n:
print(random.choice(d6))
x = x + 1
,依此类推。 用于确定骰子类型的if-elif检查似乎起作用,但感觉有些笨拙。 现在我的问题是:有没有更优雅的方法来检查骰子的数量和类型? 例如,我可以输入3d6,脚本会计算3次d6投掷次数?
答案 0 :(得分:2)
有没有更优雅的方法来检查骰子的数量和类型?
您可以使用正则表达式解析(\d+)d(\d+)
,以便从XdY中提取X和Y。甚至只对"d"
进行拆分,因为输入格式严格为<numbers>d<numbers>
,意味着拆分不是模棱两可。
由此,您可以使用getattr
从色子模块中获取相应的方法,尽管实际上色子模块并没有真正的用处:dX
只是random.randint(1, X)
。因此,您可以按照以下方式进行操作:
def roll(spec):
rolls, dice = map(int, spec.split('d'))
return [
random.randint(1, dice)
for _ in range(rolls)
]
对于要支撑的骰子的“形状”没有任何限制,这对于从1到基本上无穷大的任何面都可以。
顺便说一句,可以使用random.choices
和显式range
对其进行进一步修改。您是否发现它简单与否取决于品味:
def roll(spec):
rolls, dice = map(int, spec.split('d'))
return random.choices(range(1, dice+1), k=rolls)
这没有那么广泛的兼容性(在python 3.6中添加了选择),但是可以很容易地扩展以支持例如加权骰子或某些面重复的特殊骰子(尽管显然可以通过重新分配常规骰子的值来支持后者)。
答案 1 :(得分:0)
使用正则表达式(read about regex here)是最“专业”的方式。
对于您输入的模式([0-9]*)(d[46])
,它与两组匹配。
对于输入3d6
,它将匹配('3', 'd6')
。
此外,您正在使用random.choice
到1
的随机数列表中的6
,例如{{1} }而不是d6
,它会从random.randint(1, 6)
到random.choice
返回一个随机数。