G2A Many GEOs
SHARE
TWEET

Abstract Pokemon Simulator.

luckytyphlosion May 20th, 2019 73 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import collections
  2. import copy
  3. import string
  4. import random
  5.  
  6. # switch by inputting in the mon to switch to
  7. # use moves by inputting 1, 2, 3, 4 for each move respectively
  8.  
  9. """
  10. team A:
  11. A: hp=140, speed=2
  12. B: hp=120, speed=10
  13. team B:
  14. a: hp=180, speed=1
  15. b: hp=260, speed=5
  16.  
  17. Aa - 100
  18. Ab - 100
  19. Ba - 80
  20. Bb - 60
  21. aA - 100
  22. aB - 80
  23. bA - 50, 90
  24. bB - 60, 50
  25. """
  26.  
  27. TEAM_1_SIZE = 3
  28. TEAM_2_SIZE = 3
  29.  
  30. MAX_SPEED = 10
  31.  
  32. class Team:
  33.     __slots__ = ("mons", "cur_member")
  34.     def __init__(self, mons, cur_member):
  35.         self.mons = mons
  36.         self.cur_member = cur_member
  37.  
  38.     @property
  39.     def cur_mon(self):
  40.         return self.mons[self.cur_member]
  41.  
  42. class Member:
  43.     __slots__ = ("hp", "speed")
  44.     def __init__(self, hp, speed):
  45.         self.hp = hp
  46.         self.speed = speed
  47.  
  48. """
  49. team_a_mons_original = collections.OrderedDict({
  50.    "A": Member(hp=140, speed=2),
  51.    "B": Member(hp=120, speed=10),
  52. })
  53.  
  54. team_b_mons_original = collections.OrderedDict({
  55.    "a": Member(hp=180, speed=1),
  56.    "b": Member(hp=260, speed=5),
  57. })
  58. """
  59.  
  60. # Aa: [60, 10, 100]
  61. # Ab: [60, 100, 50]
  62. # Ba: [70, 30]
  63. # Bb: [70, 90]
  64. # aA: [60, 90, 90, 100]
  65. # aB: [20, 60, 70, 90]
  66. # bA: [50, 30, 20, 70]
  67. # bB: [80, 10, 80, 50]
  68.  
  69. def generate_random_teams():
  70.     team_1_mons = collections.OrderedDict()
  71.     team_2_mons = collections.OrderedDict()
  72.     damages = {}
  73.  
  74.     for team_1_member in string.ascii_uppercase[:TEAM_1_SIZE]:
  75.         for team_2_member in string.ascii_lowercase[:TEAM_2_SIZE]:
  76.             damages[team_1_member + team_2_member] = []
  77.             damages[team_2_member + team_1_member] = []
  78.             for move_index in range(4):
  79.                 damages[team_1_member + team_2_member].append(random.randint(1, 10) * 10)
  80.                 damages[team_2_member + team_1_member].append(random.randint(1, 10) * 10)
  81.  
  82.     team_1_speeds = []
  83.     team_2_speeds = []
  84.     speeds = set(i for i in range(MAX_SPEED + 1))
  85.  
  86.     if random.randint(1, 2) == 1:
  87.         first_team_speeds = team_1_speeds
  88.         second_team_speeds = team_2_speeds
  89.         first_team_len = TEAM_1_SIZE
  90.         second_team_len = TEAM_2_SIZE
  91.     else:
  92.         first_team_speeds = team_2_speeds
  93.         second_team_speeds = team_1_speeds
  94.         first_team_len = TEAM_2_SIZE
  95.         second_team_len = TEAM_1_SIZE
  96.  
  97.     for i in range(first_team_len):
  98.         speed = random.randint(1, MAX_SPEED)
  99.         speeds.discard(speed)
  100.         first_team_speeds.append(speed)
  101.  
  102.     speeds = tuple(speeds)
  103.  
  104.     for i in range(second_team_len):
  105.         speed = random.choice(speeds)
  106.         second_team_speeds.append(speed)
  107.  
  108.     for team_1_member in string.ascii_uppercase[:TEAM_1_SIZE]:
  109.         team_1_speed = team_1_speeds.pop(0)
  110.         team_1_mons[team_1_member] = Member(hp=random.randint(10, 30) * 10, speed=team_1_speed)
  111.  
  112.     for team_2_member in string.ascii_lowercase[:TEAM_2_SIZE]:
  113.         team_2_speed = team_2_speeds.pop(0)
  114.         team_2_mons[team_2_member] = Member(hp=random.randint(10, 30) * 10, speed=team_2_speed)
  115.  
  116.     return Team(team_1_mons, "A"), Team(team_2_mons, "a"), damages
  117.  
  118. def print_damages(damages):
  119.     output = ""
  120.     for matchup, damage_values in damages.items():
  121.         output += "%s: %s\n" % (matchup, damage_values)
  122.  
  123.     print(output)
  124.  
  125. def print_team(team):
  126.     output = "cur member: %s\n" % team.cur_member
  127.     for team_member in team.mons:
  128.         output += "%s: hp=%s, speed=%s\n" % (team_member, team.mons[team_member].hp, team.mons[team_member].speed)
  129.  
  130.     print(output)
  131.  
  132. def print_teams_info(team_1, team_2, damages):
  133.     print_damages(damages)
  134.     print("Team 1:")
  135.     print_team(team_1)
  136.     print("Team 2:")
  137.     print_team(team_2)
  138.  
  139. def can_switch(team, member):
  140.     if not member in team.mons:
  141.         return False
  142.     if member == team.cur_member:
  143.         return False
  144.     if team.mons[member].hp <= 0:
  145.         return False
  146.     return True
  147.  
  148. def decide_opponent_action(team_1, team_2, damages):
  149.     # greedy
  150.     damage_list = damages[team_2.cur_member + team_1.cur_member]
  151.     return "%s" % (damage_list.index(max(damage_list)) + 1)
  152.  
  153. def decide_player_action(team_1):
  154.     move_actions = set(("1", "2", "3", "4"))
  155.     while True:
  156.         action = input("Choose move or switch: ")
  157.         if action in team_1.mons and can_switch(team_1, action):
  158.             return action
  159.         elif action in move_actions:
  160.             return action
  161.         else:
  162.             print("Invalid action!")
  163.  
  164. def get_opponent_switch_in(team_1, team_2, damages):
  165.     max_damage = 0
  166.     max_damage_team_member = None
  167.  
  168.     for team_member in team_2.mons:
  169.         this_max_damage = max(damages[team_member + team_1.cur_member])
  170.         if this_max_damage > max_damage:
  171.             max_damage = this_max_damage
  172.             max_damage_team_member = team_member
  173.  
  174.     return team_member
  175.  
  176. def get_player_switch_in(team_1):
  177.     while True:
  178.         action = input("Choose switch: ")
  179.         if action in team_1.mons and can_switch(team_1, action):
  180.             return action
  181.         else:
  182.             print("Invalid switch!")
  183.  
  184. def remove_cur_mon(team, damages):
  185.     del team.mons[team.cur_member]
  186.     new_damages = dict(damages)
  187.     for matchup, damage_value in damages.items():
  188.         if team.cur_member in matchup:
  189.             del new_damages[matchup]
  190.     return new_damages
  191.  
  192. def do_battle_until_ko():
  193.     team_1_original, team_2_original, damages_original = generate_random_teams()
  194.  
  195.     while True:
  196.         damages = dict(damages_original)
  197.         team_1 = copy.deepcopy(team_1_original)
  198.         team_2 = copy.deepcopy(team_2_original)
  199.  
  200.         while True:
  201.             print_teams_info(team_1, team_2, damages)
  202.             opponent_action = decide_opponent_action(team_1, team_2, damages)
  203.             player_action = decide_player_action(team_1)
  204.             player_switched = False
  205.             opponent_switched = False
  206.            
  207.             if player_action in team_1.mons:
  208.                 team_1.cur_member = player_action
  209.                 player_switched = True
  210.             if opponent_action in team_2.mons:
  211.                 team_2.cur_member = opponent_action
  212.                 opponent_switched = True
  213.    
  214.             if not player_switched:
  215.                 team_1_damage = damages[team_1.cur_member + team_2.cur_member][int(player_action) - 1]
  216.             if not opponent_switched:
  217.                 team_2_damage = damages[team_2.cur_member + team_1.cur_member][int(opponent_action) - 1]
  218.    
  219.             if not player_switched and not opponent_switched:
  220.                 if team_1.cur_mon.speed > team_2.cur_mon.speed:
  221.                     team_2.cur_mon.hp -= team_1_damage
  222.                     if team_2.cur_mon.hp > 0:
  223.                         team_1.cur_mon.hp -= team_2_damage
  224.                 else:
  225.                     team_1.cur_mon.hp -= team_2_damage
  226.                     if team_1.cur_mon.hp > 0:
  227.                         team_2.cur_mon.hp -= team_1_damage
  228.             else:
  229.                 if not player_switched:
  230.                     team_2.cur_mon.hp -= team_1_damage
  231.                 if not opponent_switched:
  232.                     team_1.cur_mon.hp -= team_2_damage
  233.    
  234.             if team_1.cur_mon.hp <= 0:
  235.                 damages = remove_cur_mon(team_1, damages)
  236.                 if len(team_1.mons) == 0:
  237.                     break
  238.                 print_teams_info(team_1, team_2, damages)
  239.                 team_1.cur_member = get_player_switch_in(team_1)
  240.             elif team_2.cur_mon.hp <= 0:
  241.                 damages = remove_cur_mon(team_2, damages)
  242.                 if len(team_2.mons) == 0:
  243.                     break
  244.                 team_2.cur_member = get_opponent_switch_in(team_1, team_2, damages)
  245.    
  246.         print_teams_info(team_1, team_2, damages)
  247.         continue_answer = input("Continue? ")
  248.         if continue_answer != "yes" and continue_answer != "y":
  249.             break
  250.  
  251. do_battle_until_ko()
RAW Paste Data
Ledger Nano X - The secure hardware wallet
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top