2016-10-09 3 views
0

Ich mache ein textbasiertes Quiz und ich möchte es so machen, dass, wenn der Spieler nach einer gewissen Zeit nicht antwortet, es so tun wird, als ob sie die Frage bekommen hätten falsch. Ich bin mir nicht sicher, wie ich das machen soll. Ich habe ein paar Ideen: Multithreading und Timer; Wie auch immer, ich habe keine Ahnung.Deaktivierung eines Scanners nach einer gewissen Zeit

Wäre beides eine gute Option dafür?

Methode mit meiner Frage:

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; 
    } 
} 

Antwort

0

Sie können es auf die gleiche Weise tun, wie Sie für etwas anderes tun würden, das auf etwas nach einer bestimmten Zeit basiert, entweder mit einem Timer oder einem Delta-time loop Auslösen eines Ereignisses (in diesem Fall eines, das der Frage entspricht) falsch) nach einer bestimmten (Delta) Zeit.

Angenommen, Ihre Quiz läuft in einer Schleife (wie Spiele und Spiel-ähnliche Software sollte), dann alles, was Sie tun müssen, ist:

//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

Mit der Timer Klasse (java.util.Timer) ist Multithreading auch. Es scheint potenziell geeignet für eine Anwendung wie diese, obwohl Multithreading eine erhebliche Anzahl von möglichen Fallstricken einführen kann. Sie könnten eine Timer erstellen und dann eine TimerTask zu Beginn einer Frage einplanen, die ein Flag markiert, um anzuzeigen, dass die Frage falsch ist, und zukünftige Antwortversuche zu akzeptieren (oder mit der nächsten Frage fortzufahren) tritt ein. Dies würde das Erstellen einer Unterklasse von TimerTask erfordern, die die abstrakte Methode run() implementiert, um die gewünschte Aktion auszuführen (die Frage wird als falsch markiert usw.). Möglicherweise möchten Sie den Zeitgeber auch für andere Aufgaben verwenden (z. B. um dem Benutzer einen Moment zu geben, die Tatsache zu verarbeiten, dass die Zeit für eine Frage überschritten wurde, bevor Sie mit der nächsten fortfahren).

Die Grundströmung eines Timer (wie in dem obigen Beispiel angegeben) ist eine Unterklasse von TimerTask Implementierung run() zu schaffen, was Aufgabe auszuführen irgendwann am Ende einiger Zeitdauer (oder wiederholt in einigen auftreten sollte Intervall, das Timer s auch unterstützt). Dann instanziieren Sie eine Timer und planen Sie eine Instanz dieser TimerTask Unterklasse für die Ausführung zu einer bestimmten Zeit oder nach einem bestimmten Intervall (je nachdem, welche schedule Methode von Timer Sie aufrufen, um es zu planen). Sobald diese Zeit erreicht ist oder das Intervall abgelaufen ist, wird die von Ihnen implementierte Methode run() im Hintergrundthread Timer aufgerufen. Genauere Informationen über Timer und

Sie müssen jedoch auf Fallstricke wie Race-Bedingungen achten (zum Beispiel, wenn Ihre Aufgabe war die Frage falsch zu markieren und dann Antworten deaktivieren, wenn der Benutzer antworten sollte eine Frage zwischen Ihrer Aufgabe, die es unrichtig markiert und dem Beantworten der Aufgabe, könnte Sie unerwartetes Verhalten bekommen). Dies ist eine der häufigsten Herausforderungen beim Schreiben von Multithread-Code. Wenn Ihre gesamte Programmlogik und Ihr Programmfluss einfach genug sind, kann ein sorgfältiger Entwurf der Aktionen, die die Aufgabe ausführt, in dieser Reihenfolge ausreichend sein, um diese Probleme zu vermeiden. Sie sollten jedoch mit größter Vorsicht im Umgang mit Aktualisierungen von verschiedenen Threads zu einer freigegebenen Komponente arbeiten (z. B. das Aktualisieren eines booleschen Werts, der angibt, dass die Frage von einer Zeitgeberaufgabe korrekt war oder nicht korrekt war).

Allgemeinere Multithreading wäre sicherlich verwendbar, obwohl Timer scheint nützlich, dass es spezifischer für diese besondere Art von Aufgabe ist.

Als eine (aber sehr relevant) beiseite, warne ich stark davor, eine vollständige Methode für jede einzelne Frage, stilistisch gesprochen, da es zu einer großen Menge von doppeltem oder sehr ähnlichem Code führen kann. Stattdessen kann ein Ansatz wie das Erstellen einer Klasse für Fragen (insbesondere wenn alle Ihre Fragen ein ähnliches Format haben) bevorzugt werden, um beispielsweise eine neue Frage zu erstellen, indem einfach ein Konstruktor mit Fragetext und dem richtigen Index aufgerufen wird Antworten. Ihre Frageklasse könnte eine Methode enthalten, die die Antwort in Ihrem Beispielcode überprüft, die alle Fragen (als Klasseninstanzen) haben, ohne dass Sie sie für jeden neu schreiben müssen.

Verwandte Themen