Ich schreibe einen benutzerdefinierten Würfel Rollen Parser (sicker, wenn Sie müssen) in Python. Grundsätzlich mag ich Standard-Mathematik-Auswertung verwenden, aber den 'd' Operator hinzufügen:Wie evaluiere ich einen benutzerdefinierten mathematischen Ausdruck in Python
#xdy
sum = 0
for each in range(x):
sum += randInt(1, y)
return sum
Damit zum Beispiel 1W6 + 2W6 + 2d6-72 + 4d100 = (5) + (1 + 1) + (6 + 2) -72+ (5 + 39 + 38 + 59) = 84
Ich benutzte Regex, um alle 'd's durch die Summe zu ersetzen und dann eval zu verwenden, aber meine Regex fiel auseinander, wenn es um Klammern ging jeder Seite. Gibt es einen schnelleren Weg, als das eigene rekursive Parsing zu implementieren? Vielleicht einen Operator zu Eval hinzufügen?
Edit: Ich habe ein schlechtes Beispiel angegeben, wie das obige Beispiel mit meiner aktuellen Version funktioniert. Nach was ich suche, ist eine Weise, zum Beispiel auszuwerten, (5+ (6d6)) d (7-2 * (1d4)).
Mit "auseinanderfallen" meinte ich nur, dass mein aktueller Regex-Ausdruck fehlschlug. Ich war zu vage über mein Versagen, Entschuldigung für die Verwirrung. Hier ist mein aktueller Code:
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())
für diesen "1W6 + 4d100" funktioniert gut, aber "(1W6 + 4) d100" oder sogar "1W6 + 4d (100)" schlägt fehl.
Können Sie uns zeigen, was Sie versucht haben und wie es versagt hat? –
Am Ende nur eine rekursive Hilfsfunktion. Danke für die Hilfe! – taynaron