#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()
Пример вывода: