因此,对于一个私人项目,我想对几个不同的骰子的投掷进行数字化。到目前为止,我的代码要求输入、抛出多少个骰子和什么类型的骰子,并输出结果。到目前为止,我有以下几点:
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抛出?
发布于 2020-07-13 09:00:46
有没有更优雅的方法来检查骰子的数量和类型?
您可以使用regex解析(\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中添加了选项),但可以相当容易地扩展到支持加权骰子,或者某些面被复制的特殊骰子(尽管显然可以通过从常规骰子重新分配值来支持后者)。
发布于 2020-07-13 09:04:39
您所能做的最“专业”的方法是使用Regex (阅读这里关于regex的文章)。
对于您的输入,模式([0-9]*)(d[46])匹配两个组。
对于输入3d6,它将匹配('3', 'd6')。
另外,在从1到6的随机数列表中使用的是random.randint(1, 6),例如,random.randint(1, 6)而不是random.choice,它将从1返回一个随机数到6。
https://stackoverflow.com/questions/62872434
复制相似问题