【问题标题】:Python dice throwPython掷骰子
【发布时间】:2020-07-13 17:12:39
【问题描述】:

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

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-throw?

【问题讨论】:

    标签: python dice


    【解决方案1】:

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

    您可以使用正则表达式解析(\d+)d(\d+),以便从XdY 中提取X 和Y。或者甚至只是在"d" 上拆分,因为输入格式严格为&lt;numbers&gt;d&lt;numbers&gt;,这意味着拆分不是模棱两可的。

    由此,您可以使用getattr 从 dice 模块中获取相应的方法,尽管实际上 dice 模块并不是真正有用: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 中添加了选项),但可以相当容易地扩展以支持例如加权骰子,或某些面重复的特殊骰子(尽管显然后者可以通过重新分配常规骰子的值来支持)。

    【讨论】:

    • 我试图实现你的第一个例子,但我只是得到了输出&lt;generator object roll.&lt;locals&gt;.&lt;genexpr&gt; at 0x00A9FB18&gt; 但是,通过对for n in range(rolls): x = random.randint(1, dice) print (x) 的微小调整,我终于得到了我的结果。非常感谢
    • 您是否在return 处使用了括号?括号将返回一个生成器,而括号(正如我所使用的)将返回一个列表。
    • 是的,我做到了。老实说,我公然复制粘贴了您的代码,并简单地将其调整为我所拥有的
    【解决方案2】:

    使用正则表达式 (read about regex here) 可以做到的最“专业”的方式。

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

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

    此外,您在列表中使用random.choice 来获取从16 的随机数,您可以使用d6 例如random.randint(1, 6) 而不是random.choice 它会返回从16 的随机数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 2018-09-08
      • 2013-03-17
      • 1970-01-01
      • 2018-06-30
      • 2012-02-29
      相关资源
      最近更新 更多