找出每个线程中睡觉的确切时间

时间:2018-02-15 18:01:38

标签: java multithreading swing jpanel

我正在制作蛇游戏。我有两个线程(MAIN,Snake)和我创建的每个青蛙(食物)的一个线程。青蛙能够移动,但比蛇慢(所以我能抓住它们)。事情开始变得有趣了。为了控制蛇和青蛙的运动,我这样做:

Snake.java:

public void run() {
        while (isAlive){
            move();
            try {
                Thread.sleep(delay);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
}

我让我的线程睡了一段时间。我对我的MAIN线程做同样的事情,所以重新绘制我的JPanel没有任何问题:

GameController.java:

void tick() {
        for (Frog frog : frogs) {
            if (CollisionChecker.checkFoodCollision(snake.getBody().get(0), frog)) {
                snake.grow();
                frog.respawn();
                score++;
            }
        }
        if (CollisionChecker.checkSnakeCollision(snake.getBody())){
            onStop();
        }
        try {
            Thread.sleep(snakeDelay);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
}

如果我想抓住我的青蛙,我必须让它们睡得更久,所以我这样做了:

Frog.java

public void run() {
        while (isAlive){
            try {
                Thread.sleep(snakeDelay * 3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            move();
        }
}

游戏有效,但当我发送我的项目进行代码审查时,我被告知方法 run()中的 3 是一个神奇的数字,我完全同意。我不知道该怎么办。我如何在这里管理我的线程?

编辑:好像我对什么是“神奇数字”有错误的看法。

1 个答案:

答案 0 :(得分:2)

Frog构造函数可能会使用long参数来定义frogDelay

class Frog {
    private long delay;

    public Frog(long delay) {
        this.delay = delay;
    }

    public void run() {
        Thread.sleep(delay);
    }
}

创建new Frog(calculateFrogDelay())时,此参数的值可以通过常量SHAKE_DELAYRATIO来计算:

private final long SHAKE_DELAY = 100;
private final int RATIO = 3;

private long calculateFrogDelay() {
    return SHAKE_DELAY * RATIO;
}

您可以添加在运行时更改这些值的功能 - 然后您需要侦听器来更正青蛙值。