| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- # -*- 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(" > "))
-
|