# -*- 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 nbDes = 0 res = 0 resDetaille = "" signe = "" tmp = "" valide = True #on decoupe la chaine en se basant sur tout ce qui n'est pas un chiffre: expr.replace(" ","") if len(expr) > 0: expr += " " #pour forcer la prise en compte du dernier membre for car in expr: if estEntier(car): tmp += car else: if car.lower() == "d": estDe = True nbDes = int(tmp) lancer = [] tmp = "" else: if estDe: for i in range(0, nbDes): lancer.append(de(int(tmp))) decoupage.append(lancer) estDe = False else: decoupage.append(tmp) if car != " ": decoupage.append(car) tmp = "" #on calcule ensuite tout ca: for elt in decoupage: if type(elt) == list: elt = int(sum(elt[:])) if estEntier(elt): elt = int(elt) if signe == "-": elt = -1 * elt res += elt else: if elt == "+" or elt == "-": signe = elt else: valide = False break #on met en forme le resultat detaille for elt in decoupage: if type(elt) == list: elt = map(str, elt) elt = ",".join(elt) resDetaille += (" "+elt) resDetaille = resDetaille.replace(" ","") if not valide or len(expr) == 0: res = None resDetaille = "" return (res, resDetaille) def estEntier(val): """renvoie vrai si val est convertible en entier""" retour = False try: val3 = float(val) val2 = int(val3) retour = (val2 == val3) except: pass return retour def estJetValide(expr): """renvoie vrai si la syntaxe est bien celle d'un lancer de des""" valide = True if len(expr) > 0: for car in expr: valide = (estEntier(car) or (car in ["d","D","+","-"])) else: valide = False return valide if __name__ == "__main__": # si lancement direct: while True: ## lancer = jet(raw_input(" > ")) ## print("{} ({})".format(lancer[0], lancer[1])) print estJetValide(raw_input(" > "))