【发布时间】:2019-06-12 02:39:34
【问题描述】:
我正在制作一个 while 循环,它将每 1/3 秒左右执行一次(对于 Snake 游戏)。如果有输入,我希望循环能够处理扫描仪输入,如果没有用户输入,我希望循环执行一些默认任务(在最后一个输入方向移动蛇)。
我知道一个更简单的方法是创建一个带有事件处理程序的 javafx 程序,但是我只是想看看我是否可以在终端中为个人项目实现这种游戏。每当我在 while 循环中打开 Scanner 时,我都会将一个变量设置为默认值。如果 sc.nextLine() 存在,扫描仪将更新此变量。然后我的循环做它的事。问题是,即使 sc.nextLine() 不存在,无论我如何表达我的代码,我的循环都会等待输入。
如果我从循环中删除扫描仪,代码会在计时器上完美执行,使用默认输入,但是一旦我使用扫描仪查找用户输入,它就会暂停。
while(snek.currSnake.gameState){
if(snek.nextTurnTime - System.currentTimeMillis() > 0){
try{
TimeUnit.MILLISECONDS.sleep(snek.nextTurnTime-
System.currentTimeMillis());
}
catch(InterruptedException e){
break;
}
//This section handles how quickly each turn gets executed
}
System.out.println(snek.currSnake); //Print game board to terminal
char charInput = snek.currInput; //Update charInput to some
//default value
if(scanner.hasNext()){
charInput = scanner.nextLine().charAt(0);
}
//If there is user input, update charInput to that
if(charInput == 'w' || charInput == 'a' || charInput == 's'
|| charInput == 'd' || charInput == 'q'){ //If charInput is defined
snek.currInput = charInput;
snek.currSnake.move(charInput); //Move snake and update default value
}
snek.nextTurnTime = System.currentTimeMillis() + TURN_DELAY_VAL;
}
我希望 while 循环自行执行,如果有下一个用户输入,则运行代码,现在不是使用默认输入,而是使用用户输入的输入。
相反,每转一圈,while 循环就会暂停,等待scanner.nextLine() 为真,每次都需要用户输入。
我收到错误消息,只是预期结果与我得到的结果之间存在差距
【问题讨论】:
-
哇,这真是个好主意!所以基本上我可以设置一个 TimerTask,如果它没有在需要的时间内完成,我可以告诉它退出吗?
-
支持
ScheduledExecutorService胜过Timer和TimerTask -
经过仔细检查,计时器任务会退出整个 Java 应用程序,并且不会像您预期的那样在您的用例中工作。我添加了一个答案,我相信它会满足您的需求。
标签: java