首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python掷骰子

Python掷骰子
EN

Stack Overflow用户
提问于 2020-07-13 08:54:06
回答 2查看 939关注 0票数 0

因此,对于一个私人项目,我想对几个不同的骰子的投掷进行数字化。到目前为止,我的代码要求输入、抛出多少个骰子和什么类型的骰子,并输出结果。到目前为止,我有以下几点:

代码语言:javascript
复制
import dice

die = input("Roll the dice: ")

if die == "d4":
    dice.d4()
elif die == "d6":
    dice.d6()

而骰子模块包含

代码语言:javascript
复制
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抛出?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-13 09:00:46

有没有更优雅的方法来检查骰子的数量和类型?

您可以使用regex解析(\d+)d(\d+),以便从XdY中提取X和Y。或者甚至只是在"d"上拆分,因为输入格式严格地是<numbers>d<numbers>,这意味着拆分是不含糊的。

由此,您可以使用getattr从骰子模块获得相应的方法,尽管实际上骰子模块并不真正有用:dX只是random.randint(1, X)。这样你就可以得到这样的东西:

代码语言:javascript
复制
def roll(spec):
    rolls, dice = map(int, spec.split('d'))
    return [
        random.randint(1, dice)
        for _ in range(rolls)
    ]

对于你想要支持的骰子的“形状”没有任何限制,这和从1到本质上无穷大的任何面数都是一样的。

顺便说一句,这可以通过使用random.choices和显式range来进一步修改。你是否觉得它更简单是一个品味问题:

代码语言:javascript
复制
def roll(spec):
    rolls, dice = map(int, spec.split('d'))
    return random.choices(range(1, dice+1), k=rolls)

这具有不太广泛的兼容性( python 3.6中添加了选项),但可以相当容易地扩展到支持加权骰子,或者某些面被复制的特殊骰子(尽管显然可以通过从常规骰子重新分配值来支持后者)。

票数 2
EN

Stack Overflow用户

发布于 2020-07-13 09:04:39

您所能做的最“专业”的方法是使用Regex (阅读这里关于regex的文章)。

对于您的输入,模式([0-9]*)(d[46])匹配两个组。

对于输入3d6,它将匹配('3', 'd6')

另外,在从16的随机数列表中使用的是random.randint(1, 6),例如,random.randint(1, 6)而不是random.choice,它将从1返回一个随机数到6

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62872434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档