# -*- coding: utf-8 -*- """lancer de des""" from random import * from operator import add def de(faces): """resultat d'un de avec nbre de faces en parametre""" return randint(1,faces) def jet(expr): """effectue un jet de de a partir d'expressions de type '1d20+3' - retourne un resultat chiffre et un resultat detaille.""" decoupage = lancer = [] estDe = False nb = res = 0 resDetaille = signe = tmp = "" #on decoupe la chaine en se basant sur tout ce qui n'est pas un chiffre: if expr: expr += " " for car in expr: try: #le caractere est-il un chiffre? si oui, on le stocke dans tmp tmp += str(int(car)) except: #si ce n'est pas un chiffre, qu'est-ce? if car.lower() == "d": estDe = True nb = int(tmp) lancer = [] tmp = "" #on garde en memoire le nombre stocke dans tmp, #puis on attend le prochain tmp pour effectuer le jet de de else: if estDe: #on lance le de i = 0 while i < nb: lancer.append(de(int(tmp))) i+=1 decoupage.append(lancer) decoupage.append(car) estDe = False tmp = "" else: decoupage.append(tmp) if car != " ": decoupage.append(car) tmp = "" decoupage.append(tmp) #on calcule ensuite tout ca: for elt in decoupage: if type(elt) == list: elt = int(sum(elt[:])) try: elt = int(elt) if signe == "-": elt = -1 * elt res += elt except: signe = elt #on met en forme le resultat detaille for elt in decoupage: if type(elt) == list: elt = map(str, elt) elt = ",".join(elt) resDetaille += " "+str(elt) resDetaille = resDetaille.replace(" ","") return (res, resDetaille) if __name__ == "__main__": # si lancement direct: while True: lancer = jet(raw_input(" > ")) print("{} ({})".format(lancer[0], lancer[1]))