d_skat

sem4_2

Apr 23rd, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.92 KB | None | 0 0
  1. import json
  2.  
  3. Entities_max_health = {
  4.     "Sorceress": 50,
  5.     "Knight": 100,
  6.     "Barbarian": 120,
  7.     "Warlock": 70
  8. }
  9. Entities_max_attack = {
  10.     "Sorceress": 90,
  11.     "Knight": 150,
  12.     "Barbarian": 180,
  13.     "Warlock": 100
  14. }
  15. Entities_defence = {
  16.     "Sorceress": 42,
  17.     "Knight": 170,
  18.     "Barbarian": 150,
  19.     "Warlock": 50
  20. }
  21. Entities_mana = {
  22.     "Sorceress": 200,
  23.     "Knight": 0,
  24.     "Barbarian": 0,
  25.     "Warlock": 180
  26. }
  27.  
  28.  
  29. my_heroes = {}
  30.  
  31.  
  32. class Unit:
  33.     def __init__(self, info):
  34.         self.race = info["race"]
  35.         self.lord = info["lord"]
  36.         self.health = min(info["health"], Entities_max_health[self.race])
  37.         self.attack = min(info["attack"], Entities_max_attack[self.race])
  38.         self.defence = min(info["defence"], Entities_defence[self.race])
  39.         self.experience = info["experience"]
  40.         self.mana = 0
  41.         if("mana" in info):
  42.             self.mana = min(info["mana"], Entities_mana[self.race])
  43.  
  44.  
  45. def attack(attacker, defencer, power):
  46.     if(attacker.health <= 0 or defencer.health <= 0):
  47.         return
  48.     else:
  49.         attacker.attack = max(0, attacker.attack - power)
  50.         if defencer.defence >= power:
  51.             defencer.defence -= power
  52.         else:
  53.             defencer.health -= (power - defencer.defence)
  54.             defencer.defence = 0
  55.         if (defencer.health <= 0):
  56.             attacker.experience += 5
  57.             return
  58.         else:
  59.             attacker.experience += 1
  60.             defencer.experience += 1
  61.             return
  62.  
  63.  
  64. def cast(attacker, defencer, power):
  65.     if(attacker.health <= 0 or defencer.health <= 0):
  66.         return
  67.     else:
  68.         if(attacker.mana < power):
  69.             return
  70.         attacker.mana -= power
  71.         if defencer.defence >= power:
  72.             defencer.defence -= power
  73.         else:
  74.             defencer.health -= (power - defencer.defence)
  75.             defencer.defence = 0
  76.         if (defencer.health <= 0):
  77.             attacker.experience += 5
  78.             return
  79.         else:
  80.             attacker.experience += 1
  81.             defencer.experience += 1
  82.             return
  83.  
  84.  
  85. def heal(attacker, defencer, power):
  86.     if(attacker.health <= 0 or defencer.health <= 0):
  87.         return
  88.     else:
  89.         if (attacker.mana < power):
  90.             return
  91.         attacker.mana -= power
  92.         new_health = defencer.health + power
  93.         defencer.health = min(new_health,
  94.                               Entities_max_health[defencer.race])
  95.         return
  96.  
  97.  
  98. def trace_step(step):
  99.     if step['action'] == 'attack':
  100.         attack(my_heroes[step['id_from']],
  101.                my_heroes[step['id_to']], step['power'])
  102.     if step['action'] == 'cast_damage_spell':
  103.         cast(my_heroes[step['id_from']],
  104.              my_heroes[step['id_to']], step['power'])
  105.     if step['action'] == 'cast_health_spell':
  106.         heal(my_heroes[step['id_from']],
  107.              my_heroes[step['id_to']], step['power'])
  108.  
  109.  
  110. def count_win(heroes):
  111.     res = {}
  112.     counts = {}
  113.     counts['Archibald'] = 0
  114.     counts['Ronald'] = 0
  115.     res['Archibald'] = 0
  116.     res['Ronald'] = 0
  117.     for id in heroes:
  118.         hero = heroes[id]
  119.         if(hero.health > 0):
  120.             count = hero.experience +\
  121.                   2 * hero.defence + 3 * hero.attack + 10 * hero.mana
  122.             res[hero.lord] += count
  123.             counts[hero.lord] += 1
  124.     if counts['Archibald'] == counts['Ronald'] == 0:
  125.         return 'unknown'
  126.     elif counts['Archibald'] == 0:
  127.         return 'Ronald'
  128.     elif counts['Ronald'] == 0:
  129.         return 'Archibald'
  130.  
  131.     if(res['Ronald'] > res['Archibald']):
  132.         return 'Ronald'
  133.     if(res['Archibald'] > res['Ronald']):
  134.         return 'Archibald'
  135.     if(res['Archibald'] == res['Ronald']):
  136.         return 'unknown'
  137.  
  138. data = json.loads(input())
  139. for a in data["armies"]:
  140.     my_heroes[a] = Unit(data["armies"][a])
  141. for b in data['battle_steps']:
  142.     trace_step(b)
  143.  
  144. print(count_win(my_heroes))
Add Comment
Please, Sign In to add comment