lancer.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. # -*- coding: utf-8 -*-
  2. """lancer de des"""
  3. from random import *
  4. from operator import add
  5. def de(faces):
  6. """resultat d'un de avec nbre de faces en parametre"""
  7. return randint(1,faces)
  8. def jet(expr):
  9. """effectue un jet de de a partir d'expressions de type '1d20+3' -
  10. retourne un resultat chiffre et un resultat detaille."""
  11. decoupage = lancer = []
  12. estDe = False
  13. nb = res = 0
  14. resDetaille = signe = tmp = ""
  15. #on decoupe la chaine en se basant sur tout ce qui n'est pas un chiffre:
  16. if expr:
  17. expr += " "
  18. for car in expr:
  19. try:
  20. #le caractere est-il un chiffre? si oui, on le stocke dans tmp
  21. tmp += str(int(car))
  22. except:
  23. #si ce n'est pas un chiffre, qu'est-ce?
  24. if car.lower() == "d":
  25. estDe = True
  26. nb = int(tmp)
  27. lancer = []
  28. tmp = ""
  29. #on garde en memoire le nombre stocke dans tmp,
  30. #puis on attend le prochain tmp pour effectuer le jet de de
  31. else:
  32. if estDe:
  33. #on lance le de
  34. i = 0
  35. while i < nb:
  36. lancer.append(de(int(tmp)))
  37. i+=1
  38. decoupage.append(lancer)
  39. decoupage.append(car)
  40. estDe = False
  41. tmp = ""
  42. else:
  43. decoupage.append(tmp)
  44. if car != " ":
  45. decoupage.append(car)
  46. tmp = ""
  47. decoupage.append(tmp)
  48. #on calcule ensuite tout ca:
  49. for elt in decoupage:
  50. if type(elt) == list:
  51. elt = int(sum(elt[:]))
  52. try:
  53. elt = int(elt)
  54. if signe == "-":
  55. elt = -1 * elt
  56. res += elt
  57. except:
  58. signe = elt
  59. #on met en forme le resultat detaille
  60. for elt in decoupage:
  61. if type(elt) == list:
  62. elt = map(str, elt)
  63. elt = ",".join(elt)
  64. resDetaille += " "+str(elt)
  65. resDetaille = resDetaille.replace(" ","")
  66. return (res, resDetaille)
  67. if __name__ == "__main__":
  68. # si lancement direct:
  69. while True:
  70. lancer = jet(raw_input(" > "))
  71. print("{} ({})".format(lancer[0], lancer[1]))