Advertisement
vidzor

zombies attack

Nov 22nd, 2021
1,029
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.57 KB | None | 0 0
  1. """
  2.     Example usages:
  3.  
  4. $ python zombies_attack.py --num-zombies 5
  5. Setup:  - attack_die: 20, dmg_die: 6, armor: 15, num_zombies: 5 -
  6. ==================================================
  7. Zombie to hit: 13 - x
  8. Zombie to hit: 5 - x
  9. Zombie to hit: 13 - x
  10. Zombie to hit: 6 - x
  11. Zombie to hit: 16 - damage done: 9
  12. All damage done: 9
  13.  
  14. $ python zombies_attack.py --num-zombies 5 --dmg-die 8
  15. Setup:  - attack_die: 20, dmg_die: 8, armor: 15, num_zombies: 5 -
  16. ==================================================
  17. Zombie to hit: 14 - x
  18. Zombie to hit: 19 - damage done: 12
  19. Zombie to hit: 14 - x
  20. Zombie to hit: 12 - x
  21. Zombie to hit: 12 - x
  22. All damage done: 12
  23.  
  24. $ python zombies_attack.py --armor 16
  25. Setup:  - attack_die: 20, dmg_die: 6, armor: 16, num_zombies: 25 -
  26. ==================================================
  27. Zombie to hit: 6 - x
  28. Zombie to hit: 19 - damage done: 6
  29. Zombie to hit: 19 - damage done: 11
  30. Zombie to hit: 13 - x
  31. Zombie to hit: 5 - x
  32. Zombie to hit: 20 - damage done: 10
  33. Zombie to hit: 10 - x
  34. Zombie to hit: 13 - x
  35. Zombie to hit: 8 - x
  36. Zombie to hit: 20 - damage done: 9
  37. Zombie to hit: 17 - damage done: 9
  38. Zombie to hit: 5 - x
  39. Zombie to hit: 23 - damage done: 9
  40. Zombie to hit: 6 - x
  41. Zombie to hit: 14 - x
  42. Zombie to hit: 21 - damage done: 7
  43. Zombie to hit: 16 - x
  44. Zombie to hit: 20 - damage done: 9
  45. Zombie to hit: 23 - damage done: 11
  46. Zombie to hit: 12 - x
  47. Zombie to hit: 14 - x
  48. Zombie to hit: 7 - x
  49. Zombie to hit: 13 - x
  50. Zombie to hit: 16 - x
  51. Zombie to hit: 19 - damage done: 10
  52. All damage done: 91
  53.  
  54. $ python zombies_attack.py --num-zombies 3 --advantage
  55. Setup:  - attack_die: 20, dmg_die: 6, armor: 15, num_zombies: 3 - advantage
  56. ==================================================
  57. Zombie to hit 9 - x
  58. Zombie to hit 23 - damage done: 8
  59. Zombie to hit 19 - damage done: 6
  60. All damage done: 14
  61.  
  62. $ python zombies_attack.py --num-zombies 3 --disadvantage
  63. Setup:  - attack_die: 20, dmg_die: 6, armor: 15, num_zombies: 3 -  disadvantage
  64. ==================================================
  65. Zombie to hit 8 - x
  66. Zombie to hit 5 - x
  67. Zombie to hit 6 - x
  68. All damage done: 0
  69.  
  70. $ python zombies_attack.py --num-zombies 3 --disadvantage --advantage
  71. Setup:  - attack_die: 20, dmg_die: 6, armor: 15, num_zombies: 3 - advantage disadvantage
  72. ==================================================
  73. All damage done: 0
  74.  
  75. """
  76. import random
  77. import argparse
  78. from collections import OrderedDict
  79.  
  80.  
  81. def parse_arguments() -> OrderedDict:
  82.     parser = argparse.ArgumentParser()
  83.  
  84.     def number_parser(raw_input: str) -> int:
  85.         return int(raw_input)
  86.  
  87.     parser.add_argument(
  88.         '--attack-die', type=number_parser, help="Enter attack die value", default=20
  89.     )
  90.     parser.add_argument(
  91.         '--dmg-die', type=number_parser, help="Enter damage die value", default=6
  92.     )
  93.     parser.add_argument(
  94.         '--armor', type=number_parser, help="Enter armor value", default=15
  95.     )
  96.     parser.add_argument(
  97.         '--num-zombies', type=number_parser, help="Enter number of zombies", default=25
  98.     )
  99.     parser.add_argument(
  100.         '--advantage', help="With advantage", action='store_true'
  101.     )
  102.     parser.add_argument(
  103.         '--disadvantage', help="With disadvantage", action='store_true'
  104.     )
  105.     args = OrderedDict(dict(vars(parser.parse_args())))
  106.     return args
  107.  
  108.  
  109. class Die:
  110.     def __init__(self,
  111.                  attack_die: int, dmg_die: int, armor: int,
  112.                  num_zombies: int, advantage: bool, disadvantage: bool
  113.                  ):
  114.         self.attack_die: int = attack_die
  115.         self.dmg_die: int = dmg_die
  116.         self.armor: int = armor
  117.         self.zombie_num: int = num_zombies
  118.         self.advantage: bool = advantage
  119.         self.disadvantage: bool = disadvantage
  120.  
  121.     def __str__(self) -> str:
  122.         adv_status = "{} {}".format(
  123.             "advantage" if self.advantage else "",
  124.             "disadvantage" if self.disadvantage else ""
  125.         )
  126.         rendered_obj = " - attack_die: {}, dmg_die: {}, armor: {}, num_zombies: {} - {} ".format(
  127.             self.attack_die, self.dmg_die, self.armor, self.zombie_num, adv_status
  128.         )
  129.         return rendered_obj
  130.  
  131.     def roll_die(self) -> None:
  132.         sum_dmg_done = 0
  133.         for _ in range(self.zombie_num):
  134.  
  135.             if not self.advantage and not self.disadvantage:
  136.                 dice = random.randint(1, self.attack_die) + 3
  137.                 if dice > self.armor:
  138.                     dice2 = random.randint(1, self.dmg_die)
  139.                     dmg_done = dice2 + 5
  140.                     sum_dmg_done += dmg_done
  141.                     print(f" Zombie to hit: {dice} - damage done: {dmg_done} ")
  142.                 else:
  143.                     print(f" Zombie to hit: {dice} - x ")
  144.  
  145.             elif self.advantage and not self.disadvantage:
  146.                 dice_advantages = [random.randint(1, self.attack_die) for _ in range(2)]
  147.                 dice_adv_max = max(dice_advantages) + 3
  148.                 if dice_adv_max > self.armor:
  149.                     dice2 = random.randint(1, self.dmg_die)
  150.                     dmg_done = dice2 + 5
  151.                     sum_dmg_done += dmg_done
  152.                     print(f" Zombie to hit {dice_adv_max} - damage done: {dmg_done} ")
  153.                 else:
  154.                     print(f" Zombie to hit {dice_adv_max} - x ")
  155.  
  156.             elif not self.advantage and self.disadvantage:
  157.                 dice_advantages = [random.randint(1, self.attack_die) for _ in range(2)]
  158.                 dice_dis_min = min(dice_advantages) + 3
  159.                 if dice_dis_min > self.armor:
  160.                     dice2 = random.randint(1, self.dmg_die)
  161.                     dmg_done = dice2 + 5
  162.                     sum_dmg_done += dmg_done
  163.                     print(f" Zombie to hit {dice_dis_min} - damage done: {dmg_done} ")
  164.                 else:
  165.                     print(f" Zombie to hit {dice_dis_min} - x ")
  166.  
  167.             else:
  168.                 # TODO: handle this case as well
  169.                 continue
  170.  
  171.         print(f" All damage done: {sum_dmg_done} ")
  172.  
  173.  
  174. def main(args: OrderedDict):
  175.     dice_roll = Die(**args)
  176.     print(f" Setup: {dice_roll} ")
  177.     print("="*50)
  178.     dice_roll.roll_die()
  179.  
  180.  
  181. if __name__=="__main__":
  182.     main(args=parse_arguments())
  183.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement