Sto scrivendo un parser di dadi personalizzato (snicker se necessario) in python. Fondamentalmente, io voglio usare la valutazione matematica standard, ma aggiungere l'operatore 'd':Come valutare un'espressione matematica personalizzata in Python
#xdy
sum = 0
for each in range(x):
sum += randInt(1, y)
return sum
modo che, ad esempio, 1d6 + 2d6 + 2d6-72 + 4d100 = (5) + (1 + 1) + (6 + 2) -72+ (5 + 39 + 38 + 59) = 84
Stavo usando regex per sostituire tutti i 'd' s con la somma e poi usare eval, ma il mio regex è andato in pezzi quando si trattava di parentesi su entrambi i lati. C'è un modo più veloce per fare questo che implementare la mia analisi ricorsiva? Forse aggiungendo un operatore per valutare?
Modifica: mi sembra di aver dato un cattivo esempio, come l'esempio precedente funziona con la mia versione corrente. Quello che sto cercando è un modo per valutare, diciamo, (5+ (6d6)) d (7-2 * (1d4)).
Con "caduto a pezzi", volevo solo dire che la mia espressione regex corrente non funzionava. Sono stato troppo vago per il mio fallimento, mi dispiace per la confusione. Ecco il mio codice corrente:
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())
per questo, "1d6 + 4d100" funziona bene, ma "(1d6 + 4) d100" o anche "1d6 + 4d (100)" fallisce.
Puoi mostrarci cosa hai provato e come è fallito? –
Finito solo facendo una funzione di supporto ricorsivo. Grazie per tutto l'aiuto! – taynaron