3D6+3
Verfasst: Samstag 1. November 2008, 10:44
Hatte vor einigen Tagen aus Langeweile das folgende gebaut:
Dies wirft einen n-seitigen Würfel.
Ist der zweite Parameter `True`, wird bei der höchstmöglichen Augenzahl der Würfel nochmal geworfen. Der Würfelwurf kann "explodieren" - etwas, das man z.B. im Rollenspiel Savage Worlds braucht. Worauf es mir aber eigentlich ankommt ist, einen beliebigen Ausdruck `xdy+z` auswerten zu können:
Kann man das noch knapper/eleganter/verständlicher ausdrücken?
Stefan
Dies wirft einen n-seitigen Würfel.
Code: Alles auswählen
import random
def d(n, aces=False):
r = random.randrange(n) + 1
return r + d(n, aces) if aces and r == n else r
Code: Alles auswählen
import re
_RE_DICE = re.compile(r"(\d+)?d(\d+)?|(\d+)|([-+])")
def roll(dice, aces=False):
result = 0; sign = 1
for m in _RE_DICE.finditer(dice):
if m.lastindex == 2:
count = int(m.group(1) or 1)
sides = int(m.group(2) or 6)
for i in range(count):
result += d(sides, aces) * sign
elif m.lastindex == 3:
result += int(m.group(3)) * sign
else:
sign = +1 if m.group(4) == '+' else -1
return result
Stefan