Guest User

Montecarlo Fate

a guest
Feb 11th, 2015
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.13 KB | None | 0 0
  1. # coding=utf-8
  2. """
  3. Programa para probar cosas en Fate
  4. """
  5.  
  6. import random
  7.  
  8. NUM_DADOS = 4
  9.  
  10. NUM_COMBATES = 100000
  11.  
  12. combatiente_1 = {'Ataque': 6,
  13.                  'Defensa': 2}
  14.  
  15. combatiente_2 = {'Ataque': 3,
  16.                  'Defensa': 4}
  17.  
  18. # casillas = [1, 2, 3, 2, 4, 6]
  19. casillas = [2, 4, 6]
  20.  
  21.  
  22. def tirada():
  23.     """
  24.    Devuelve el resultado de una tirada de fate
  25.    """
  26.     resultado = 0
  27.     for i in range(0, NUM_DADOS):
  28.         resultado += random.randrange(-1, 1)
  29.     return resultado
  30.  
  31.  
  32. def ataque(atacante, defensor):
  33.     """
  34.    Devuelve el daño de un ataque
  35.  
  36.    @param atacante: Diccionario personaje atacante
  37.    @param defensor: Diccionar personade defensor
  38.    """
  39.     tirada_ataque = atacante['Ataque'] + tirada()
  40.     tirada_defensa = defensor['Defensa'] + tirada()
  41.     dano = tirada_ataque - tirada_defensa
  42.     if dano < 0:
  43.         dano = 0
  44.     return dano
  45.  
  46.  
  47. def aplicaDano(dano, casillas_pj):
  48.     """
  49.    Aplica el daño a un contador de casillas
  50.  
  51.    @param dano: Cantidad de daño
  52.    @param casillas_pj: Lista con las casillas a tachar ordenadas por prioridad
  53.    """
  54.     casillas_posibles = []
  55.     for casilla in casillas_pj:
  56.         if dano > 0:
  57.             dano -= casilla
  58.             casillas_posibles.append(casilla)
  59.         else:
  60.             break
  61.     if dano > 0:
  62.         # Muerto
  63.         return []
  64.     if dano < 0:
  65.         # Hemos marcado demasiadas, ver si podemos librar una,
  66.         # empezando por la más importante
  67.         for casilla in reversed(casillas_posibles):
  68.             if casilla <= abs(dano):
  69.                 casillas_posibles.remove(casilla)
  70.                 dano += casilla
  71.     # Eliminar las casillas
  72.     for casilla in casillas_posibles:
  73.         casillas_pj.remove(casilla)
  74.     return casillas_pj
  75.  
  76.  
  77. def combate():
  78.     """
  79.    Resuelve un combate
  80.    """
  81.     rondas = 0
  82.     casillas_1 = list(casillas)
  83.     casillas_2 = list(casillas)
  84.     boost_1 = 0
  85.     boost_2 = 0
  86.     while casillas_1 and casillas_2:
  87.         rondas += 1
  88.         ataque_1 = ataque(combatiente_1, combatiente_2) + boost_1
  89.         boost_1 = 0
  90.         if ataque_1:
  91.             aplicaDano(ataque_1, casillas_2)
  92.         elif ataque_1 < -2:
  93.             boost_2 = 2
  94.         ataque_2 = ataque(combatiente_2, combatiente_1) + boost_2
  95.         boost_2 = 0
  96.         if ataque_2:
  97.             aplicaDano(ataque_2, casillas_1)
  98.         elif ataque_2 < -2:
  99.             boost_1 = 2
  100.     if casillas_1:
  101.         return 1, rondas
  102.     else:
  103.         return 2, rondas
  104.  
  105.  
  106. if __name__ == "__main__":
  107.     numero_combates = 0.0
  108.     ganados = {1: 0, 2: 0}
  109.     duracion_total = 0
  110.     for indice in range(0, NUM_COMBATES):
  111.         print("Combate %s" % indice)
  112.         numero_combates += 1
  113.         ganador, ronda = combate()
  114.         ganados[ganador] += 1
  115.         duracion_total += ronda
  116.     print("Realizados %d combates" % NUM_COMBATES)
  117.     print("Luchador 1 ha ganado: %d, el %.5f" % (ganados[1],
  118.           ganados[1] / numero_combates))
  119.     print("Luchador 2 ha ganado: %d, el %.5f" % (ganados[2],
  120.           ganados[2] / numero_combates))
  121.     print("Duracion media: %.2f" % (duracion_total / numero_combates))
Advertisement
Add Comment
Please, Sign In to add comment