Advertisement
Guest User

Montecarlo Fate 2

a guest
Feb 11th, 2015
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.21 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. # casilZas = [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.     return dano
  43.  
  44.  
  45. def aplicaDano(dano, casillas_pj):
  46.     """
  47.    Aplica el daño a un contador de casillas
  48.  
  49.    @param dano: Cantidad de daño
  50.    @param casillas_pj: Lista con las casillas a tachar ordenadas por prioridad
  51.    """
  52.     casillas_posibles = []
  53.     for casilla in casillas_pj:
  54.         if dano > 0:
  55.             dano -= casilla
  56.             casillas_posibles.append(casilla)
  57.         else:
  58.             break
  59.     if dano > 0:
  60.         # Muerto
  61.         return []
  62.     if dano < 0:
  63.         # Hemos marcado demasiadas, ver si podemos librar una,
  64.         # empezando por la más importante
  65.         for casilla in reversed(casillas_posibles):
  66.             if casilla <= abs(dano):
  67.                 casillas_posibles.remove(casilla)
  68.                 dano += casilla
  69.     # Eliminar las casillas
  70.     for casilla in casillas_posibles:
  71.         casillas_pj.remove(casilla)
  72.     return casillas_pj
  73.  
  74.  
  75. def combate():
  76.     """
  77.    Resuelve un combate
  78.    """
  79.     rondas = 0
  80.     casillas_1 = list(casillas)
  81.     casillas_2 = list(casillas)
  82.     boost_1 = 0
  83.     boost_2 = 0
  84.     while casillas_1 and casillas_2:
  85.         rondas += 1
  86.         ataque_1 = ataque(combatiente_1, combatiente_2) + boost_1
  87.         boost_1 = 0
  88.         if ataque_1 > 0:
  89.             aplicaDano(ataque_1, casillas_2)
  90.         elif ataque_1 == 0:
  91.             boost_1 = 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 > 0:
  97.             aplicaDano(ataque_2, casillas_1)
  98.         elif ataque_2 == 0:
  99.             boost_2 = 0
  100.         elif ataque_2 < -2:
  101.             boost_1 = 2
  102.     if casillas_1:
  103.         return 1, rondas
  104.     else:
  105.         return 2, rondas
  106.  
  107.  
  108. if __name__ == "__main__":
  109.     numero_combates = 0.0
  110.     ganados = {1: 0, 2: 0}
  111.     duracion_total = 0
  112.     for indice in range(0, NUM_COMBATES):
  113.         print("Combate %s" % indice)
  114.         numero_combates += 1
  115.         ganador, ronda = combate()
  116.         ganados[ganador] += 1
  117.         duracion_total += ronda
  118.     print("Realizados %d combates" % NUM_COMBATES)
  119.     print("Luchador 1 ha ganado: %d, el %.5f" % (ganados[1],
  120.           ganados[1] / numero_combates))
  121.     print("Luchador 2 ha ganado: %d, el %.5f" % (ganados[2],
  122.           ganados[2] / numero_combates))
  123.     print("Duracion media: %.2f" % (duracion_total / numero_combates))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement