import random import math # 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 the user does not enter something that is valid print(error) print() # Displays instructions def instructions(): """Prints instructions""" print(""" *** Instructions *** To begin, choose the number of questions that you want (or press for infinite mode). Then, you will be asked what a power or square root of a number equals. Enter your answer and ensure that it's rounded to two decimal places. (please be very careful with your rounding) At the end of the quiz, you will be provided with your score. Try and improve upon your previous score when you play. Press to end the game at anytime. 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) # checks that number is more than / equal to 1 if response < 1: print(error) else: return response except ValueError: print(error) # variables for the sqrt checking function num = random.randint(1, 12) result = math.sqrt(num) rounded_result = round(result, 2) # asks user sqrt question def sqrt_question(): while True: error_2 = "Please enter a number." float(input(f"What is the square root of {num}? ")) try: # check the user says the correct answer if maths_answer == result: print(f"Correct! The square root of {num} is {result}!") continue elif maths_answer == rounded_result: print(f"Correct! The square root of {num} is {rounded_result}!") continue else: print(f"Incorrect. The square root of {num} is {result} or {rounded_result}") continue except ValueError: print(error_2) # Main Routine Starts here # Initialise game variables mode = "regular" questions_played = 0 incorrect_answers = 0 yes_no = ['yes', 'no'] game_history = [] # ask the user if they want to see the instructions and display them if requested want_instructions = string_checker("Do you want to read the instructions? ", yes_no) # checks users enter yes (y) or no (n) if want_instructions == "yes": instructions() # Ask user for number of rounds / infinite mode error = "Please enter a number lower than 15, or push for infinite mode." num_rounds = int_check("How many rounds would you like? Push for infinite mode: ") if num_rounds > 15: print(error) elif num_rounds == "infinite": mode = "infinite" num_rounds = 5 # Game loop starts here while questions_played < num_rounds: # Rounds headings if mode == "infinite": rounds_heading = f"\n⚇⚇⚇ Round {questions_played + 1} (Infinite Mode) ⚇⚇⚇" else: rounds_heading = f"\n💿💿💿 Round {questions_played + 1} of {num_rounds} 💿💿💿" print(rounds_heading) # asks sqrt question maths_answer = sqrt_question(float(input(f"What is the square root of {num}? "))) # check if user choice is the exit code, break the loop if maths_answer == "xxx": break # set up rounds feedback and output it to the user # Add it to the game history list (including 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) questions_played += 1 # if the 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": for item in game_history: print(item) print() print("Thanks for playing.") else: print("Oops - You chickened out!")