Java:使用带有测验的计时器

时间:2011-10-26 22:20:19

标签: java

我正在尝试实施用户在测验中回答问题的时间限制。虽然我已经找到了很多关于timmers的东西,但我不知道如何将它们拼凑在一起。

我希望用户有15秒的时间来回答这个问题。如果他们及时回答,它会检查答案答案是否正确,然后询问他们是否要继续下一个问题。

如果用户在15秒内没有给出回应,那么应该说答案不正确,并让他们选择转到下一个问题。

这是我到目前为止所拥有的。

for(int i=0; i<quiz.getQuizQuestions().size(); i++){

        super.getQuestion(i);

        //While timer is less than 15 seconds

        getResponse(i, questionStart);

        //If time has run out output "You have run out of time"

        super.nextQuestion();


}

可能值得知道:

super.getQuestion(i)只是打印被问到的问题

getResponse()正在等待键盘输入。如果输入了某些内容,则会检查用户是否正确。

super.nextQuestion()询问用户是否要转到下一个问题

提前致谢

编辑:如果在将其转换为GUI时很容易实现从15开始计数的计数器,那也是一件很棒的事情。

2 个答案:

答案 0 :(得分:1)

使用ExecutorService和Future来确保我们读取一行或中断它。代码比我预期的要长一点......如果不清楚,请告诉我:

import java.util.concurrent.*;
import java.io.*;    

public class Test {
    public static void main(String[] args) throws java.io.IOException {
        Question q = new Question();
        System.out.println("You have 5 seconds: " + q.toString());

        String userAnswer = null;    
        ExecutorService ex = Executors.newSingleThreadExecutor();
        try {
          Future<String> result = ex.submit(new GetInputLineCallable());
          try {
            userAnswer = result.get(5, TimeUnit.SECONDS);
            if (Integer.valueOf(userAnswer) == q.getAnswer()){
                System.out.println("good!");
            }
            else{
                System.out.println("Incorrect!");
            }

          } catch (ExecutionException e) {
            e.getCause().printStackTrace();
          } catch (TimeoutException e){
            System.out.println("too late!");
            return;
          } catch (InterruptedException e){
            System.out.println("interrupted?");
            e.getCause().printStackTrace();
          }

        } finally {
          ex.shutdownNow();
        }
    }
}



class GetInputLineCallable implements Callable<String> {
  public String call() throws IOException {
    BufferedReader inp = new BufferedReader(new InputStreamReader(System.in));
    String input = "";
    while ("".equals(input)) {
      try {
        while (!inp.ready()) {
          Thread.sleep(100);
        }
        input = inp.readLine();
      } catch (InterruptedException e) {
        return null;
      }
    } 
    return input;
  }
}




class Question{
  int p1, p2;
  public Question(){
    p1 = 2;
    p2 = 3;
  }
  public String toString(){
    return String.format("%d + %d = ?", p1, p2);
  }
  public int getAnswer(){
    return p1+p2;
  }  
}

答案 1 :(得分:0)

    long startTime = System.currentTimeMillis();

    while(System.currentTimeMillis() - startTime < 15000){
       if(userAnswered){
          break; // if there is an answer we stop waiting
        }
       Thread.sleep(1000); // otherwise we wait 1 sec before checking again
    }

   if(userAnswered){
       goToNextQuestion();
    }
    else {
       handleTimeOut();
    }