当前位置: 首页 > 面试题库 >

带条件的停止计时器仅在第一次工作?

宣高朗
2023-03-14
问题内容

我正在编写“谁想成为百万富翁”游戏,并且我已经完成所有设置,这只是计时器的问题。

游戏的工作方式如下:如果用户正确回答了问题,他/她便会继续前进。如果不是,则游戏结束,他们可以选择再次玩。

游戏首次运行时,一切正常,计时器执行应做的事情-从30秒开始,倒计时,显示秒数。

但是,当用户单击“再次播放”按钮时,先前的计时器将继续使用新的计时器。像这样:

-timerA在用户迷路之前还剩20秒(由a表示)。

-timerB在下次玩游戏时开始(由b表示)。

输出:20a 29b 19a 28b 18a 27b 17a 26b ....... 2a 11b 1a 10b 9b 8b 7b 6b 5b 4b 3b
2b 1b

所以这是我的计时器类CountDown:

  import java.util.Timer;
  import java.util.TimerTask;

  public class CountDown {

      static Timer timer;
      public static int seconds = 30;

      public CountDown() {
          timer = new Timer();
          timer.schedule(new DisplayCountdown(), 0, 1000);
      }

      class DisplayCountdown extends TimerTask {

          int seconds = 30;

          public void run() {

                  if (seconds == 0) {
                      timer.cancel();
                      timer.purge();
                      return;
                  }

              if (seconds > 0) {
                  PlayFrame.timer.setText("" + seconds); //jLabel used to display seconds
                  seconds--;
                  if (seconds < 30) {
                      if (PlayFrame.right == true) { //check if question was answered correctly
                          System.out.print("true"); //testing purposes
                          PlayFrame.right = false;
                          PlayFrame.showQuestion();
                          PlayFrame.startTimer();
                          seconds = 0;
                          //break;
                      }
                      else if (PlayFrame.right == false) {
                          //break;
                      }
                  }

                  else if (seconds == 0) { //if time runs out its automatic wrong answer
                      PlayFrame.wrong();
                      //break;
                  }

                  else {
                      PlayFrame.wrong();
                      PlayFrame.timer.setText(null);
                      timer = new Timer();
                      //break;
                  }
              }
              System.out.println(seconds); // for testing purposes only
          }
      }
  }

这是我的一些PlayFrame:

  import java.awt.Color;
  import java.util.Timer;

  public class PlayFrame extends javax.swing.JFrame {

      public static void wrong() {
          //determines which losing frame to show
          if (count <= 2){
              LossLevel0 L0 = new LossLevel0();
              L0.setVisible(true);
          }
          else if (count > 2 && count <= 6 && count != 6){
              LossLevel1 L1 = new LossLevel1();
              L1.setVisible(true);
          }
          else {
              LossLevel1 L1 = new LossLevel1();
              L1.setVisible(true);
          }
          //"supposed" to stop the timer
          CountDown.timer.cancel();
          CountDown.timer.purge();
      }

      public static void startTimer() {
          //creates new CountDown object and timer, also resets seconds
          CountDown countdown = new CountDown();
          CountDown.timer = new Timer();
          CountDown.seconds = 30;
      }

我认为问题可能出在我重新启动游戏时。唯一的代码是我在游戏开始之前将所有变量重置为原始状态。像这样:

    // Reset Everything
    PlayFrame.count = 0;
    PlayFrame.answer = new String();
    PlayFrame.count = 0;
    PlayFrame.right = false;
    PlayFrame.winnings = 0;
    CountDown.seconds = 30;
    CountDown.timer = new Timer();
    CountDown.timer.cancel();
    CountDown.timer.purge();

请帮忙,如果您需要更多信息,请询问!


问题答案:

解决了,谢谢链接sage88!http://albertattard.blogspot.com/2008/09/practical-example-of-
swing-timer.html

并提供有关摆动计时器的更多帮助(以供将来对此主题进行搜索)http://www.asjava.com/swing/java-timer-
tutorial/

public static void startTimer() {
    listener = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent event) {
            System.out.print("action");
            timerLabel.setText("" + seconds);
            seconds--;
            System.out.println(seconds);
            if (seconds < 0){
                System.out.print("zero");
                wrong();
            }
        }
    };
    displayTimer = new Timer(1000, listener);
    displayTimer.setInitialDelay(1);
    displayTimer.start();

    if (right == true){
        System.out.print("true");
        displayTimer.stop();
        right = false;
        seconds = 30;
        displayTimer = new Timer(10000, listener);
        displayTimer.setDelay(10000);
        displayTimer.setInitialDelay(1);
        displayTimer.start();
    }
    else if (right == null){
        System.out.print("null");
        displayTimer.stop();
        seconds = 30;
        displayTimer = new Timer(10000, listener);
        displayTimer.setInitialDelay(1);
        displayTimer.setDelay(10000);
        displayTimer.start();
    }
}


 类似资料:
  • 我正在做一个游戏,但是我在使用“相交”功能时遇到了一个问题。塞纳里奥看起来像这样;我做了一个游戏,玩家是一个长方形,目标是杀死敌人。敌人的“老板”矩形有两个“模拟”,模拟一个运动和一个攻击。这些模拟是由向量驱动的。移动是水平来回的,攻击是垂直的,一种冲锋式的交易。boss也有一个矩形的目标区域,如果被截断,“boss”将在屏幕上冲锋。现在问题来了,当我试图让它,如果球员与矩形目标区域相交,“老板”

  • 我有一个简单的文件格式,我想用jison解析器生成器解析。这个文件可以由任意顺序和数量的多个表达式组成。这是解析器的jison文件: 为了简单起见,我将文件缩短为只有字符串和文件id表达式。 我的问题是,如果第二个表达式只包含一个类似令牌的字符串,那么生成的解析器似乎只能识别一个或两个完整的表达式。例如: 文件版本: 1.0 将被解析,或者 文件版本:1.0“我的字符串” 也将被解析,但对于 文件

  • 我正在使用“pcregrep”在UNIX中实现多行搜索。我希望匹配在第一次出现时停止。 例如,如果我在文件中有以下文本: 我想打印,直到'ain'在'name'之后第一次出现。所以我只需要打印: 我正在执行: 但是,我得到的输出为:

  • 当试图弄清楚如何使某些jasmine期望语句依赖于先前的期望语句时,我发现在Jasmine 2.3.0之前,没有办法。(请参阅第一次期望失败后停止jasmine测试)但是,Jasmine 2.3.0添加了一个选项,当设置为true时将停止对第一次失败的测试。 对这个前景感到兴奋,我修改了我的conf.js以包括以下选项: 但是这对我不起作用。 在我的测试中,我有: 在上面的代码中,将尝试两个期望语

  • 问题内容: 我已将一个WAR文件部署到Tomcat服务器,该类之一将在启动时调用,然后init()方法将安排一个计时器,每5小时触发一次以执行一些任务。 我的init()代码如下所示: 我的应用程序运行没有问题,但是当我使用 /etc/init.d/tomcat7 stop 关闭Tomcat时,我检查了日志(catalina.out),它具有以下条目: 严重:Web应用程序[/ MyApplica

  • 我有一个Swing计时器(javax.swing.Timer),用于在自定义Swing组件中执行一些动画。 然而,这会导致问题——特别是,即使在所有窗口都关闭后,它似乎也会阻止应用程序终止,因为实时计时器线程。此外,当看不到动画时,最好避免计时器在隐藏对象上运行的开销。 理想情况下,我希望做到以下几点: < li >当组件隐藏时停止计时器 < li >每当组件变得可见时,重新启动计时器 这是可能的