J'essaie de créer un jeu simple qui crée des problèmes mathématiques et la tâche des utilisateurs est de décider s'ils sont vrais ou faux. (ex. 2 + 2 = 6, Vrai ou Faux?) J'utilise le module clavier et je veux que l'utilisateur appuie sur la touche fléchée gauche s'il pense que le problème est vrai, et le droit s'il pense que c'est faux.

import random
import keyboard


def addition_easy():
    x = random.randint(1, 6)
    y = random.randint(1, 6)
    z = x + y
    answer_correct = random.choice([True, False])
    if answer_correct == False:
        answer = (random.randint(2, 12))
    else:
        answer = z
    if answer == z:
        answer_correct = True

    print(f"{x} + {y} = {answer}")
    print("True or False?")

    while True:
        if keyboard.is_pressed('left'):
            user_answer = True
            break
        elif keyboard.is_pressed('right'):
            user_answer = False
            break

    if user_answer == answer_correct:
        return True
    else:
        return False

Le fait est qu'après avoir collé cette fonction dans une boucle, je ne peux appuyer qu'une seule fois vers la gauche ou la droite. Après cela, le reste du code est exécuté sans attendre ma touche.

from problems import addition_easy

exercise_amount = int(input("How many exercises would you like to solve?"))

for exercise in range(1, exercise_amount + 1):
    addition_easy()

Cela renvoie (pour une entrée de 5):

Combien d'exercices aimeriez-vous résoudre? 5

6 + 1 = 9

Vrai ou faux? // (Ici, il attend que j'appuie sur "gauche" ou "droite")

3 + 3 = 8

Vrai ou faux? // (À partir d'ici, il ne s'arrête pas d'attendre une pression sur une touche)

4 + 3 = 7

Vrai ou faux? // (Idem ici et ainsi de suite ...)

2 + 3 = 3

Vrai ou faux?

1 + 2 = 3

Vrai ou faux?

Comment puis-je faire attendre une pression sur une touche chaque fois qu'il imprime un problème mathématique?

0
piotrekobi 15 mars 2019 à 18:26

2 réponses

Meilleure réponse

Si l'utilisateur maintient la touche «gauche» enfoncée pendant une demi-seconde et que addition_easy s'exécute cent fois dans cette demi-seconde, alors keyboard.is_pressed('left') sera évalué à True pour chacun d'eux, même si l'utilisateur n'a appuyé que sur "gauche" une fois.

Vous pouvez vérifier que is_pressed ne considère pas en permanence que "gauche" doit être pressé en disant à votre programme de faire 1000 problèmes. Appuyer sur la gauche ne répondra qu'à environ 20 d'entre eux.

Une solution possible consiste à modifier votre boucle afin qu'elle attende que la clé soit relâchée par la suite avant de continuer.

while True:
    if keyboard.is_pressed('left'):
        user_answer = True
        while keyboard.is_pressed("left"):
            pass
        break
    elif keyboard.is_pressed('right'):
        user_answer = False
        while keyboard.is_pressed("right"):
            pass
        break

Une autre conception possible consiste à utiliser keyboard.on_press_key, qui ne devrait se déclencher que lorsque la touche passe de l'état "non enfoncé" à "enfoncé" (ou lorsque le temps de répétition automatique est écoulé, ce qui ne se produira probablement pas à moins que l'utilisateur ne le fasse). intentionnellement). Vous pouvez résumer cela à une fonction pour garder votre fonction addition_easy propre:

import random
import keyboard
import time

def wait_for_keys(keys):
    key_pressed = None
    def key_press_event(key):
        nonlocal key_pressed
        key_pressed = key.name

    for key in keys:
        keyboard.on_press_key(key, key_press_event)

    while key_pressed is None:
        time.sleep(0.01)
    return key_pressed

def addition_easy():
    x = random.randint(1, 6)
    y = random.randint(1, 6)
    z = x + y
    answer_correct = random.choice([True, False])
    if answer_correct == False:
        answer = (random.randint(2, 12))
    else:
        answer = z
    if answer == z:
        answer_correct = True

    print(f"{x} + {y} = {answer}")
    print("True or False?")

    key = wait_for_keys(["left", "right"])
    user_answer = (key == "left")

    if user_answer == answer_correct:
        return True
    else:
        return False

exercise_amount = 1000

for exercise in range(1, exercise_amount + 1):
    addition_easy()
0
Kevin 15 mars 2019 à 15:43

Je ne sais pas si vous avez correctement mis en retrait votre fonction. Essayer:

import random
import keyboard
def addition_easy():
    x = random.randint(1, 6)
    y = random.randint(1, 6)
    z = x + y
    answer_correct = random.choice([True, False])
    if answer_correct == False:
        answer = (random.randint(2, 12))
    else:
        answer = z
    if answer == z:
        answer_correct = True

    print(f"{x} + {y} = {answer}")
    print("True or False?")

    while True:
        if keyboard.is_pressed('left'):
            user_answer = True
            break
        elif keyboard.is_pressed('right'):
            user_answer = False
            break

    if user_answer == answer_correct:
        return True
    else:
        return False

exercise_amount = int(input("How many exercises would you like to solve?"))

for exercise in range(1, exercise_amount + 1):
    addition_easy()
0
Gustav Linde 15 mars 2019 à 15:50