6
\$\begingroup\$

How could I improve or make this program more user friendly? I have not been programming very long, so please don't give me a task that is too complicated.

from random import randint
import time
global word
word = "a"
shield = 5
#The main function
def main():
    #This will trigger the introduction
    intro()
    while TakeTurn() == False:
        if shield == 1:
            word1 = "shield"
        else:
            word1 = "shields"
        print ("You have", shield, word1,)
        if shield < 1:
            print ("Sorry! You ran out of shields! You lose!")
        else:
            print ("You win")

#This function is the introduction to the program
def intro():
    time.sleep(2)
    print ("You are lost in a maze, it is dark and you are lost")
    time.sleep(2)
    print ("Im afraid there are monsters here...")
    time.sleep(1.5)
    print ("BOO!")
    time.sleep(1)
    print ("You have five shields to protect you...")
    time.sleep(2)
    print ("Use them well!")
    time.sleep(1)
    print ("Okay, let's go!")

#This function is the actual 'game' and will deterine what happens to the character    
def TakeTurn():
    global word
    global shield
    time.sleep(1.5)
    #This means that when the user reaches 0 shields, they lose.
    if shield < 1:
        return True
    #Whatever the user inputs will not actually affect the outcome
    print ("You have reached", word ,"junction.\nDo you want to turn left (L), turn right (R) or go straight ahead(S)?")
    turning = input()
    #This is a simple instruction that means that the first time you come to a junction, it will say 'a junction' but the second time it will say 'another junction'
    word = "another"
    #This 'if' statement means that the program will only continue if the user has inputed the letters 'L', 'R' or 'S'
    if turning not in ["L","R","S","l","r","s"] :
        time.sleep (0.7)
        print ("Sorry, I didn't understand that")
        TakeTurn()
    else:
        choice = randint (1,10)
    #This is just going to display a random message which will affect the outcome
    time.sleep (1)
    if choice == 1:
        print ("You have found the exit!")
        return True
    elif choice == 2:
        print ("You have found a shield!")
        time.sleep(1)
        shield = shield +1
        return False
    elif choice == 3:
        print ("You have found two shields!")
        time.sleep(1)
        shield = shield +2
        return False
    elif choice == 4:
        print ("You have found three shields!")
        time.sleep(1)
        shield = shield +3
        return False
    elif choice == 5:
        print ("A fairy has jumped into your pants!")
        time.sleep(2)
        print ("You lose two shields")
        time.sleep(1)
        shield = shield -2
        return False
    elif choice == 6:
        treasurechest()
        return False
    elif choice == 7:
        print ("You have tripped over a log!")
        time.sleep(2)
        print ("You lose a shield")
        time.sleep(1)
        shield = shield -1
        return False
    elif choice == 8:
        print ("An angry teenager is staring at you in the eye.")
        time.sleep(2.5)
        print ("He uses laziness...")
        time.sleep(1.5)
        print ("It's super effective!")
        time.sleep(1)
        print ("You lose three shields")
        time.sleep(1)
        shield = shield -3
        return False
    elif choice == 9:
        print ("You have encountered an ogre...")
        time.sleep(1.5)
        print ("He bashes you over the head with a steel bar")
        time.sleep(2)
        print ("You lose two shields")
        time.sleep(1)
        shield = shield -2
        return False
    else:
        print ("A goblin aproaches and says the following:")
        time.sleep(2)
        goblin()
        return False

def goblin():
    global shield
    print ("'Do you want to play my magical roulette?\n There are three different outcomes:'")
    time.sleep(2.5)
    print ("You lose a shield")
    time.sleep (1)
    print ("You gain a shield")
    time.sleep (1)
    print ("Nothing happens")
    time.sleep(1)
    goblin = 0
    while goblin == 0:
        print ("Do you want to play? Y or N?")
        choice2 = input ()
        time.sleep(1)
        if choice2 not in ["Y","N","y","n"]:
            print ("Sorry I didnt understand that")
        elif choice2 not in ["Y","y"]:
            print ("Okay bye")
            TakeTurn()
        else:
            print ("Let's play!")
            time.sleep(1)
            print ("Spinning...")
            time.sleep(1)
            print ("Spinning...")
            time.sleep(1)
            print ("Spinning...")
            time.sleep(1)
            roulette = randint (1,3)
            if roulette == 1:
                print ("Nothing happens")
                goblin = 1
            elif roulette == 2:
                print ("Im going to have to take one of your shields")
                shield = shield -1
                goblin = 1
            else:
                print ("Here! Have a shield!")
                shield = shield +1
                goblin = 1

def treasurechest():
    global shield
    treasure = 1
    while treasure == 1:
        print ("You have found a treasure chest! Do you want to open it? Y or N?")
        chest = input()
        if chest not in ["Y","y","N","n"]:
        print ("Sorry, I didn't understand that")
        elif chest not in ["Y","y"]:
        print ("Okay Bye")
        treasure = 0
        else:
            time.sleep(1)
            print ("Opening...")
            time.sleep(1)
            print ("Opening...")
            time.sleep(1)
            print ("Opening...")
            time.sleep(1)
            chest = randint (1,6)
            if chest == 1:
                print ("You have found a shield!")
                shield = shield +1
                treasure = 0
            elif chest == 2:
                print ("You have found two shields!")
                shield = shield +2
                treasure = 0
            elif chest == 3:
                print ("A dwarf jumps out and steals one of your shields!")
                shield = shield -1
                treasure = 0
            elif chest == 4:
                print ("An evil fairy steals two of your shields!")
                shield = shield -2
                treasure = 0
            elif chest == 5:
                print ("Sorry, the chest is empty")
                treausre = 0
            else:
                print ("A goblin is in the chest and says the following...")
                time.sleep(2)
                goblin()
\$\endgroup\$

1 Answer 1

8
\$\begingroup\$

Welcome to programming and Python. I have a few suggestions. There are a lot of suggestions here in this answer. To improve the style of your code beyond the things I have spoken to here, have a look at the official Python style guide.

  1. This code would be simpler if you used classes. However, you said you are new to programming so I won't push this idea too hard. A simple class skeleton that could fit your needs might be:

    class Player(object):
        def __init__(self, shield, treasure):
            self.shield = shield
            self.treasure = treasure
    
        def take_turn(self):
            # Do stuff
    
  2. Try not to use global. This should only be used if you HAVE to. Implementing classes as I suggested above would help remove the use for global. Also you could pass the variables as parameters to the functions:

    def TakeTurn(word, shield):
        ...
    
  3. You have a lot of time.sleep(...) then print('stuff'). This is fine, however it results in a lot of repeated code. You could bring these lines into a single function:

    def print_on_a_timer(times, lines):
        for time, line in zip(times, lines):
            time.sleep(time)
            print(line)
    

    Using this function in your intro function for example:

    def intro():
        times = [2, 2, 1.5, 1, 2, 1]
        lines = ["You are lost in a maze, it is dark and you are lost",
                 "Im afraid there are monsters here...", "BOO!",
                 "You have five shields to protect you...","Use them well!",
                 "Okay, let's go!"]
    
        print_on_a_timer(times, lines)
    
  4. When you are getting input from the user, you are checking for both lowercase and uppercase letters. This is good, however instead of doing choice not in ["Y","N","y","n"] you could use the lower function:

    choice = input().lower()
    if choice not in ['y', 'n']:
    
  5. In your TakeTurn function you restart the function if the user didn't provide good input. Instead of calling the function again, you can use a while loop:

    print ("You have reached", word ,"junction.\nDo you want to turn left (L),\
            turn right (R) or go straight ahead(S)?")
    turning = input().lower()
    while turning not in ["l", "r", "s"]:
        time.sleep (0.7)
        print ("Sorry, I didn't understand that")
        turning = input().lower()
    
  6. Your choice if-elses could be simplified if they were placed into a dict and the results were their own functions:

    choices = {'1':lambda: update_shields(1),
               '2':lambda: update_shields(2),
               '3':lambda: update_shields(3), ...}
    
    choice = input()
    choices[choice]()
    
    . . .
    
    # Updates the current shield count and prints an appropriate message.
    def update_shield(num_shields):
       shields += num_shields
    
       multiple = num_shields > 1 or num_shields < -1
       print('You have {} {} shield{}'.format('found' if num_shields > 0 else 'lost',
                                               num_shields, 's' if multiple else ''))
    

There are other things I can point out. However, I have already given you a lot of information. Once you have updated your code, feel free to comment and I'll update my answer with more suggestions.

\$\endgroup\$
2
  • \$\begingroup\$ #6 is incorrect: creating the dictionary will involve calling update_shield multiple times. Instead, use functools.partial or lambda. \$\endgroup\$
    – jonrsharpe
    Commented May 30, 2014 at 21:07
  • \$\begingroup\$ Good catch, my original implementation was implemented wrongly. \$\endgroup\$ Commented May 31, 2014 at 15:54

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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