fork download
  1. # polymorphism in action
  2. import random
  3. from typing import Callable, Literal
  4.  
  5. type RollDieFn = Callable[[], int]
  6. type RollCheck = Literal["success", "failure"]
  7. success, failure = "success", "failure"
  8.  
  9. def roll_and_check(
  10. roll_die: RollDieFn,
  11. *modifiers: RollDieFn,
  12. difficulty: int
  13. ) -> RollCheck:
  14. roll = roll_die()
  15. print(f"main roll: {roll}")
  16.  
  17. for roll_modifier_die in modifiers:
  18. roll_ = roll_modifier_die()
  19. roll += roll_
  20. print(f"modifier roll: {roll_}, total: {roll}")
  21.  
  22. if roll >= difficulty:
  23. return success
  24.  
  25. return failure
  26.  
  27.  
  28. def create_die(sides: int) -> RollDieFn:
  29. def roll() -> int:
  30. return random.randint(1, sides)
  31. return roll
  32.  
  33. roll_d20 = create_die(sides=20)
  34. roll_d4 = create_die(sides=4)
  35.  
  36.  
  37. for dif in range(5, 21, 4):
  38. print(f"difficulty: {dif}")
  39. print(roll_and_check(
  40. roll_d20,
  41. roll_d4,
  42. lambda: 6, # flat modifier
  43. difficulty=dif
  44. ))
  45. print()
Success #stdin #stdout 0.14s 17404KB
stdin
Standard input is empty
stdout
difficulty: 5
main roll: 13
modifier roll: 4, total: 17
modifier roll: 6, total: 23
success

difficulty: 9
main roll: 6
modifier roll: 4, total: 10
modifier roll: 6, total: 16
success

difficulty: 13
main roll: 1
modifier roll: 4, total: 5
modifier roll: 6, total: 11
failure

difficulty: 17
main roll: 2
modifier roll: 1, total: 3
modifier roll: 6, total: 9
failure