ПИТОН: Как заставить программу остановиться, если прошло несколько секунд? - PullRequest
2 голосов
/ 18 октября 2019

Итак, я делаю небольшую скоростную игру. Произвольная буква будет генерироваться функцией, сразу после этого я хочу, чтобы программа подождала несколько секунд. Если ничего не нажимать, вы потеряете, и ваша запись будет отображаться. Если вы нажмете правую клавишу, появится другая случайная буква. Я использовал функцию времени и смоделировал хронометр, который длится в диапазоне (0,2). Это то, что я до сих пор. Он работает, дело в том, что он отображает первую букву, если вы нажмете ее неправильно, вы потеряете (хорошо), но даже если вы нажмете ее правильно, хронометр, очевидно, продолжит работать, поэтому он дойдет до 2, и вы проиграете. Я хочу, чтобы он останавливался и сбрасывался после нажатия клавиши, но я понятия не имею, как это сделать. Я новичок в программировании, поэтому извините, если вы что-то не получите.

import string
import random
import msvcrt
import time

def generarletra():
    string.ascii_lowercase
    letra = random.choice(string.ascii_lowercase)
    return letra

def getchar():
    s = ''
    return msvcrt.getch().decode('utf-8')

print("\nWelcome to Key Pop It!")
opcion = int(input("\n  Press 1 to play OR\n  Press 2 for instructions"))

if(opcion == 1):
    acum=0
    while True:
        letra2 = generarletra()
        print(letra2)
        key = getchar()
        for s in range (0,2):
            print("Segundos ", s)
            time.sleep(2)
        acum = acum + 1
        if((key is not letra2) or (s == 2)):
            print("su record fue de, ", acum)
            break

elif(opcion == 2):
    print("\n\nWelcome to key pop it!\nThe game is simple, the machine is going to generate a 
random\nletter and you have to press it on your keyboard, if you take too\nlong or press the wrong 
letter, you will lose.")
else:
    print("Invalid option!")

PD: Вам нужно запустить его с симуляцией консоли в вашей IDE или непосредственно из консоли. Библиотека msvcrt по какой-то причине не будет работать внутри IDE.

Ответы [ 2 ]

1 голос
/ 18 октября 2019

msvcrt.getch() блокируется, поэтому вы фактически не измеряете время, которое потребовалось пользователю, чтобы нажать клавишу. Цикл for начинается после того, как пользователь уже нажал его. Кроме того, time.sleep() блокирует, поэтому пользователю придется ждать время ожидания, даже если он уже нажал клавишу.

Чтобы решить первую проблему, вы можете использовать msvcrt.kbhit(), чтобы проверить, нажал ли пользователь накакой-то ключ, и звоните msvcrt.getch() только если он это сделал. Таким образом, msvcrt.getch() вернется сразу после вызова.

Чтобы решить вторую проблему, вы можете просто использовать time.time(), чтобы получить время начала раунда и сравнить его с текущим временем внутри цикла. Вы также можете напечатать, сколько времени прошло внутри цикла.

Вот окончательный код (с некоторыми дополнительными изменениями именования и форматирования):

import string
import random
import msvcrt
import time

MAX_TIME = 2

def get_random_char():
    return random.choice(string.ascii_lowercase)

def get_user_char():
    return msvcrt.getch().decode('utf-8')

print("\nWelcome to Key Pop It!")
option = input("\n  Press 1 to play OR\n  Press 2 for instructions\n")

if option == "1":
    score=0
    while True:
        char = get_random_char()            
        print("\n" + char)
        start_time = time.time()
        while not msvcrt.kbhit():
            seconds_passed = time.time() - start_time
            print("seconds passed: {0:.1f}".format(seconds_passed), end="\r")
            if seconds_passed >= MAX_TIME:
                key = None
                break
        else:
            key = get_user_char()
        if key != char:
            break
        score = score + 1
    print("\nsu record fue de, ", score)

elif option == "2":
    print("""
    Welcome to key pop it!
    The game is simple, the machine is going to generate a random
    letter and you have to press it on your keyboard, if you take too
    long or press the wrong letter, you will lose.""")
else:
    print("Invalid option!")
0 голосов
/ 18 октября 2019

Timestamp-решение:

from time import time, sleep

start = time()  # start time measuring by creating timestamp


def time_passed(start, duration):
    """tests if an amount of time has passed
    Args:
        start(float): timestamp of time()
        duration(int): seconds that need to pass
    Returns:
        bool: are 'duration' seconds over since 'start'
    """
    return start + duration <= time()


# Use as condition for while
while not time_passed(start, 5):
    sleep(1)

# ... or if statements or <younameit>
if time_passed(start, 5):
    print("Do something if 5 seconds are over")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...