我正在尝试实施用户在测验中回答问题的时间限制。虽然我已经找到了很多关于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开始计数的计数器,那也是一件很棒的事情。
答案 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();
}