Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Timer 博格尔博弈循环逻辑_Timer_Timertask_Game Loop_Boggle - Fatal编程技术网

Timer 博格尔博弈循环逻辑

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) {

我正在编写一个控制台Boggle游戏,而gameLoop逻辑并不是我所认为的那样

我的基本游戏循环方法是:

    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();
}