【问题标题】:Boggle game loop logicBoggle 游戏循环逻辑
【发布时间】:2013-08-01 02:00:49
【问题描述】:

我正在编写一个控制台 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 调用按键和按键释放的解决方案,但没有奏效。

然后我尝试在游戏循环中添加对单词的检查。我添加了检查 if (word.compareTo("quit") == 0) gameActive = false。当我个人输入 quit 作为单词或拼写 quit 并使用 Robot 输入时,这都会调用 postGame()。

所以我推测了这么多:当 gameActive = false 和“时间到了!”时,gameLoop 确实终止并将程序发送到 postGame()。正在打印,因此最后一个 else 块正在计时器中适当地捕获。为什么这两者不能协同工作以正确执行(或者至少我认为它应该如何执行)我不知道。

如果有人能提供任何帮助,我们将不胜感激。提前致谢。

【问题讨论】:

    标签: timer timertask game-loop boggle


    【解决方案1】:

    我认为您需要运行两个线程才能执行此类操作(比机器人更好)。

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

    只需定义函数,您就拥有了自己的游戏。

    【讨论】:

    • 感谢洛根的建议。我会试试你的方法,看看能不能用。
    • 程序本质上会给用户 4 1 秒的睡眠时间(换句话说,4 秒的时间来完成游戏)。与不断运行程序并测试是否经过一秒钟相比,它的要求要低得多。
    • 很抱歉关于线程休眠的愚蠢问题。我现在看到这显然是您复制计时器的方式。非常感谢您对洛根的建议。我今天早上研究了它,让它与你的方法(双线程)一起工作,在弄乱了你的方法之后,让它以我原来的方式工作(线程和计时器)。非常感谢您对洛根的帮助!
    • Logan 如果您或其他任何人仍在检查这个问题,请告诉我为什么我的原始代码不起作用?我在多线程方面遇到了一些困难,这一定是因为发生了一些我不知道或我不完全理解的事情。
    • 所以我实际上弄清楚了我做错了什么洛根。你是对的。即使 gameActive 设置为 false,也没有任何 Robot 使用,它会在再次检查 while 条件之前等待用户输入。实际上,我在主线程的一个空 while 循环中等待 gameActive,有一个单独的计时器线程,并产生了第三个线程来读取用户输入。我发现任何空的while循环(例如我在主线程中的)都不会重新检查它的while条件。
    猜你喜欢
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多