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


public class Boggle {
    Board board;
    Player player;
    Timer timer;
    boolean active;

    static Scanner in = new Scanner(System.in);

    public Boggle() {
        board = new Board(4);
        timer = new Timer();
    }

    public void newGame() {
        System.out.println("Please enter your name: ");
        String line = in.nextLine(); 
        player = new Player(line);
        active = true;

        board.shuffle();
        System.out.println(board);

        timer.schedule(new timesUP(), 20000);
        while(active) {
            String temp = in.nextLine();
            player.addGuess(temp);
        }
    }


    public void endGame() {
        active = false;
        int score = Scoring.calculate(player, board);
        System.out.println(score);
    }


    class timesUP extends TimerTask {
        public void run() {
            endGame();
        }
    }


    public static void main(String[] args) {
            Boggle boggle = new Boggle();
            boggle.newGame();

    }
}

我有上面的类,它应该在给定的时间长度内执行循环,然后调用实例方法。本质上,我需要 newGame() 中的循环在当前实例上调用 endGame() 之前运行一分钟左右。但是,使用 Timer 类,我不确定如何调用当前实例所需的方法,因为我无法将任何参数传递给 timertasks run 方法?

有没有一种简单的方法可以做到这一点,或者我是否以错误的方式进行此操作?(笔记:这只是一个控制台项目,没有 GUI)

==========

代码已编辑

我已按照建议将代码更改为上面的代码,它几乎按照我的预期工作,但线程似乎仍然没有正确结束。我认为 while 循环会死掉,控制权最终会回到 main 方法。有任何想法吗?

有帮助吗?

解决方案

因为 timesUP (请更改名称!)是一个内部类,它已经具有对实例的引用 Boggle 创造了它。(如果它被标记为,情况就不会是这样 static.) 如果你想创建一个实例 timesUP 与另一个实例关联,你会做类似的事情:

otherBoggle.new timesUp();

诚然,这是相当奇怪的语法:)

诚然,这并不能解决 Midhat 指出的问题 - 但这意味着您无需担心获取对外部类的引用。只需致电 endGame() 从内部 timesUP.run() 它会在适当的实例上调用它。

其他提示

使用 .val() ,不是 .attr() ,设置元素的值。

http://jsfiddle.net/mattball/jjjsf/


作为侧面笔记,这不是.attr() - 或JavaScript如何作为一种语言 - 作品。您无法在赋值语句的左侧使用函数调用。它毫无意义。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top