我正在写一个控制台Boggle游戏,但gameRoop逻辑并不是我认为的那样。
我的基本游戏循环方法是:
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调用按键和按键释放,但没有成功。
然后我试着在gameRoop中添加一个单词检查。我添加了check if(word.compareTo("quit")==0)gameActive=false。无论是当我亲自输入quit作为单词时,还是当我拼写出quit并用Robot输入时,它都会调用postGame()。
所以我推测了这么多:当gameActive=false并且"Time's Up!"正在打印时,gameRoop确实会终止并将程序发送到postGame(),因此最后一个其他块会在计时器中正确捕获。我不知道为什么这两者不能协同工作以正确执行(或者至少我认为它应该如何执行)。
如果有人能提供任何帮助,我们将不胜感激。提前谢谢。
我认为需要运行两个线程才能完成这样的操作(比robot更好)。
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();
}
只要定义函数,你就有了自己的游戏。