2016-10-09 9 views
0

テキストベースのクイズを作成していますが、プレイヤーが一定の時間が経過しても質問に答えたように動作しないようにしたい違う。私は本当にこれを行う方法はわかりません。私はいくつかのアイデアを持っています:マルチスレッドとタイマー;しかし、私はどちらかを行う方法は分かりません。一定時間が経過した後にスキャナを無効にする

これらのいずれかを選択するとよいでしょうか?私の質問と

方法:

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

答えて

0

TimerまたはDelta-time loopのイベントを設定して、一定時間後に何かをすることに基づいて行うことと同じようにすることができます(この場合、質問の取得に対応します間違っています)。

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

Timerクラス(java.util.Timer)を使用してもマルチスレッドされます。このようなアプリケーションには潜在的に適しているようですが、マルチスレッドではかなりの数の落とし穴が生じる可能性があります。 Timerを作成して質問の開始時にTimerTaskをスケジュールすると、質問が間違っていることを示すフラグが設定され、今後の回答の受け入れを無効にする(または次の質問に進むなど)発生する。これは、あなたが望むアクションを実行するために抽象的なrun()メソッドを実装するTimerTaskのサブクラスを作成する必要があります(間違った質問をマークするなど)。タイマーを他のタスクに使用したいと思うかもしれません(ユーザーが質問にタイムアウトしたという事実を処理してから次のタスクに移るなど)。

Timerを使用しての基本的な流れは、(上記の例で述べたように)いくつかの時点で、または一部で繰り返しいくつかの持続時間(または終了時に発生したどのようなタスク実行するrun()を実装TimerTaskのサブクラスを作成することですインターバル、Timerもサポート)。 Timerをインスタンス化し、このTimerTaskサブクラスのインスタンスをある時間または後で実行するようにスケジュールします(scheduleメソッドのTimerに応じてスケジュールします)。その後、その時間に達するか間隔が経過すると、実装したrun()メソッドがTimerのバックグラウンドスレッドで呼び出されます。 Timerの詳細については、

などですが、競争条件などの落とし穴に注意する必要があります(たとえば、タスクが誤った質問にマークを付けて回答を無効にした場合など)あなたのタスク間の質問は間違っているとマークし、それに答えることで予期しない動作が起こる可能性があります)。これは、マルチスレッドコードを書く際の共通の課題の1つです。全体的なプログラムのロジックとフローが十分に単純な場合は、タスクが実行するアクションの順序と順序を十分に慎重に設定する必要がありますが、異なるスレッドから共有ピースへの更新を扱う際は十分注意してください(タスクがタイマータスクであったかどうかを示すブール値を更新するなど)。

Timerは、この特定の種類のタスクに固有の点で便利ですが、より一般的なマルチスレッドが確実に使用可能です。

(ただし、非常に関連性がある)を除いて、私は、文法的に言えば、大量の重複または非常に類似したコードにつながる可能性があるため、個々の質問ごとに完全な方法を書くことに強く注意します。代わりに、質問用のクラスを作成するようなアプローチ(特に、すべての質問に似た形式がある場合)が望ましいかもしれません。質問テキストと正しいインデックスのコンストラクタを呼び出すだけで新しい質問を作成できます回答。あなたの質問クラスには、すべての質問(クラスインスタンスとして)がそれぞれに対して書き直す必要なしに持っているサンプルコードの回答チェックを実行するメソッドが含まれている場合があります。

関連する問題