Timer 博格尔博弈循环逻辑
我正在编写一个控制台Boggle游戏,而gameLoop逻辑并不是我所认为的那样 我的基本游戏循环方法是:Timer 博格尔博弈循环逻辑,timer,timertask,game-loop,boggle,Timer,Timertask,Game Loop,Boggle,我正在编写一个控制台Boggle游戏,而gameLoop逻辑并不是我所认为的那样 我的基本游戏循环方法是: public void gameStart() { timer.schedule(new BoggleTimerTask(1),0); gameActive = true; System.out.println(boggle.getBoggleTrayAsString()); while (gameActive) {
public void gameStart() {
timer.schedule(new BoggleTimerTask(1),0);
gameActive = true;
System.out.println(boggle.getBoggleTrayAsString());
while (gameActive) {
String word = scanner.next();
boggle.addGuess(word);
}
scanner.close();
timer.cancel();
postGame();
}
我的计时器任务类运行方法如下所示:
public void run() {
if (minutesRemaining == 4 || minutesRemaining == 3 ||
minutesRemaining == 2)
minutesRemaining--;
else if (minutesRemaining == 1 || minutesRemaining == .5)
minutesRemaining -= .5;
if (minutesRemaining == 3) {
System.out.println("3 minutes remaining.");
timer.schedule(new BoggleTimerTask(minutesRemaining),60000);
}
else if (minutesRemaining == 2) {
System.out.println("2 minutes remaining.");
timer.schedule(new BoggleTimerTask(minutesRemaining),60000);
}
else if (minutesRemaining == 1) {
System.out.println("1 minute remaining.");
timer.schedule(new BoggleTimerTask(minutesRemaining),
30000);
}
else if (minutesRemaining == .5) {
System.out.println("30 seconds remaining.");
timer.schedule(new BoggleTimerTask(minutesRemaining),
30000);
}
else {
System.out.println("Time's Up!");
gameActive = false;
}
计时器正按我想的那样倒计时。“时间到了!”也会打印出来,但是postGame()从未被调用。我最初认为问题在于主线程等待scanner.next(),因此我找到了一个解决方案,使用Robot类并使用VK_ENTER调用按键和按键释放,但这不起作用
然后我尝试在gameLoop中添加一个单词检查。我添加了检查(word.compareTo(“quit”)==0)gameActive=false。无论是当我个人输入quit作为单词,还是当我用机器人拼写quit和enter时,都会调用postGame()
所以我猜测了这么多:当gameActive=false且“时间到了!”正在打印时,gameLoop确实会终止并将程序发送到postGame(),因此最后一个else块会在计时器中正确捕获。我不知道为什么这两种方法不能协同工作来正确执行(或者至少我认为它应该如何执行)
如果有人能提供任何帮助,我们将不胜感激。提前感谢。我认为您需要运行两个线程来执行类似的操作(比robot更好)
只需定义函数,您就可以玩游戏了。谢谢Logan的建议。我会试试你的方法,看看能不能让它工作。这个程序基本上会给用户4秒钟的睡眠时间(换句话说,4秒钟完成游戏)。这比持续运行程序和测试一秒钟过去的时间要求要低得多。对于关于线程睡眠的愚蠢问题,我很抱歉。我现在明白了,这就是你复制计时器的方式。非常感谢你的建议,洛根。今天早上我做了这件事,让它和你的方法(双线程)一起工作,在搞乱了你的方法之后,让它以我原来的方式工作(线程和计时器)。非常感谢你的帮助,洛根!Logan如果你或者其他任何人还在检查这个问题,你能告诉我为什么我的原始代码不起作用吗?我在多线程方面遇到了一些困难,这一定是因为发生了一些我不知道的事情,或者是一些我不完全理解的事情。所以我实际上发现了我做错了什么Logan。你说得对。如果不使用任何机器人,即使gameActive设置为false,它将等待用户输入,然后再次检查while条件。实际上,我在主线程中的一个空while循环中等待gameActive,有一个单独的计时器线程,并生成了第三个线程来读取用户输入。我发现任何空的while循环(比如我在主线程中的while循环)都不会重新检查它的while条件。
public static void main(String[] args) {
new Thread() {
public void run() {
while(true) {
String input = new Scanner(System.in).nextLine();
doSomethingWithInput(input);
}
}
}.start();
new Thread() {
public void run() {
int time = 4;
while(time > 0) {
System.out.println(time + " seconds left.");
printGameBoard();
time--;
Thread.sleep(1000);
}
printScore();
System.exit(0);
}
}.start();
}