import random # check hat users have entered a valid # option based on a list def string_checker(question, valid_ans=('yes', 'no')): error = f"Please enter a valid option from the following list: {valid_ans}" while True: # get user res[onse 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 that is valid print(error) print() # 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 the number is more than / equal to 13 if response < 1: print(error) else: return response except ValueError: print(error) # compares user / computer choice and returns # result (win / lose tie) def rps_compare(user, comp): # if the user puts in the right answer if user == [answer]: round_result = "win" # user puts in a wrong answer else: round_result = "loss" return round_result # Main routine starts here # intialise game variables mode = "regular" rounds_played = 0 rounds_won = 0 rounds_lost = 0 rps_list = ["1", "2", "3", "4", "5", "xxx"] game_history = [] # questions the comp can ask you question_list = [ "What is 1 + 2?", "What is 2 + 2?", "What is 2 - 1?", "What is 1 + 1?", "What is 2 + 3?" ] print(" Maths quiz ") print() # ask user if they want to see the instructions and display # them if requested want_instructions = string_checker("Do you want to read the instructions? ") # checks users enter yes (y) or no (n) if want_instructions == "yes": print(''' *** Instructions **** To begin, choose the number of rounds (must be from 3 to 20). Then be asked maths questions that you must answer correctly Press to end the game at anytime. Good Luck! ''') # ask user for number of rounds num_rounds = int_check("How many Rounds would you like to play?: ") 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) # randomly choose from the rps list (excluding the exit code) comp_choice = random.choice(question_list) print(f"{comp_choice}") # get user choice user_choice = string_checker("Answer: ", rps_list) print("you chose", user_choice) # if user choice is the exit code, break the loop if user_choice == "xxx": break result = rps_compare(user_choice, comp_choice) # adjust game lost / game tried counters add results to the game history if result == "win": feedback = "Correct!" rounds_won += 1 rounds_played += 1 else: feedback = "Incorrect." rounds_lost += 1 rounds_played += 1 # set up round feedback and output it 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 # game history / statistics area if rounds_played > 0: # calculate statistics 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 Statistices") 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 if requested. see_history = string_checker("\nDo you want to see your game history? ") if see_history == "yes": for item in game_history: print(item) print() print("Thanks for playing.") # this will be given to user if they don't play any rounds else: print("Oops - You chickened out!")