Мне нужно знать, как добавить таймер в свой код

#python #timer

Вопрос:

Я создал код на python, который в основном задает вам математические вопросы с рандомизированными числами и операциями. Это работает хорошо, за исключением того факта, что мне нужен таймер, в котором, если вы пройдете определенное количество времени (20 секунд), вопрос закончится, и я попытался добавить его, но у меня ничего не вышло, поэтому я был бы очень признателен за помощь. Извините, что приходится отправлять такой длинный код, но я не знал, сколько его нужно отправить, поэтому отправил все. Вот мой код:

 import random
import time
#
#
def startgame():
    answer=input ("Would you like to play a game? Y/N")  
    if (answer=="Y"):
        game()
    elif (answer=="N"):
        print("Goodbye")
#
#
def game():
    life_counter = 3
    point_counter = 0
    end_number1 = 25
    end_number2 = 25  
    start_number1 = 0
    start_number2 = 0
#
#  
    point_add = 1
    while life_counter!=0:
        while elapsed<20:
            if point_counter==10:
                print("Great job, you have reached 10 points!")
            if point_counter==30:
                print("Awesome! You have reached 30 points!")
            if point_counter==50:
                print("Legendary! You have reached 50 points")
            a = (random.randint(start_number1, end_number1))
            b = (random.randint(start_number2, end_number2))
            operator = [" ", "-", "/", "*"]
            chosen_operator = random.choice(operator)
    #
    #
            print ("what is", a, chosen_operator, b)
            c=float(input("What is your answer?"))
            if (chosen_operator==" "):
                if (c==(a b)):
                    print("That is correct") 
                    start_number1 =25
                    end_number1 =25
                    start_number2 =25
                    end_number2 =25
                    point_counter =point_add
                    point_add =1
                    print("You have", point_counter, "points")
                    continue
                elif (c!=(a b)):
                    print("Incorrect, try again")
                    life_counter-=1
                    print("You have", point_counter, "points and", life_counter, "lives left")
                    if (life_counter !=0): 
                        yn1=input("Would you like to try again?")
                        if (yn1=="no"):
                            print ("GAME_OVER")
                            break
                    
    #
    #
            elif (chosen_operator=="-"):
                if (c==(a-b)):
                    print("That is correct")
                    point_counter =point_add
                    point_add =1
                    start_number1 =25
                    end_number1 =25
                    start_number2 =25
                    end_number2 =25
                    print("You have", point_counter, "points")
                    continue
                elif (c!=(a-b)):
                    print("Incorrect, try again")
                    life_counter-=1
                    print("You have", point_counter, "points and", life_counter, "lives left")
                    if (life_counter !=0): 
                        yn2=input("Would you like to try again?")
                        if (yn2=="no"):
                            print ("GAME_OVER")
                            break
    #
    #
            elif (chosen_operator=="/"):
                if (c==(a/b)):
                    print("That is correct")
                    point_counter =point_add
                    point_add =1
                    start_number1 =25
                    end_number1 =25
                    start_number2 =25
                    end_number2 =25
                    print("You have", point_counter, "points")
                    continue
                elif (c!=(a/b)):
                    print("Incorrect, try again")
                    life_counter-=1
                    print("You have", point_counter, "points and", life_counter, "lives left")
                    if (life_counter !=0):
                        yn3=input("Would you like to try again?")
                        if (yn3=="no"):
                            print ("GAME_OVER")
                            break
    #
    #
            elif (chosen_operator=="*"):
                if (c==(a*b)):
                    print("That is correct")
                    point_counter =point_add
                    point_add =1
                    start_number1 =25
                    end_number1 =25
                    start_number2 =25
                    end_number2 =25
                    print("You have", point_counter, "points")
                    continue
                elif (c!=(a*b)):
                    print("Incorrect, try again")
                    life_counter-=1
                    print("You have", point_counter, "points and", life_counter, "lives left")
                    if (life_counter !=0): 
                        yn4=input("Would you like to try again?")
                        if (yn4=="no"):
                            print ("GAME_OVER")
                            break
#
#                     
    print("GAME_OVER, you ended with", point_counter, "points")
#
#
startgame()
 

Ответ №1:

  • Вы можете использовать библиотеку клавиатуры для ввода данных пользователем без остановки выполнения программы.
  • Вы можете использовать библиотеку потоков для отображения обратного отсчета таймера.
  • Вы можете использовать подход классов, чтобы сделать код более структурированным.

Краткий пример:

 import time
import keyboard
import threading

TIMEOUT_SEC = 5


class Game(object):
    def __init__(self):

        self.elapsed = TIMEOUT_SEC
        self.success = False
        t = threading.Thread(target=self.timer)
        t.start()

        while True:
            if keyboard.is_pressed('4'):
                print('Success!                 ')
                self.success = True
                break

            if not t.is_alive():
                print('Time is out! Game over!     ')
                break

            print(f'2   2 = ? Elapsed: {self.elapsed} sec.       ', end='r')

    def timer(self):
        for i in range(TIMEOUT_SEC):
            if self.success:
                break
            self.elapsed = TIMEOUT_SEC-i
            time.sleep(1)


Game()
 

Пример вывода:

введите описание изображения здесь