import random # Check that users have entered a valid option based on a list def string_checker(question, valid_ans): error = f"Please enter a valid option from the following list: {valid_ans}" while True: # Get user response and make sure it's lowercase user_response = input(question).lower() for item in valid_ans: # check if the user response is a word in the list if item == user_response: return item # check if the user response is the same as the first letter of an item in the list elif user_response == item[0]: return item # print error if user does not enter something valid print(error) print() # Displays instructions def instructions(): # Prints instructions print(""" *** Instructions *** To begin, choose the number of rounds (or press for infinite mode). The rules are simple: The computer will ask you a multiplication question. Each number will be no higher than 12. All you have to do is enter the correct answer to the question! Type to end the game at any time. Good Luck! """) # Checks for an integer more than 0 (allows ) def int_check(question): while True: error = "Please enter an integer that is 1 or more." to_check = input(question) # check for infinite mode if to_check == "": return "infinite" try: response = int(to_check) # check that the number is more than / equal to 1 if response < 1: print() print(error) print() else: return response except ValueError: print() print(error) print() # Compares user / computer choice and returns # result (win / lose / tie) def answer_compare(user, answer): # If the user and the actual answer is the same, it's correct if user == answer: round_result = "correct" # If it's not correct, then it's incorrect else: round_result = "incorrect" return round_result # Main Routine starts here # Initialise game variables mode = "regular" rounds_played = 0 rounds_tied = 0 rounds_lost = 0 yes_no = ["yes", "no"] rps_list = ["rock", "paper", "scissors", "xxx"] game_history = [] print() print(" o[]= Multiplication Game =[]o ") print() # Ask user if they want to see instructions, and display if requested want_instructions = string_checker("Do you want to read the instructions? ", yes_no) # Checks user enters yes (y) or no (n) if want_instructions == "yes": instructions() # Ask user for number of rounds / infinite mode num_rounds = int_check("How many rounds would you like? Push 'enter' for infinite mode ") if num_rounds == 'infinite': mode = "infinite" num_rounds = 5 # Game loop starts here while rounds_played < num_rounds: # Rounds headings if mode == "infinite": rounds_heading = f"\n.=+ Round {rounds_played + 1} (Infinite Mode) +=." else: rounds_heading = f"\n .=+ Round {rounds_played + 1} of {num_rounds} +=." print(rounds_heading) print() # Get user choice user_choice = string_checker("Choose: ", rps_list) # If user choice is the exit code, break the loop if user_choice == "xxx": break # Randomly choose from the rps list (excluding the exit code) comp_choice = random.choice(rps_list[:-1]) print("Computer choice: ", comp_choice) result = answer_compare(user_choice, comp_choice) # Adjust game lost / game tied counters and add results to game history if result == "tie": rounds_tied += 1 feedback = "It's a tie!" elif result == "lose": rounds_lost += 1 feedback = "You lose. :(" else: feedback = "You won!!" # Set up round feedback and output it to user. # Add it to the game history list (include the round number) round_feedback = f"{user_choice} vs {comp_choice}, {feedback}" history_item = f"Round: {rounds_played + 1} - {round_feedback}" print(round_feedback) game_history.append(history_item) rounds_played += 1 # if users are in infinite mode, increase number of rounds! if mode == "infinite": num_rounds += 1 # Game loop ends here print() # Game History / Statistics area if rounds_played > 0: # Calculate Statistics rounds_won = rounds_played - rounds_tied - rounds_lost percent_won = rounds_won / rounds_played * 100 percent_lost = rounds_lost / rounds_played * 100 percent_tied = 100 - percent_won - percent_lost # Output Game Statistics print(" +++ Game Statistics +++ ") print(f"Won: {percent_won:.2f} \t " f"Lost: {percent_lost:.2f} \t " f"Tied: {percent_tied:.2f}") # ask user if they want to see their game history, and output it if requested. see_history = string_checker("\nDo you want to see your game history? ", yes_no) if see_history == "yes": print() for item in game_history: print(item) print() print("Thanks for playing.") else: print("Oops - You chickened out!")