Advertisement
freakrho

Roll dice with Python3

Oct 27th, 2011
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.54 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. #PyDados v1.2 by freakRHO [email protected]
  4. import random
  5.  
  6. def tirar(caras):
  7.     resul = random.randint(1,caras)
  8.     return resul
  9.    
  10. def hacerTirada(cantidad,caras,explotar=False,keep=0):
  11.     d = 0
  12.     tiradas = []
  13.     while d < cantidad:
  14.         resul = tirar(caras)
  15.         tiradas.append(resul)
  16.         if explotar == True:
  17.             if resul == caras:
  18.                 cantidad = cantidad+1
  19.                 keep = keep+1
  20.         d = d + 1
  21.     return [tiradas,keep]
  22.  
  23. def ayuda():
  24.     print('\nSintaxis para tirar dados: <tirada>:<opciones>')
  25.     print('\nTiradas:')
  26.     print('\nTiradas convencionales (d)')
  27.     print('Esta tirada simplemente tira dados, muestra los resultados y la suma.')
  28.     print(' ·Para tirar X dados de Y caras: XdY (Ej: 5d6)')
  29.     print('Opciones posibles: e,r')
  30.     print('\nTiradas con keep (k)')
  31.     print('Esta tirada tira dados y se queda con los mayores.')
  32.     print(' ·Para tirar X dados de 10 caras y sumar los Z mayores (Séptimo Mar): XkZ (Ej: 5k3)')
  33.     print(' ·Para tirar X dados de Y caras y sumar los Z mayores: XkZdY (Ej: 6k3d8)')
  34.     print('Cualquier opción que se le agrege será ignorada')
  35.     print('\nTiradas estilo Starwars (D)')
  36.     print('Esta tirada es una tirada simple con un dado Wild, si el Wild es 6 se tira denuevo y se suma al total (reiterativo), si es 1 se tira denuevo, si es 1 otra vez se considera un botch, sino se lleva el dado menor')
  37.     print(' ·Para tirar X dados de Y caras con un dado Wild: XDY (Ej: 5D6)')
  38.     print('\nOpciones:')
  39.     print(' ·e - Los dados explotan')
  40.     print(' ·r - Los unos se van y se llevan a los menores (WoD)')
  41.     print('\nEjemplos:')
  42.     print(' ·Starwars: XD6')
  43.     print(' ·World of Darkness: Xd10:re')
  44.     print(' ·Séptimo mar: XkZ')
  45.     print(' ·Mutants & Masterminds: 1d20')
  46.     print('Referencias: X=<Cantidad de dados>, Y=<Cantidad de caras>, Z=<Cantidad de dados a guardar>')
  47.  
  48. def tiradan(dados,op):
  49.     try:
  50.         plus = 0
  51.         tirada = dados.split('d',2)
  52.         cantidad = int(tirada[0])
  53.         caras = int(tirada[1])
  54.         exp = False
  55.         if 'e' in op:
  56.             exp = True
  57.         [tiradas,keep] = hacerTirada(cantidad,caras,exp,cantidad)
  58.         if 'r' in op:
  59.             if tiradas[0] == 1:
  60.                 keep = keep - 2
  61.             for j in range(1,len(tiradas),1):
  62.                 if tiradas[j] == 1 and tiradas[j-1] != caras:
  63.                     keep = keep - 2
  64.         spec = ''
  65.     except ValueError:
  66.         print('\n\t>>La sintaxis fue incorrecta.')
  67.     return [tiradas,keep,spec]
  68.  
  69. def smomar(dados,op):
  70.     try:
  71.         tirada = dados.split('k',2)
  72.         cantidad = int(tirada[0])
  73.         divkeep = tirada[1]
  74.         if 'd' in divkeep:
  75.             divdkeep = divkeep.split('d',2)
  76.             keep = int(divdkeep[0])
  77.             caras = int(divdkeep[1])
  78.         else:
  79.             caras = 10
  80.             keep = int(divkeep)
  81.         [tiradas,keep] = hacerTirada(cantidad,caras,True,keep)
  82.         spec = ''
  83.     except ValueError:
  84.         print('\n\t>>La sintaxis fue incorrecta.')
  85.     return [tiradas,keep,spec]
  86.  
  87. def starwars(dados,op):
  88.     try:
  89.         tirada = dados.split('D',2)
  90.         cantidad = int(tirada[0])
  91.         caras = int(tirada[1])
  92.         [tiradas,keep1] = hacerTirada(cantidad-1,caras,False,cantidad-1)
  93.         [wild,keep2] = hacerTirada(1,caras,True,1)
  94.         if wild == [1]:
  95.             if tirar(caras) == 1:
  96.                 spec = '>>BOTCH<<'
  97.                 subs = 0
  98.             else:
  99.                 spec = ''
  100.                 subs = 2
  101.             keep = cantidad-subs
  102.         else:
  103.             keep = keep1+keep2
  104.             spec = ''
  105.         for l in wild:
  106.             tiradas.append(l)
  107.     except ValueError:
  108.         print('\n\t>>La sintaxis fue incorrecta.')
  109.     return [tiradas,keep,spec]
  110.  
  111. def mostraresul(tiradas,keep,spec):
  112.     print('\n\t>>Tiradas:')
  113.     for dado in tiradas:
  114.         print('\t\t' + str(dado), end='')
  115.     print('\n\t>>Keep:')
  116.     tiradas.sort()
  117.     ini = len(tiradas)-keep
  118.     fini = len(tiradas)
  119.     for l in tiradas[ini:fini]:
  120.         print('\t\t' + str(l), end='')
  121.     resultado = sum(tiradas[int(ini):int(fini)])
  122.     print('\n\t>>Suma:')
  123.     print('\t\t' + str(resultado) + '\n')
  124.     print('\n\t' + spec)
  125.  
  126. def main():
  127.     while True:
  128.         print('\nIngrese la tirada de dados o la opción deseada (Exit para salir, Help para revisar las sintaxis de tirada de dados)')
  129.         dados = input()
  130.         if dados.lower().startswith('e') or dados.lower().startswith('c'):
  131.             raise SystemExit
  132.         elif dados.lower().startswith('h') or dados.lower().startswith('a'):
  133.             ayuda()
  134.         elif dados == "1k1d1" or 'D1' in dados:
  135.             print('\nBuen intento.')
  136.         else:
  137.             if ':' in dados:
  138.                 dsplit = dados.split(':',2)
  139.                 dados = dsplit[0]
  140.                 op = dsplit[1]
  141.             else:
  142.                 op = ''
  143.             if 'k' in dados:
  144.                 [tiradas,keep,spec] = smomar(dados,op)
  145.             elif 'd' in dados:
  146.                 [tiradas,keep,spec] = tiradan(dados,op)
  147.             elif 'D' in dados:
  148.                 [tiradas,keep,spec] = starwars(dados,op)
  149.            
  150.             #Mostrar resultados
  151.             mostraresul(tiradas,keep,spec)
  152.            
  153. if __name__ == '__main__':
  154.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement