Есть ли более элегантный способ проверить количество и тип игральных костей?
Вы можете использовать регулярное выражение для синтаксического анализа (\d+)d(\d+)
, чтобы извлечь X и Y из XdY . Или даже просто разделите на "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), но его довольно легко расширить для поддержки, например, взвешенных игральных костей или специальные кубики, на которых дублируются некоторые грани (хотя, очевидно, последнее может поддерживаться путем простого переназначения значений из обычных кубиков).