# dice roller

Jun 14th, 2024 (edited)
337
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
1. from numpy import random
2. import sys
3.
4. ### This program simulates rolling dice by generating random numbers based upon user input.
5. ### It "rolls" 1-10 dice of 2-100 sides.
6. ### It can be run with no arguments, one argument or two arguments.
7. ### With no arguments, it rolls one twenty-sided die.
8. ### With one argument {input1}, it rolls {input1} twenty-sided dice, unless {input1} starts with the letter "d", in which case it rolls one {input1}-sided die.
9. ### With two arguments {input1} & {input2}, it rolls {input1} {input2}-sided dice.
10. ### If either input is "infinity" or same variant, the program instead returns a humorous result indicating some sort of space-time disturbance, as long as the arguments are otherwise in rage (e.g. the user can't roll 20 inf-sided dice).
11. ### Additional special rsesponses can be added, such as if a user tries to roll a one-sided die, i.e. "There's no such thing as a one-sided die, silly."
12.
13.
14. ### TODO: Replace lengthy "if / elif"s with switch cases ###
15.
16.
17.
18.
19. # List of phrases to return if an infinite-sided die is rolled
20. infresults = ["a black hole. Hey, I think CERN is calling.", "turned into a pony. Yay?", "teleported to the Gamma Quadrant. See you in 7 years!"]
21.
22.
23.
24.
25. ### Beginnging of main program ###
26.
27. # Set defaults within the program itself
28. def dice(amount = 1, sides = 20):
29.
30.     # always print this line first
31.     def initialprint():
32.         print(f"You rolled {amount} D{sides} and got... ")
33.
34.     # check that "amount" is in range and double check sanitation
35.     if amount >= 1 and amount <= 10 and type(amount) is int:
36.
37.         # infinite-sided die
38.         if type(sides) == str:
39.             if sides == "inf" or sides == "infinity" or sides == "∞" or sides == "infinite":
40.                 initialprint()
41.                 print(infresults[random.randint(len(infresults))])
42.             else:
43.                 user_error()
44.
45.         # check that "sides" is in range and double check sanitation
46.         elif type(sides) is int:
47.             if sides >= 2 and sides <= 100:
48.                 initialprint()
49.
50.                 # Format natural language syntax & keep output on one line, and generate & print results
51.                 if amount > 2:
52.                     for amount in range(amount - 1):
53.                         print(f"a {random.randint(sides) + 1},", end=" ", flush=True)
54.                     print(f"and a {random.randint(sides) + 1}.")
55.                 elif amount == 2:
56.                     for amount in range(amount - 1):
57.                         print(f"a {random.randint(sides) + 1}", end=" ", flush=True)
58.                     print(f"and a {random.randint(sides) + 1}.")
59.                 else:
60.                     print(f"a {random.randint(sides) + 1}.")
61.             else:
62.                 user_error()
63.         else:
64.             user_error()
65.     else:
66.         user_error()
67.     prog_end()
68.
69. ### End of main program ###
70.
71.
72.
73.
74. ### Beginning of simple functions ###
75.
76. # Print generic error; can add more types of errors or outputs if needed
77. def user_error():
78.     print("That doesn't work. Please use 1-10 dice of 2-100 sides. If you enter only one number, it will be used as the number of dice, unless you put a \"d\" in front. Type \"!rollhelp\" for examples.")
79.     prog_end()
80.
81. # Terminate the program; can add output or other functions if needed
82. def prog_end():
83.     sys.exit()
84.
85. # Attempt to convert initial arguments into integers
86. def makeint(inp):
87.     try:
88.         inp = int(inp)
89.         return inp
90.     except:
91.         user_error()
92.
93. ### End of simple functions ###
94.
95.
96.
97.
98. ### Beginning of input sanitizer ###
99.
100. # Parse the initial arguments and set defaults
101. if len(sys.argv) == 2:
102.     input1 = sys.argv[1]
103.     input2 = "null"
104. elif len(sys.argv) == 3:
105.     input1 = sys.argv[1]
106.     input2 = sys.argv[2]
107. elif len(sys.argv) > 3:
108.     user_error()
109. elif len(sys.argv) < 2:
110.     input1 = 1
111.     input2 = 20
112.
113. # Various checks for the first argument & pass first argument to second argument if needed
114. if type(input1) == str:
115.     input1 = input1.lower()
116.     if input1[0] == "d":
117.         input2 = input1[1:]
118.         input1 = 1
119.     elif input1 == "inf" or input1 == "infinity" or input1 == "∞" or input1 == "infinite":
120.         if input2 == "null":
121.             input2 = input1
122.             input1 = 1
123.         else:
124.             user_error()
125.     else:
126.         input1 = makeint(input1)
127.         if input2 == "null":
128.             input2 = 20
129. else:
130.     input1 = makeint(input1)
131.
132. # Various checks for second argument
133. if type(input2) == str:
134.     input2 = input2.lower()
135.     if input2[0] == "d":
136.         try:
137.             input2 = int(input2[1:])
138.         except:
139.             user_error()
140.     elif input2 == "inf" or input2 == "infinity" or input2 == "∞" or input2 == "infinite":
141.         pass
142.     else:
143.         input2 = makeint(input2)
144. else:
145.     input2 = makeint(input2)
146.
147. ### End of sanitizer ###
148.
149.
150.
151.
152. # Execute main program
153. dice(input1, input2)