Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- """
- Example usages:
- $ python zombies_attack.py --num-zombies 5
- Setup: - attack_die: 20, dmg_die: 6, armor: 15, num_zombies: 5 -
- ==================================================
- Zombie to hit: 13 - x
- Zombie to hit: 5 - x
- Zombie to hit: 13 - x
- Zombie to hit: 6 - x
- Zombie to hit: 16 - damage done: 9
- All damage done: 9
- $ python zombies_attack.py --num-zombies 5 --dmg-die 8
- Setup: - attack_die: 20, dmg_die: 8, armor: 15, num_zombies: 5 -
- ==================================================
- Zombie to hit: 14 - x
- Zombie to hit: 19 - damage done: 12
- Zombie to hit: 14 - x
- Zombie to hit: 12 - x
- Zombie to hit: 12 - x
- All damage done: 12
- $ python zombies_attack.py --armor 16
- Setup: - attack_die: 20, dmg_die: 6, armor: 16, num_zombies: 25 -
- ==================================================
- Zombie to hit: 6 - x
- Zombie to hit: 19 - damage done: 6
- Zombie to hit: 19 - damage done: 11
- Zombie to hit: 13 - x
- Zombie to hit: 5 - x
- Zombie to hit: 20 - damage done: 10
- Zombie to hit: 10 - x
- Zombie to hit: 13 - x
- Zombie to hit: 8 - x
- Zombie to hit: 20 - damage done: 9
- Zombie to hit: 17 - damage done: 9
- Zombie to hit: 5 - x
- Zombie to hit: 23 - damage done: 9
- Zombie to hit: 6 - x
- Zombie to hit: 14 - x
- Zombie to hit: 21 - damage done: 7
- Zombie to hit: 16 - x
- Zombie to hit: 20 - damage done: 9
- Zombie to hit: 23 - damage done: 11
- Zombie to hit: 12 - x
- Zombie to hit: 14 - x
- Zombie to hit: 7 - x
- Zombie to hit: 13 - x
- Zombie to hit: 16 - x
- Zombie to hit: 19 - damage done: 10
- All damage done: 91
- $ python zombies_attack.py --num-zombies 3 --advantage
- Setup: - attack_die: 20, dmg_die: 6, armor: 15, num_zombies: 3 - advantage
- ==================================================
- Zombie to hit 9 - x
- Zombie to hit 23 - damage done: 8
- Zombie to hit 19 - damage done: 6
- All damage done: 14
- $ python zombies_attack.py --num-zombies 3 --disadvantage
- Setup: - attack_die: 20, dmg_die: 6, armor: 15, num_zombies: 3 - disadvantage
- ==================================================
- Zombie to hit 8 - x
- Zombie to hit 5 - x
- Zombie to hit 6 - x
- All damage done: 0
- $ python zombies_attack.py --num-zombies 3 --disadvantage --advantage
- Setup: - attack_die: 20, dmg_die: 6, armor: 15, num_zombies: 3 - advantage disadvantage
- ==================================================
- All damage done: 0
- """
- import random
- import argparse
- from collections import OrderedDict
- def parse_arguments() -> OrderedDict:
- parser = argparse.ArgumentParser()
- def number_parser(raw_input: str) -> int:
- return int(raw_input)
- parser.add_argument(
- '--attack-die', type=number_parser, help="Enter attack die value", default=20
- )
- parser.add_argument(
- '--dmg-die', type=number_parser, help="Enter damage die value", default=6
- )
- parser.add_argument(
- '--armor', type=number_parser, help="Enter armor value", default=15
- )
- parser.add_argument(
- '--num-zombies', type=number_parser, help="Enter number of zombies", default=25
- )
- parser.add_argument(
- '--advantage', help="With advantage", action='store_true'
- )
- parser.add_argument(
- '--disadvantage', help="With disadvantage", action='store_true'
- )
- args = OrderedDict(dict(vars(parser.parse_args())))
- return args
- class Die:
- def __init__(self,
- attack_die: int, dmg_die: int, armor: int,
- num_zombies: int, advantage: bool, disadvantage: bool
- ):
- self.attack_die: int = attack_die
- self.dmg_die: int = dmg_die
- self.armor: int = armor
- self.zombie_num: int = num_zombies
- self.advantage: bool = advantage
- self.disadvantage: bool = disadvantage
- def __str__(self) -> str:
- adv_status = "{} {}".format(
- "advantage" if self.advantage else "",
- "disadvantage" if self.disadvantage else ""
- )
- rendered_obj = " - attack_die: {}, dmg_die: {}, armor: {}, num_zombies: {} - {} ".format(
- self.attack_die, self.dmg_die, self.armor, self.zombie_num, adv_status
- )
- return rendered_obj
- def roll_die(self) -> None:
- sum_dmg_done = 0
- for _ in range(self.zombie_num):
- if not self.advantage and not self.disadvantage:
- dice = random.randint(1, self.attack_die) + 3
- if dice > self.armor:
- dice2 = random.randint(1, self.dmg_die)
- dmg_done = dice2 + 5
- sum_dmg_done += dmg_done
- print(f" Zombie to hit: {dice} - damage done: {dmg_done} ")
- else:
- print(f" Zombie to hit: {dice} - x ")
- elif self.advantage and not self.disadvantage:
- dice_advantages = [random.randint(1, self.attack_die) for _ in range(2)]
- dice_adv_max = max(dice_advantages) + 3
- if dice_adv_max > self.armor:
- dice2 = random.randint(1, self.dmg_die)
- dmg_done = dice2 + 5
- sum_dmg_done += dmg_done
- print(f" Zombie to hit {dice_adv_max} - damage done: {dmg_done} ")
- else:
- print(f" Zombie to hit {dice_adv_max} - x ")
- elif not self.advantage and self.disadvantage:
- dice_advantages = [random.randint(1, self.attack_die) for _ in range(2)]
- dice_dis_min = min(dice_advantages) + 3
- if dice_dis_min > self.armor:
- dice2 = random.randint(1, self.dmg_die)
- dmg_done = dice2 + 5
- sum_dmg_done += dmg_done
- print(f" Zombie to hit {dice_dis_min} - damage done: {dmg_done} ")
- else:
- print(f" Zombie to hit {dice_dis_min} - x ")
- else:
- # TODO: handle this case as well
- continue
- print(f" All damage done: {sum_dmg_done} ")
- def main(args: OrderedDict):
- dice_roll = Die(**args)
- print(f" Setup: {dice_roll} ")
- print("="*50)
- dice_roll.roll_die()
- if __name__=="__main__":
- main(args=parse_arguments())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement