6
\$\begingroup\$

This is sort of a follow up to my post yesterday. I'm a relative newbie to Python and before I made a d20 dice roller for RPGs. Now I've made a dice roller for any type of dice, and I would love some feedback on this code.

from random import randint

def roll(sides, number_of_dice):
    """Rolls Dice."""
    return [randint(1, sides) for i in range(num_of_dice)]

prompt = """
Would you like to roll the same combination of dice {}? 
Please type 'yes', 'no', or 'quit'
"""

# Main Program

name = raw_input("\nPlease tell me your name > ")

print """
Hello {} and welcome to an RPG Dice Roller by Ray Weiss.
Please type quit when prompted to exit or use CNTRL-C. 
Thanks to everyone at Stack Overflow etc. for the help. 
""".format(name)

sides = input("\nHow many sides do you want on your dice? > ")
num_of_dice = input("\nHow many {} sided dice do you want to roll? >".format(sides))
results = roll(sides, num_of_dice)
print results

roll_again = raw_input(prompt.format(name))

while True:

    if roll_again == "yes":
        results = roll(sides, num_of_dice)
        print results
        roll_again = raw_input(prompt.format(name))

    if roll_again == "no": 
        sides = input("How many sides do you want on your dice? > ")
        num_of_dice = input("\nHow many {} sided dice do you want to roll? >".format(sides))
        results = roll(sides, num_of_dice)
        print results
        roll_again = raw_input(prompt.format(name))

    if roll_again == "quit":
        print """
Thank you {} for using this RPG Dice Roller by Ray Weiss! Goodbye!
        """.format(name)
        break
\$\endgroup\$
6
\$\begingroup\$

I think the big thing here is to beware of external data. Assume that it could be garbage.

For instance:

  • What happens if the user doesn't enter a name? -> Actually, not much apart from 2 spaces (rather than 1) in messages - relatively benign.
  • What happens if the user enters "rabbit" sides? -> This value in any case needs to be transformed to an int for roll to work correctly otherwise a TypeError will be thrown. int("rabbit") will throw a ValueError (see last item)
  • Similarly, num_of_dice also have to be validated as a positive integer (non-zero).
  • If the user enters something wrong for roll_again (say, "of course!"), you'll enter an infinite loop - The question probably needs to be brought inside the loop.
  • You'll want to use raw_input rather than input in python2. Input evaluates an expression, which does what you want here (enter a number, get an int back (unless of course it's a float!)), but should be regarded as avoid if at all possible.
\$\endgroup\$
  • \$\begingroup\$ Thanks! I'm not so sure how to do many of these things as a newbie but its more for me to learn! I appreciate it! \$\endgroup\$ – lerugray Sep 22 '12 at 12:47

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.