Я пишу собственный анализатор бросков костей (сникер, если нужно) на python. По сути, я хочу использовать стандартную математическую оценку, но добавлю оператор 'd':
#xdy
sum = 0
for each in range(x):
sum += randInt(1, y)
return sum
Так, например, 1d6 + 2d6 + 2d6-72 + 4d100 = (5) + (1 + 1) + (6 + 2) -72+ (5 + 39 + 38 + 59) = 84
Я использовал регулярное выражение для замены всех d на сумму, а затем использовал eval, но мое регулярное выражение распалось при работе с круглыми скобками с обеих сторон. Есть ли более быстрый способ сделать это, чем реализовать мой собственный рекурсивный разбор? Возможно добавление оператора в eval?
Edit: я, кажется, дал плохой пример, так как приведенный выше пример работает с моей текущей версией. Что я ищу, так это какой-то способ оценки, скажем, (5+ (6d6)) d (7-2 * (1d4)).
Под словом "развалился" я просто имел в виду, что мое текущее выражение регулярного выражения не удалось.
Я был слишком расплывчат в своей неудаче, извините за путаницу. Вот мой текущий код:
def evalDice(roll_matchgroup):
roll_split = roll_matchgroup.group('roll').split('d')
print roll_split
roll_list = []
for die in range(int(roll_split[0])):
roll = random.randint(1,int(roll_split[1]))
roll_list.append(roll)
def EvalRoll(roll):
if not roll: return 0
rollPattern = re.compile('(?P<roll>\d*d\d+)')
roll_string = rollPattern.sub(evalDice, roll.lower())
для этого "1d6 + 4d100" работает просто отлично, но "(1d6 + 4) d100" или даже "1d6 + 4d (100)" завершается неудачей.