2016-10-09 3 views
0

Je fais un quiz textuel et je veux faire en sorte que si le lecteur ne répond pas après un certain temps, il agira comme s'il avait la question faux. Je ne suis pas vraiment sûr de savoir comment faire cela. J'ai quelques idées: Multithreading et Timers; Cependant, je n'ai aucune idée de comment faire l'un ou l'autre.Désactivation d'un scanner après un certain laps de temps

Est-ce que l'une ou l'autre serait une bonne option?

Méthode avec ma question:

public void questionOneA(String choice) { 

    choice = scanner.nextLine(); 
    setWrong(false); 

    switch(choice) { 
    case "a": 
     setLives(lives - 1); 
     setWrong(true); 

     if (getLives() > 0) { 
      System.out.println("WRONG! Try again."); 
     } 
     else { 
      System.out.println("WRONG!"); 
     } 
     break; 
    case "b": 
     System.out.println("CORRECT!"); 
     setCorrect(true); 
     break; 
    case "c": 
     setLives(lives - 1); 
     setWrong(true); 

     if (getLives() > 0) { 
      System.out.println("WRONG! Try again."); 
     } 
     else { 
      System.out.println("WRONG!"); 
     } 
     break; 
    case "d": 
     setLives(lives - 1); 
     setWrong(true); 

     if (getLives() > 0) { 
      System.out.println("WRONG! Try again."); 
     } 
     else { 
      System.out.println("WRONG!"); 
     } 
     break; 
    case "skip": 
     if (skips > 0) { 
      setSkips(skips - 1); 
      setCorrect(true); 
     } 

     else { 
      System.err.println("You do not have any skips left!"); 
     } 
     break; 
    default: 
     System.err.println("Please type an answer."); 
     break; 
    } 
} 

Répondre

0

Vous pouvez le faire de la même manière que pour toute autre action basée sur l'exécution d'un événement après un certain temps, avec un ou un Delta-time loop qui déclenche un événement (dans ce cas, cela correspond à la question faux) après un certain temps (delta-).

En supposant que votre quiz fonctionne dans une boucle (comme des jeux et des logiciels de jeux comme devrait), tout ce que vous devez faire est:

//Specify a maximum time and record it in a variable; in this case, I'm using milliseconds as unit, and 30 seconds of time. 
long maxQuestionTime = 30000; 

//Outside the game-loop, at start of a question, record a timestamp of the current time + max time. 
long maxQuestionTimestamp = System.currentTimeMillis()+maxQuestionTime; 

//Inside game-loop, check if current time has gone above the timestamp, effectively measuring elapsed time. 
if(System.currentTimeMillis()>maxQuestionTimestamp){ 
    //fail the question here 
} 
0

Utilisation de la classe est également multithreading Timer (java.util.Timer). Cela semble potentiellement adapté à une application comme celle-ci, bien que le multithreading puisse introduire un nombre important de pièges possibles. Vous pouvez créer un Timer puis planifier un TimerTask au début d'une question qui marquera un indicateur pour indiquer que la question est incorrecte et désactiver l'acceptation de tentatives de réponse futures (ou passer à la question suivante ou à toute autre action appropriée) lorsque la tâche planifiée se produit. Cela nécessiterait de créer une sous-classe de TimerTask qui implémente la méthode abstraite run() pour effectuer l'action que vous voulez (marquer la question incorrecte, etc.). Vous pourriez même vouloir utiliser la minuterie pour d'autres tâches (par exemple donner à l'utilisateur un moment pour traiter le fait qu'il a expiré sur une question avant de passer à la suivante).

Le flux de base à l'aide d'un Timer (comme il est indiqué dans l'exemple ci-dessus) est de créer une sous-classe de TimerTask mise en œuvre run() pour effectuer toutes les tâches doivent se produire à un moment donné ou à la fin d'une certaine durée de temps (ou de façon répétée à un certain intervalle, que Timer s supportent également). Instancier ensuite un Timer et planifier une instance de cette sous-classe TimerTask pour exécution à un moment donné ou après un certain intervalle (en fonction de la méthode schedule de Timer que vous appelez pour la planifier). Ensuite, une fois cette durée atteinte ou l'intervalle écoulé, la méthode run() que vous avez implémentée sera appelée dans le fil d'arrière-plan Timer. Cependant, vous devrez vous méfier des pièges tels que les conditions de course (par exemple, si votre tâche devait marquer la question comme incorrecte, puis désactiver les réponses, si l'utilisateur répondait). une question entre votre tâche la marquant incorrecte et la désactivant en répondant à ce que vous pourriez obtenir un comportement inattendu). C'est l'un des défis communs de l'écriture de code multithread. Si la logique et le flux de votre programme sont assez simples, une conception attentive des actions effectuées par la tâche quand et dans quel ordre peut suffire à éviter ces problèmes, mais vous devez faire preuve de la plus grande prudence en traitant les mises à jour d'état (comme la mise à jour d'un booléen indiquant que la question était ou n'était pas correcte à partir d'une tâche de minuteur).

Un multithreading plus général serait certainement utilisable, bien que Timer semble utile dans la mesure où il est plus spécifique à ce type particulier de tâche. En dehors de tout cela, je vous déconseille fortement d'écrire une méthode complète pour chaque question, du point de vue stylistique, car cela peut conduire à une grande quantité de code dupliqué ou très similaire. Une approche comme la création d'une classe pour les questions (surtout si toutes vos questions ont un format similaire) peut être préférable, vous permettant de créer une nouvelle question en appelant simplement un constructeur avec le texte de la question et l'index du bon répondre. Votre classe de questions peut inclure une méthode qui effectue la vérification de réponse dans votre exemple de code que toutes les questions (en tant qu'instances de classe) ont sans avoir besoin de le réécrire pour chacun d'eux.