lancer.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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 = []
  12. lancer = []
  13. estDe = False
  14. nbDes = 0
  15. res = 0
  16. resDetaille = ""
  17. signe = ""
  18. tmp = ""
  19. valide = True
  20. #on decoupe la chaine en se basant sur tout ce qui n'est pas un chiffre:
  21. expr.replace(" ","")
  22. if len(expr) > 0:
  23. expr += " " #pour forcer la prise en compte du dernier membre
  24. for car in expr:
  25. if estEntier(car):
  26. tmp += car
  27. else:
  28. if car.lower() == "d":
  29. estDe = True
  30. nbDes = int(tmp)
  31. lancer = []
  32. tmp = ""
  33. else:
  34. if estDe:
  35. for i in range(0, nbDes):
  36. lancer.append(de(int(tmp)))
  37. decoupage.append(lancer)
  38. estDe = False
  39. else:
  40. decoupage.append(tmp)
  41. if car != " ":
  42. decoupage.append(car)
  43. tmp = ""
  44. #on calcule ensuite tout ca:
  45. for elt in decoupage:
  46. if type(elt) == list:
  47. elt = int(sum(elt[:]))
  48. if estEntier(elt):
  49. elt = int(elt)
  50. if signe == "-": elt = -1 * elt
  51. res += elt
  52. else:
  53. if elt == "+" or elt == "-":
  54. signe = elt
  55. else:
  56. valide = False
  57. break
  58. #on met en forme le resultat detaille
  59. for elt in decoupage:
  60. if type(elt) == list:
  61. elt = map(str, elt)
  62. elt = ",".join(elt)
  63. resDetaille += (" "+elt)
  64. resDetaille = resDetaille.replace(" ","")
  65. if not valide or len(expr) == 0:
  66. res = None
  67. resDetaille = ""
  68. return (res, resDetaille)
  69. def estEntier(val):
  70. """renvoie vrai si val est convertible en entier"""
  71. retour = False
  72. try:
  73. val3 = float(val)
  74. val2 = int(val3)
  75. retour = (val2 == val3)
  76. except:
  77. pass
  78. return retour
  79. def estJetValide(expr):
  80. """renvoie vrai si la syntaxe est bien celle d'un lancer de des"""
  81. valide = True
  82. if len(expr) > 0:
  83. for car in expr:
  84. valide = (estEntier(car) or (car in ["d","D","+","-"]))
  85. else:
  86. valide = False
  87. return valide
  88. if __name__ == "__main__":
  89. # si lancement direct:
  90. while True:
  91. ## lancer = jet(raw_input(" > "))
  92. ## print("{} ({})".format(lancer[0], lancer[1]))
  93. print estJetValide(raw_input(" > "))